首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARQL查询,只获得最近日期的结果

SPARQL查询,只获得最近日期的结果
EN

Stack Overflow用户
提问于 2016-03-23 15:02:51
回答 2查看 4.4K关注 0票数 6

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

有成文法,有版本,有日期和主题。我想得到最新的版本,有一个“枪”的主题。所以,我写了这个:

代码语言:javascript
复制
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进行分组,但这不起作用,因为有四个不同的版本。

编辑:让我添加一个模拟示例来说明发生了什么。

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

代码语言:javascript
复制
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”。

拥有话题“枪”的属性是“暴力”的属性。返回的所有版本都有这个主题。

我想得到的是:

代码语言:javascript
复制
stat | vers | dv
 a   | abc  |  x
 b   | foo  |  z
 c   | fot  |  u

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-24 18:12:40

您可以使用作为斯科特宁格的回答的子选择来完成这一任务,但是您也可以使用一个筛选器来确保每个结果都没有另一个可能的结果是最近的。在您的查询中,这只意味着添加:

代码语言:javascript
复制
filter not exists {
  ?stat sfl:hasVersion/eli:version_date ?dv2
  filter (?dv2 > ?dv)
}

这样做的目的只是为了只保留那些结果行,这些结果行具有一个版本,这样就没有另一个版本的同一法规具有更近的日期。这种方法更灵活一些,因为它不需要可以通过子选择检索的“单个最大值”;只要可以用SPARQL表示结果,它将允许您根据任意的标准保持结果。

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

代码语言:javascript
复制
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)

+?dv) +++} +}+ORDER+BY+DESC(?dv)&contentTypeConstruct=text/turtle&contentTypeSelect=application/sparql-results+json&endpoint=http://ldf.fi/finlex/sparql&requestMethod=POST&tabTitle=Query&headers={}&outputFormat=table">查询和结果

票数 5
EN

Stack Overflow用户

发布于 2016-03-23 16:33:26

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

代码语言:javascript
复制
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 .

}

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36181713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档