7

我试图了解 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 来说是不可能的吗?

4

2 回答 2

8

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

SPARQL 1.1 具有包含任意数量的 * 运算符的属性路径。

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

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

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

ASK { node:1 :hasNeighbor* node:2 }

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

于 2013-01-22T12:48:08.413 回答
6

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

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

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

ASK { node:1 :hasNeighbor* node:2 }

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

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

于 2013-01-18T09:01:25.947 回答