2013-10-25 52 views
3

是否可以计算将两个实例连接到SPARQL查询的边的数量?我想找到一条路。两个资源之间的路径

+0

是和不是......你想只是一个特定属性的路径?图中的个体之间只有一条路径吗? –

+0

您需要更详细地说明您的数据是什么以及您想要的结果(路径边缘列表,路径长度等)。与此同时,您可能会发现[查找属性路径中的所有步骤](http://stackoverflow.com/q/18024413/1281433)和[是否可以在SPARQL中获取RDF集合中元素的位置?] (http://stackoverflow.com/q/17523804/1281433)有帮助。 –

+0

嗯,花了我一两分钟才找到它,但你也应该看看[计算节点之间的路径长度?](http://stackoverflow.com/q/5198889/1281433)。不过,我们需要澄清一下,您是否正在寻找边数,然后找到_length_,或者如果您正在寻找实际的_path_,这是一组边。 –

回答

7

您可以使用SPARQL的属性路径和聚合函数来计算唯一路径中的边数。例如,对于这样的数据,它包含了我们所关心的两个路径(一个有两个边缘çd一起三条边):

@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选择不同值的号码(如果您允许其中一个端点并禁止其他端点)恰好是路径的长度。

+0

该属性是否必须指定?我不能这样做吗? - >?p *或?p + – user2837896

+0

@ user2837896属性_does_需要指定。我更新了我的回答。不幸的是[属性路径语法](http://www.w3.org/TR/sparql11-query/#pp-language)不允许变量。 –

+0

我不想指定属性..我想在不指定属性的情况下找到资源之间的最短路径。在java中可能吗? – user2837896