【问题标题】:Querying a Graph path in SPARQL在 SPARQL 中查询 Graph 路径
【发布时间】:2015-03-06 13:54:34
【问题描述】:

我正在尝试编写一个 SPARQL 查询来返回从源到目标的路径。 下面是表示数据集的 Turtle 文件。

@prefix node: <http://prism.uvsq.fr/>.
@prefix edge: <http://prism.uvsq.fr#>.
node:a edge:p node:b.
node:a edge:q node:f.
node:a edge:p node:g.
node:b edge:p node:c.
node:c edge:q node:h.
node:c edge:p node:i.
node:c edge:p node:d.
node:d edge:p node:e.
node:f edge:p node:g.
node:f edge:q node:l.
node:f edge:p node:k.
node:g edge:p node:c.
node:g edge:p node:f.
node:h edge:p node:n.
node:i edge:q node:j.
node:j edge:p node:o.
node:j edge:q node:n.
node:k edge:p node:l.
node:l edge:p node:g.
node:m edge:q node:g.
node:n edge:p node:m.

接下来的图像呈现相同的信息,以便于可视化。

到目前为止我写的查询如下:

prefix graph: <http://prism.uvsq.fr/>
prefix node: <http://prism.uvsq.fr/>
prefix edge: <http://prism.uvsq.fr#>
SELECT * FROM graph: WHERE {
   node:a (edge:p|edge:q) ?des.
   ?des (edge:p|edge:q)* node:h.
}

返回的信息只显示了解决方案的一个级别(它显示了到达目的地的可能邻居节点)。 在此先感谢您的帮助。 最好的问候

【问题讨论】:

  • 这是因为?des 只能与?node 相距一个边,因为您使用了node:a (edge:p|edge:q) ?des. 模式。你的意思是node:a (edge:p|edge:q)* ?des.(带星号)?那么?des可以是a和h之间路径上的任意节点。
  • Finding all steps in property path 可能会有所帮助。接受的答案说这是不可能的,但my answer 表明在某些情况下您实际上可以做到这一点。
  • 这似乎与getting a graph path using SPARQL 非常相似。这是课堂作业吗?
  • 我也用 * 试过了,但结果一点也不全面。我正在寻找一种方法来获得从 a 到 h 的所有路径。感谢您的链接,我将看看它们。不,这不是课堂作业,我是一名博士生,我正在寻找这种方式将其与我的工作结合起来。
  • 询问作业是可以的(尽管如果是的话,通常最好提一下)。您是否碰巧知道您的一位同事是否发布了另一个问题(大约比您早 2 小时):stackoverflow.com/q/28897701/1281433。毕竟,在数据(使用 p 和 q 作为边,节点从 a 到 o 标记)和期望的结果方面几乎是相同的。考虑到时间,很难想象这些是不相关的。

标签: rdf sparql


【解决方案1】:

SPARQL 中的属性路径不是您可以直接查询的内容,但您可以使用属性路径来帮助提取沿两个节点之间的路径的边。例如,以下查询返回从 a 到 h 的路径中的边。基本思想是使用从 a 到某个节点 u 的属性路径,该节点 u 具有到某个节点 v 的边,从该节点 v 有到 h 的路径。 values 块只是将 e 的值限制为 p 或 q。

prefix node: <http://prism.uvsq.fr/>
prefix edge: <http://prism.uvsq.fr#>

select distinct ?u ?e ?v where {
  values ?e { edge:p edge:q }
  node:a (edge:p|edge:q)* ?u .
  ?u ?e ?v .
  ?v (edge:p|edge:q)* node:h .
}
----------------------------
| u      | e      | v      |
============================
| node:a | edge:p | node:g |
| node:a | edge:p | node:b |
| node:g | edge:p | node:f |
| node:g | edge:p | node:c |
| node:f | edge:p | node:k |
| node:f | edge:p | node:g |
| node:k | edge:p | node:l |
| node:l | edge:p | node:g |
| node:c | edge:p | node:i |
| node:n | edge:p | node:m |
| node:h | edge:p | node:n |
| node:b | edge:p | node:c |
| node:a | edge:q | node:f |
| node:f | edge:q | node:l |
| node:c | edge:q | node:h |
| node:i | edge:q | node:j |
| node:j | edge:q | node:n |
| node:m | edge:q | node:g |
----------------------------

这并没有给你实际的路径,但它给你所有而且只有从 a 到 h 的路径上的边缘。从中,您可以通过将图形重新组合在一起并执行深度优先遍历来枚举路径来重建路径。

【讨论】:

  • 所以我认为到目前为止还没有办法完全支持我们的需求。你展示的技术很有趣。非常感谢您的努力和帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多