【问题标题】:Finding shortest path with SPARQL query使用 SPARQL 查询查找最短路径
【发布时间】:2013-01-17 21:57:45
【问题描述】:

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

【问题讨论】:

  • 嗨!我正在寻找类似的解决方案,以确定两个节点之间的最短路径长度。你能找到任何解决方案吗?甚至可能使用广度优先或深度优先搜索算法?

标签: graph sparql graph-algorithm shortest-path


【解决方案1】:

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

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

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

执行此操作的方法(基于 AndyS,但有两个小修复)是:

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

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

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

【讨论】:

    【解决方案2】:

    SPARQL 1.1 具有 property paths,其中包括用于“任意数量”的 * 运算符。

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

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

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

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

    【讨论】:

    • 谢谢,这清理了我上面很多方法。您的解决方案中的一个小问题是 PREFIX 节点:应该是 graphtheory/node> (我相信)。进行此更改后,如果节点 1 和 2 之间存在边,则查询返回 true,但如果存在路径但没有边,则查询返回 false。
    • 为了让查询在有路径但没有边时返回真,我在 :hasNeighbor 的末尾添加了 * 运算符,即 "ASK { node:1 :hasNeighbor* node:2 } ”。没有属性路径可以做到这一点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多