是否可以计算使用SPARQL查询连接两个实例的边数?我想找到一条路。
答案 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
选择的不同值的数字(如果您允许其中一个端点,而不允许另一个端点)正好是路径的长度。