两个资源之间的路径

use*_*896 4 ontology sparql dbpedia

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

Jos*_*lor 8

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

@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(如果您允许其中一个端点,而不允许另一个端点)正好是路径的长度.