我正在学习SPARQL的基础知识,最近芬兰司法部发布了RDF数据库。它包含芬兰法律数据。
有成文法,有版本,有日期和主题。我想得到最新的版本,有一个“枪”的主题。所以,我写了这个:
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”。
拥有话题“枪”的属性是“暴力”的属性。返回的所有版本都有这个主题。
我想得到的是:
stat | vers | dv
a | abc | x
b | foo | z
c | fot | u换句话说,对于每个法规,我只希望得到具有最高或最新dv值的版本。
PS。欢迎您在http://yasgui.org/进行测试,只需输入查询即可得到结果。
发布于 2016-03-24 18:12:40
您可以使用作为斯科特宁格的回答的子选择来完成这一任务,但是您也可以使用一个筛选器来确保每个结果都没有另一个可能的结果是最近的。在您的查询中,这只意味着添加:
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节的值。下面是整个查询现在的样子:
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">查询和结果
发布于 2016-03-23 16:33:26
您必须运行一个子选择来计算最大日期聚合:
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 .}
https://stackoverflow.com/questions/36181713
复制相似问题