Val*_*eri 6 database rdf sparql
我正在使用芬兰司法部最近发布的 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)
Run Code Online (Sandbox Code Playgroud)
这将返回四行,三个法规,一个法规两次。这是因为该法规有两个版本,旧版本和当前版本。另外两个法规只有一个版本。
如何摆脱旧版本,以便仅获得最新版本的法规?我尝试使用类似的东西(MAX(?dv) AS ?ndv)
并按 ?stat 和 ?vers 分组,但这不起作用,因为有四个不同的版本。
编辑:让我添加一个模拟示例来说明发生的情况。
原始查询的结果如下所示:
stat | vers | dv
a | abc | x
a | cde | y(<x)
b | foo | z
c | fot | u
Run Code Online (Sandbox Code Playgroud)
我们看到法令“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
Run Code Online (Sandbox Code Playgroud)
换句话说,对于每个法规,我希望只获得具有最高或最新 dv 值的版本。
附注。欢迎您在http://yasgui.org/ 上进行测试,只需输入查询即可获得结果。
您可以使用子选择来执行此操作,如scotthenninger 的回答,但您也可以只使用过滤器来确保每个结果没有另一个可能的结果是最近的。在您的查询中,这仅意味着添加:
filter not exists {
?stat sfl:hasVersion/eli:version_date ?dv2
filter (?dv2 > ?dv)
}
Run Code Online (Sandbox Code Playgroud)
这个想法只是保留那些具有版本的结果行,以便没有具有更新日期的同一法规的另一个版本。这种方法更加灵活,因为它不需要您可以通过子选择检索的“单个最大值”;只要您可以用 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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2776 次 |
最近记录: |