使用SPARQL查询查找最短路径



我试图理解SPARQL查询的计算限制,我想知道如何编写一个查询来确定两个对象之间是否存在有向路径。

我知道一个特定长度的路径的方法:

SELECT ?a ?b ?c ?d
WHERE { ?a  <http://graphtheory/hasNeighbor>  ?b . 
        ?b  <http://graphtheory/hasNeighbor>  ?c .
        ?c  <http://graphtheory/hasNeighbor>  ?d .
        FILTER (?a != ?c && ?b != ?d
                && ?a = <http://graphtheory/node/1>
                && ?d = <http://graphtheory/node/2>)
      }
LIMIT 10

是否有一种方法可以在单个查询中搜索任何长度的路径?这在SPARQL中是不可能的吗?

AndyS给出了回答这个问题的所有元素,但是有一些拼写错误可能会使它们难以应用。如他所说:

SPARQL 1.1有一个属性path,它包含了任意数量的*运算符

它不会告诉你路径是什么,也不会告诉你最短路径的长度——只会告诉你是否存在这样一条路径。

要做到这一点(基于AndyS,但有两个小的修正)的方法是:
PREFIX : <http://graphtheory/>
PREFIX node: <http://graphtheory/node/>
ASK { node:1 :hasNeighbor* node:2 }

据我所知,如果不使用属性路径就无法做到这一点。

SPARQL 1.1的属性路径包含用于" any number of "的*运算符。

它不告诉你路径是什么,也不告诉你最短路径的长度——只告诉你是否存在这样一条路径。

PREFIX : <http://graphtheory/node/>
PREFIX node: <http://graphtheory/node/>
ASK { node:1 :hasNeighbor* node:2 }

(您不需要?a =?d =,您可以将值写入查询。)

path数据类型添加到语言中是未来工作的一个地方-一些实验系统已经研究了这个问题。

最新更新