使用SPARQL查询查找最短路径

Abr*_*man 5 graph sparql shortest-path graph-algorithm

我试图理解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
Run Code Online (Sandbox Code Playgroud)

有没有办法在单个查询中搜索任何长度路径?这是不可能的SPARQL?

And*_*dyS 6

SPARQL 1.1 具有属性路径,其中包括*“任意数量”的运算符。

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

PREFIX : <http://graphtheory/node/>
PREFIX node: <http://graphtheory/node/>

ASK { node:1 :hasNeighbor* node:2 }
Run Code Online (Sandbox Code Playgroud)

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

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


Abr*_*man 6

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

SPARQL 1.1具有属性路径,其中包含任意数量的*运算符.

它不告诉你路径是什么,也不告诉你最短路径的长度 - 只知道是否有这样的路径.

这样做的方法(基于AndyS,但有两个小修复)是:

PREFIX : <http://graphtheory/>
PREFIX node: <http://graphtheory/node/>

ASK { node:1 :hasNeighbor* node:2 }
Run Code Online (Sandbox Code Playgroud)

据我所知,没有使用属性路径就没有办法做到这一点.