是否可以通过 SPARQL 查询计算连接两个实例的边数?我想找到一条路。
问问题
3614 次
1 回答
9
您可以使用 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 属性路径语法不允许属性路径中的变量。
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 |
------------------------
可以在以下位置找到对这里发生的事情的更完整描述:
- 计算节点之间的路径长度?(实际上是查看树中的路径)
- 查找属性路径中的所有步骤的答案(请注意,接受的答案说您不能这样做,但链接的答案表明您实际上可以);和
- Is it possible to get the position of an element in an RDF Collection in SPARQL?.
然而,基本思想是,如果你有一条 from ?start
to的路径?end
,那么对于一堆不同的值,你也有?mid
一条 from ?start
to?mid
和一条 from ?mid
to的路径?end
。您可以选择的不同值的数量?mid
(如果您允许一个端点,而不允许另一个端点)正是路径的长度。
于 2013-10-25T11:38:49.050 回答