大家好我想知道两个节点之间是否存在关联,以及连接它们的谓词是否存在。 假设我的图表如下所示
[Uri1]
/ \
(pred:a) (pred:b)
/ \ / \
[Uri2] [Uri3] [Uri4] [Uri5]
/ \
(pred:c) (pred:d)
/ \
[Uri6] [Uri7]
\
(pred:a)
\
[Uri8]
如果查询正在查找Uri8和Uri1之间的关系,则预期结果应为
[Uri7] = pred:a
[Uri2] = pred:d
[Uri1] = pred:a
考虑节点之间的谓词(关系)可能会有所不同,也可能会有长度。
以下两点: SPARQL: is there any path between two nodes?和 Is it possible to return relationships between two objects in SPARQL? 不工作
答案 0 :(得分:1)
这些问题做的方法有效,但Is it possible to get the position of an element in an RDF Collection in SPARQL?和Finding all steps in property path中的解释可能有助于理解解决方案。如果我已正确理解您的示例,请参考以下测试数据:
@prefix : <urn:ex:>
:uri1 :a :uri2, :uri3 ;
:b :uri4, :uri5 .
:uri2 :c :uri6 ;
:d :uri7 .
:uri7 :a :uri8 .
这是查询。我们的想法是从一开始就遵循通配符路径(:uri1 )到某点?x 。然后我们从?x 到其对象?o 的链接,然后找到从?o 到的通配符路径?结束(:uri8 )。 (请注意,我使用(:|!:) 作为属性通配符;它匹配所有内容,因为每个IRI都是:或不是:< / strong>即可。)
prefix : <urn:ex:>
select ?x ?p where {
:uri1 (:|!:)* ?x .
?x ?p ?o .
?o (:|!:)* :uri8 .
}
结果就像你要求的那样:
--------------
| x | p |
==============
| :uri1 | :a |
| :uri2 | :d |
| :uri7 | :a |
--------------