问题
我们有一个图表,其中位置由服务连接。具有公共键值的服务通过服务路径连接。我们想找到从位置 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,然后运行无限运行的查询。日志显示没有任何问题。