SPARQL查询仅获取最近日期的结果

时间:2016-03-23 15:02:52

标签: database sparql rdf

我正在学习芬兰司法部发布的最新RDF数据库的SPARQL基础知识。它包含芬兰法律数据。

有法规,有版本,有日期和主题。我想获得具有“枪支”主题的最新版本。所以,我写了这个:

PREFIX sfl: <http://data.finlex.fi/schema/sfl/>
PREFIX eli: <http://data.europa.eu/eli/ontology#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?stat ?vers ?dv 
WHERE { 
   ?stat rdf:type sfl:Statute .
   ?stat sfl:hasVersion ?vers .
   ?vers eli:version_date ?dv .
   ?vers eli:is_about ?top .
   ?top skos:prefLabel "Ase"@fi .

 } ORDER BY DESC(?dv)

这将返回四行,包含三个法规,一个法规两次。这是因为该法规有两个版本,旧版本和当前版本。另外两个法规只有一个版本。

如何摆脱旧版本,以便我只获得最新版本的法规?我尝试使用类似(MAX(?dv) AS ?ndv)和分组?stat和?vers的东西,但这不起作用,因为有四个不同的版本。

编辑: 让我添加一个模拟的例子来说明发生的事情。

原始查询的结果如下所示:

stat | vers | dv
 a   | abc  |  x
 a   | cde  |  y(<x)
 b   | foo  |  z
 c   | fot  |  u

我们看到法令“a”有两个版本,“abc”和“cde”,版本“abc”的dv后来是版本“cde”的dv。另外两个法规“b”和“c”各有一个版本,dvs为“z”和“u”。

具有主题“枪”的属性是vers的属性。返回的所有版本都有该主题。

我想得到的是:

stat | vers | dv
 a   | abc  |  x
 b   | foo  |  z
 c   | fot  |  u

换句话说,对于每个法规,我希望只获得具有最高或最新dv值的版本。

PS。欢迎您在http://yasgui.org/进行测试。只需输入查询即可获得结果。

2 个答案:

答案 0 :(得分:4)

您可以使用子选项scotthenninger's answer来执行此操作,但您也可以使用过滤器来确保每个结果都没有其他可能更新的结果。在您查询中,这只是意味着添加:

filter not exists {
  ?stat sfl:hasVersion/eli:version_date ?dv2
  filter (?dv2 > ?dv)
}

这个想法只是保留那些版本的结果行,使得具有更新日期的同一法规的另一版本。这种方法更灵活一点,因为它不需要单个最大值&#34;您可以通过子选择检索;它可以让你根据任意标准保存结果,只要你能用SPARQL表达它们。

我在?stat sfl:hasVersion / eli:version_date?dv2 中使用了属性路径,而不是更长的?stat sfl:hasVersion?vers2。 ?vers2 eli:version_date?dv2 因为它有点短,我们并不真正关心?vers2 的价值。以下是整个查询现在的样子:

PREFIX sfl: <http://data.finlex.fi/schema/sfl/>
PREFIX eli: <http://data.europa.eu/eli/ontology#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?stat ?vers ?dv 
WHERE { 
   ?stat rdf:type sfl:Statute .
   ?stat sfl:hasVersion ?vers .
   ?vers eli:version_date ?dv .
   ?vers eli:is_about ?top .
   ?top skos:prefLabel "Ase"@fi .
   filter not exists {
      ?stat sfl:hasVersion/eli:version_date ?dv2
      filter (?dv2 > ?dv)
   }
 } ORDER BY DESC(?dv)

Query and Results

答案 1 :(得分:3)

你必须运行一个子选择来计算最大日期聚合:

PREFIX sfl: <http://data.finlex.fi/schema/sfl/>
PREFIX eli: <http://data.europa.eu/eli/ontology#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?stat ?vers ?dv ?max 
WHERE { 
   ?stat rdf:type sfl:Statute .
   ?stat sfl:hasVersion ?vers .
   {  SELECT  (max(?dv) AS ?max) 
      WHERE {
          ?stat rdf:type sfl:Statute .
          ?stat sfl:hasVersion ?vers .
          ?vers eli:version_date ?dv .
      }
   }
   ?vers eli:version_date ?max .
   ?vers eli:is_about ?top .
   ?top skos:prefLabel "Ase"@fi .

}