我试图了解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?
答案 0 :(得分:6)
AndyS给出了回答这个问题的所有元素,但是有一些拼写错误可能会让它们难以应用。正如他所说:
SPARQL 1.1具有属性路径,其中包含任意数量的*运算符。
它不告诉你路径是什么,也不告诉你最短路径的长度 - 只知道是否有这样的路径。
这样做的方法(基于AndyS,但有两个小修正)是:
PREFIX : <http://graphtheory/>
PREFIX node: <http://graphtheory/node/>
ASK { node:1 :hasNeighbor* node:2 }
据我所知,没有使用属性路径就无法做到这一点。
答案 1 :(得分:4)
SPARQL 1.1有property paths,其中包含*
运算符,用于“任意数量”。
它不告诉你路径是什么,也不告诉你最短路径的长度 - 只知道是否有这样的路径。
PREFIX : <http://graphtheory/node/>
PREFIX node: <http://graphtheory/node/>
ASK { node:1 :hasNeighbor* node:2 }
(您不需要?a =
和?d =
,您可以将值写入查询。)
在语言中添加path
数据类型是未来工作的场所 - 一些实验系统已经开始研究这个问题。