5

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

4

1 回答 1

9

您可以使用 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 . 

您可以使用如下查询。请注意,我使用了特定的属性: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 

并得到这样的结果:

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

可以在以下位置找到对这里发生的事情的更完整描述:

然而,基本思想是,如果你有一条 from ?startto的路径?end,那么对于一堆不同的值,你也有?mid一条 from ?startto?mid和一条 from ?midto的路径?end。您可以选择的不同值的数量?mid(如果您允许一个端点,而不允许另一个端点)正是路径的长度。

于 2013-10-25T11:38:49.050 回答