SPARQL 有一些明显的局限性,因为它不是图形查询语言。以下可能的解决方案:
如果除了 没有其他谓词has[A-Z]
:
样本数据
@prefix : <http://ex.org/> .
:A :hasB :B .
:B :hasC :C .
:C :hasD :D .
:D :hasE :E .
询问
prefix : <http://ex.org/>
select ?p
where {
values (?start ?end) { (:A :E) }
?start (<p>|!<p>)* ?v1 .
?v1 ?p ?v2 .
?v2 (<p>|!<p>)* ?end .
}
输出
---------
| p |
=========
| :hasB |
| :hasC |
| :hasD |
| :hasE |
---------
如果除了 之外还有其他谓词has[A-Z]
:
样本数据
@prefix : <http://ex.org/> .
:A :hasB :B .
:B :hasC :C .
:C :hasD :D .
:C :notHasD :D .
:D :hasE :E .
引入一个超级属性:has
:
附加数据:
@prefix : <http://ex.org/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
:hasB rdfs:subPropertyOf :has .
:hasC rdfs:subPropertyOf :has .
:hasD rdfs:subPropertyOf :has .
:hasE rdfs:subPropertyOf :has .
询问:
prefix : <http://ex.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?p
where {
values (?start ?end) { (:A :E) }
?start (<p>|!<p>)* ?v1 .
?v1 ?p ?v2 . ?p rdfs:subPropertyOf :has .
?v2 (<p>|!<p>)* ?end .
}
输出
---------
| p |
=========
| :hasB |
| :hasC |
| :hasD |
| :hasE |
---------
在属性 URI 上使用 REGEX:
prefix : <http://ex.org/>
select ?p
where {
values (?start ?end) { (:A :E) }
?start (<p>|!<p>)* ?v1 .
?v1 ?p ?v2 .
FILTER(REGEX(STRAFTER(STR(?p), STR(:)), 'has[A-Z]'))
?v2 (<p>|!<p>)* ?end .
}
请注意,所有建议的解决方案都不适用于所有类型的数据,尤其是当您有多个路径和/或循环时。在这种情况下,您应该使用适当的图形数据库。