SPARQL是连接两个对象的路径?

时间:2016-02-15 11:30:34

标签: sparql

大家好我想知道两个节点之间是否存在关联,以及连接它们的谓词是否存在。 假设我的图表如下所示

                    [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? 不工作

1 个答案:

答案 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 |
--------------