两个资源之间的路径

时间:2013-10-25 10:35:53

标签: sparql ontology dbpedia

是否可以计算使用SPARQL查询连接两个实例的边数?我想找到一条路。

1 个答案:

答案 0 :(得分:8)

使用SPARQL的属性路径和聚合函数计算唯一路径中的边数。例如,对于这样的数据,它包含我们关心的两条路径( a c 有两条边, d g 有三条边):

@prefix : <https://stackoverflow.com/questions/19587520/sparql-path-between-two-instance/> .

:a :p :b .  # a to c is a path of length 2
:b :p :c .  

:d :p :e .  # d to g is a path of length 3
:e :p :f .
:f :p :g . 

您可以使用类似下面的查询。请注意,我使用了特定属性:p,而不是变量。这是必要的,因为SPARQL 1.1规范中的9.1 Property Path Syntax不允许在属性路径中使用变量。

prefix : <https://stackoverflow.com/questions/19587520/sparql-path-between-two-instance/>

select ?start ?end (count(?mid) as ?length)
where {
  values (?start ?end) { (:a :c) (:d :g) }
  ?start :p+ ?mid .
  ?mid :p* ?end .
}
group by ?start ?end 

得到这样的结果:

$ sparql --query query.rq --data data.n3
------------------------
| start | end | length |
========================
| :d    | :g  | 3      |
| :a    | :c  | 2      |
------------------------

可以在以下网址找到有关此处发生的更全面的描述:

但基本的想法是,如果你有一条从?start?end的路径,那么你也可以获得一堆?mid的不同值,从?start?mid的路径以及从?mid?end的路径。您可以为?mid选择的不同值的数字(如果您允许其中一个端点,而不允许另一个端点)正好是路径的长度。