选择长度为 1 的路径
属性路径 using*
查找长度为 zeor 或更大的路径。如果您想要长度正好为 1 的路径,只需删除*
:
select ?object where {
:SUB rdfs:superClassOf ?object
}
我会注意到,RDFS 仅定义rdfs:subClassOf
,而不是rdfs:superClassOf
您在查询中使用的定义。不过,我会假设这只是问题中的一个错字。我认为您想要的实际查询是:
select ?subclass where {
?subclass rdfs:subClassOf :SUB
}
选择任意长度的路径
本节中的解决方案基于对有关在 RDF 列表中查找元素位置的问题的回答。考虑以下数据:
@prefix : <urn:ex:> .
:a :p :b, :c .
:b :p :d, :e .
此查询查找链p
以及链的长度:
prefix : <urn:ex:>
select ?sub ?sup (count(?mid)-1 as ?distance) where {
?sub :p* ?mid .
?mid :p* ?sup .
}
group by ?sub ?sup
order by ?sub ?sup
$ arq --data data.n3 --query query.sparql
------------------------
| sub | sup | distance |
========================
| :a | :a | 0 |
| :a | :b | 1 |
| :a | :c | 1 |
| :a | :d | 2 |
| :a | :e | 2 |
| :b | :b | 0 |
| :b | :d | 1 |
| :b | :e | 1 |
| :c | :c | 0 |
| :d | :d | 0 |
| :e | :e | 0 |
------------------------
由于我们可以获得路径的长度,因此我们可以filter
在该长度上获得我们想要的路径。例如:
prefix : <urn:ex:>
select ?sub ?sup where {
{
select ?sub ?sup (count(?mid)-1 as ?distance) where {
?sub :p* ?mid .
?mid :p* ?sup .
}
group by ?sub ?sup
order by ?sub ?sup
}
filter( ?distance = 2 )
# filter ( ?distance > 2 ) # alternative
# filter ( ?distance < 10 ) # alternative
}
$ arq --data data.n3 --query query.sparql
-------------
| sub | sup |
=============
| :a | :d |
| :a | :e |
-------------
当您只需要小而特定长度的路径时,您可以手动扩展属性路径。例如,对于长度为 2 的路径:
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p ?sup .
}
对于数字范围,例如 1-2,您可以使用?
匹配零或一的 :
prefix : <urn:ex:>
select ?sub ?sup {
?sub :p/:p? ?sup .
}
有关属性路径的更多信息,请务必查看 SPARQL 1.1 规范中的第9 节属性路径。