使用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 .
Run Code Online (Sandbox Code Playgroud)
您可以使用类似下面的查询.请注意,我使用了特定属性:p,而不是变量.这是必要的,因为SPARQL 1.1规范中的9.1属性路径语法不允许属性路径中的变量.
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
Run Code Online (Sandbox Code Playgroud)
得到这样的结果:
$ sparql --query query.rq --data data.n3
------------------------
| start | end | length |
========================
| :d | :g | 3 |
| :a | :c | 2 |
------------------------
Run Code Online (Sandbox Code Playgroud)
有关这里发生的事情的更全面的描述可以在以下位置找到:
基本的想法,不过,是,如果你从有一个路径?start来?end,那么你也有,对于一堆不同的值?mid从,路径?start到?mid和从路径?mid到?end.您可以选择的不同值的数量?mid(如果您允许其中一个端点,而不允许另一个端点)正好是路径的长度.