使用 SPARQL 1.1 过滤 RDF Collection CONSTRUCT 中的重复头绑定
FILTER duplicate head bindings in RDF Collection CONSTRUCT with SPARQL 1.1
我正在尝试使用 SPARQL 1.1 属性 路径构建完整的 RDF 集合。我看到的 属性 路径示例能够获取 rdf:first 节点,但我还没有看到能够获取整个链的示例,包括 bnodes。查询的关键部分如下所示:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX sc: <http://iiif.io/api/presentation/2#>
CONSTRUCT {?range sc:hasCanvases ?listid .
?listid rdf:first ?canvas .
?listid rdf:rest ?mid .
?mid rdf:rest ?node .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}
WHERE {values ?range {<http://some.uri>}
?range sc:hasCanvases ?listid .
values ?e { rdf:first rdf:rest }
?listid rdf:rest* ?mid .
?mid ?e ?node FILTER (?mid != ?node).
?listid rdf:first ?first .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}
除了 ?listid 节点绑定到 属性 路径中的每个 rdf:rest ?mid
对象外,它大部分都有效。
jsonld.fromRDF
方法中有一个 referencedOnce 约束,这使得这些额外的头三元组对于使用该库进行列表重建有问题。我已经尝试了各种子查询、属性 路径和过滤器,但我非常坚持这一点。可能吗?
我认为您正在寻找 rdf:rest*/rdf:first
惯用语来获取列表中的所有成员。尝试以下操作(我假设 ?listid
包含一个或多个 RDF Collection(list)):
SELECT ?node
WHERE {
values ?sequence {<http://some.uri>}
?sequence eg:hasThings ?listid .
?listid rdf:rest*/rdf:first ?node .
}
不太清楚你在问什么,但听起来你想写一个construct查询,其中包含一个存在于数据中的列表。如果您提供示例数据,并且显示您尝试使用的完整查询,事情就会容易得多,因为这样我们就可以少很多猜测。在这个假设下,让我们从一些数据开始。这里有两件事 属性 将每一个都与值列表联系起来:
@prefix : <urn:ex:>
:a :hasList (1 2 3 4 5) .
:b :hasList (6 7 8 9 0) .
这是一个检索与 :a 关联的列表并构建它的查询:
prefix : <urn:ex:>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
construct {
?mid rdf:first ?value ;
rdf:rest ?tail .
}
where {
:a :hasList ?list .
?list rdf:rest* ?mid .
?mid rdf:first ?value .
?mid rdf:rest ?tail .
}
结果:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="urn:ex:">
<rdf:Description>
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>5</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>4</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>3</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>2</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>1</rdf:first>
</rdf:Description>
</rdf:RDF>
where 部分甚至可以更简洁一些,因为您不使用 ?list 的值:
:a :hasList/rdf:rest* ?mid .
?mid rdf:first ?value .
?mid rdf:rest ?tail .
我正在尝试使用 SPARQL 1.1 属性 路径构建完整的 RDF 集合。我看到的 属性 路径示例能够获取 rdf:first 节点,但我还没有看到能够获取整个链的示例,包括 bnodes。查询的关键部分如下所示:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX sc: <http://iiif.io/api/presentation/2#>
CONSTRUCT {?range sc:hasCanvases ?listid .
?listid rdf:first ?canvas .
?listid rdf:rest ?mid .
?mid rdf:rest ?node .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}
WHERE {values ?range {<http://some.uri>}
?range sc:hasCanvases ?listid .
values ?e { rdf:first rdf:rest }
?listid rdf:rest* ?mid .
?mid ?e ?node FILTER (?mid != ?node).
?listid rdf:first ?first .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}
除了 ?listid 节点绑定到 属性 路径中的每个 rdf:rest ?mid
对象外,它大部分都有效。
jsonld.fromRDF
方法中有一个 referencedOnce 约束,这使得这些额外的头三元组对于使用该库进行列表重建有问题。我已经尝试了各种子查询、属性 路径和过滤器,但我非常坚持这一点。可能吗?
我认为您正在寻找 rdf:rest*/rdf:first
惯用语来获取列表中的所有成员。尝试以下操作(我假设 ?listid
包含一个或多个 RDF Collection(list)):
SELECT ?node
WHERE {
values ?sequence {<http://some.uri>}
?sequence eg:hasThings ?listid .
?listid rdf:rest*/rdf:first ?node .
}
不太清楚你在问什么,但听起来你想写一个construct查询,其中包含一个存在于数据中的列表。如果您提供示例数据,并且显示您尝试使用的完整查询,事情就会容易得多,因为这样我们就可以少很多猜测。在这个假设下,让我们从一些数据开始。这里有两件事 属性 将每一个都与值列表联系起来:
@prefix : <urn:ex:>
:a :hasList (1 2 3 4 5) .
:b :hasList (6 7 8 9 0) .
这是一个检索与 :a 关联的列表并构建它的查询:
prefix : <urn:ex:>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
construct {
?mid rdf:first ?value ;
rdf:rest ?tail .
}
where {
:a :hasList ?list .
?list rdf:rest* ?mid .
?mid rdf:first ?value .
?mid rdf:rest ?tail .
}
结果:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="urn:ex:">
<rdf:Description>
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:parseType="Resource">
<rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>5</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>4</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>3</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>2</rdf:first>
</rdf:rest>
<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
>1</rdf:first>
</rdf:Description>
</rdf:RDF>
where 部分甚至可以更简洁一些,因为您不使用 ?list 的值:
:a :hasList/rdf:rest* ?mid .
?mid rdf:first ?value .
?mid rdf:rest ?tail .