1

问题

我们有一个图表,其中位置由服务连接。具有公共键值的服务通过服务路径连接。我们想找到从位置 A 到位置 Z 的所有服务路径。

以下查询匹配直接从 A 到 Z 的服务和从 A 到 Z 需要一跳的服务路径:

MATCH p=(origin:location)-[:route]->(:service)-[:service_path*0..1]->
        (:service)-[:route]->(destination:location)
WHERE origin.name='A' AND destination.name='Z'
RETURN p;

并且运行良好。

但是,如果我们将搜索扩展到可能在 A 和 Z 之间经过两跳的服务路径:

MATCH p=(origin:location)-[:route]->(:service)-[:service_path*0..2]->
        (:service)-[:route]->(destination:location)
WHERE origin.name='A' AND destination.name='Z'
RETURN p;

查询永远运行。

它永远不会超时或崩溃服务器 - 它只是连续运行。

但是,如果我们将查询的可变长度部分设为双向:

MATCH p=(origin:location)-[:route]->(:service)-[:service_path*0..2]-
        (:service)-[:route]->(destination:location)
WHERE origin.name='A' AND destination.name='Z'
RETURN p;

永远运行的相同查询现在立即执行(在具有默认 Postgres 配置的开发数据库上大约 30 毫秒)。

更多信息

  • 不同版本中的行为

此问题出现在 AgensGraph 2.2dev(从 GitHub 克隆)中。在Agens 2.1.0中,第一个查询-[:service_path*0..1]->仍然可以正常工作,但是损坏的查询-[:service_path*0..2]->和在 2.2dev 中工作的版本会-[:service_path*0..2]-导致错误:

ERROR:  btree index keys must be ordered by attribute

这使我们相信问题与此提交有关,该提交已作为错误修复包含在Agens 2.1.1中

修复:使重新扫描内部扫描工作

VLE 抛出“btree 索引键必须按属性排序”,因为在某些情况下重新扫描内部扫描未正确完成。添加了回归测试来检查它。

  • 重复的路径返回,无休止

在 AgensBrowser v1.0 中,我们能够LIMIT在损坏的查询结束时获取结果。查询总是返回最大行数,但结果图非常稀疏。直接路径和一跳路径出现,但只出现一条较长的路径。

在结果集中,较短的路径按预期在单个记录中返回,但对于其余行,第一次出现的两跳路径是重复的。

如果我们返回一些集合以及路径,例如RETURN p, nodes(p) LIMIT 100,查询再次无限运行。

(有趣的是,这种行重复也发生在我们使用双向修复的稍微不同的查询中,但返回了整个预期的图。这可能值得单独发布。)

  • 一跳和两跳查询的 EXPLAIN 计划是相同的

我们无法比较 EXPLAIN ANALYZE(因为您无法 ANALYZE 永远不会完成运行的查询),但查询计划在所有查询之间完全相同 - 那些已运行和未运行的查询。

  • 增加的记录显示什么

我们将 Postgres 的日志记录级别设置为最高级别 DEBUG5,然后运行无限运行的查询。日志显示没有任何问题。

这是我们的数据模型的错误还是问题?

4

0 回答 0