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

SPARQL query to get only results with the most recent date

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

有法规,有版本,有日期和主题。我想获取具有 "gun" 主题的最新版本。所以,我写了这个:

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)

这returns四行,用三律,一律两次。这是因为该法规有两个版本,旧版本和当前版本。其他两项法规只有一个版本。

如何删除旧版本以便我只获得最新版本的法规?我尝试使用 (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"。

有话题"gun"的属性是一节属性。返回的所有版本都有该主题。

我想得到的是这个:

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

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

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

您必须 运行 一个子 select 来计算最大日期聚合:

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 .

}

您可以使用子选择来执行此操作,如 ,但您也可以只使用过滤器来确保每个结果没有另一个可能的更新的结果。在您的查询中,这仅意味着添加:

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

我们的想法是仅保留那些具有 而不是 具有更新日期的同一法规的另一个版本的结果行。这种方法更灵活一些,因为它不需要可以通过子选择检索的 "single max-value";它可以让您根据任意标准保留结果,只要您可以用 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