检索任意长度的路径,不包括子路径

问题描述 投票:0回答:1

我正在使用一个图形数据库,在其中存储线条及其端点。端点由线包含,并且由于线可以共享端点,因此它们形成任意长度的链。这是一个简化的示例:

:point1 :isContainedBy :line1 .
:line1 :contains :point2 .
:point2 :isContainedBy :line2 .
:line2 :contains :point3 .
[...]
:lineM :contains :pointM+1

在我的图中,有多个断开的链,我需要检索所有它们。但是,我当前的 SPARQL 查询面临一些困难:

PREFIX : <http://www.example.com/#>

SELECT ?pointStart ?pointEnd
WHERE {
  ?pointStart (:isContainedBy|:contains)+ ?pointEnd .
}

此查询确实返回所有链,但它有两个主要问题:

  1. 冗余子链:结果包括所有可能的子链。例如,在上面的示例中,我不仅获得从 :point1 到 :pointM+1 的链,还获得所有中间链,例如 :point1 到 :point2、:point1 到 :point3 等。我只需要从起点到终点最长的链。
  2. 缺乏路径信息:结果仅包含起点和终点,而没有详细说明其间的路径。

(所述 SPARQL 查询按预期工作正常,我只是在寻找一种检索附加结果的方法。)

有没有一种简单的方法可以解决这些问题,可能使用一些 SPARQL 技巧?任何帮助将不胜感激!

提前致谢!

sparql graph-databases
1个回答
0
投票

SPARQL SELECT 语句返回结果表(而不是列表),因此您的结果集应该是与起点相关的点的不同结果集。这应该可以做到:

PREFIX : <http://www.example.com/#>

SELECT DISTINCT ?pointStart ?point
WHERE {
  ?pointStart (:isContainedBy/:contains)+ ?point .
  FILTER NOT EXISTS { ?line :contains ?pointStart }
}
ORDER BY ?pointStart ?point
© www.soinside.com 2019 - 2024. All rights reserved.