我有很多三人组织如下。
:A :hasB :B
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y
:Y :hasZ :Z
所有谓词都是唯一的。
我需要编写两个SPARQL查询。
查询1将通过传递查询(类似此:A
)找到:Z
到:A :has* :Z
之间的所有谓词。输出1应如下所示。
Output 1:
--------
hasB
hasC
hasD
....
hasZ
Ouery 2将通过传递查询在:A
到:Z
之间找到三元组。输出2应如下所示。
Output 2:
--------
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y
请告诉我如何编写这些传递的SPARQL查询。
答案 0 :(得分:1)
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 .
}
请注意,所有提议的解决方案都不适用于所有类型的数据,尤其是一旦您有多个路径和/或周期。在这种情况下,您应该使用正确的图形数据库。