如何在 Neo4j 中更快地进行多级路径遍历

How to make multi level path traversal faster in Neo4j

我想找到从叶节点(E) 到根节点(A) 的所有路径。 (不适用于任何特定节点,因此此处没有 id 或 filed 过滤器)

数据模型如图所示

我使用基本的 Cypher 查询来查找路径(A 到 E):

MATCH path=(:A)-[:USE*]->(:E) RETURN path

它保持 运行 并且永远不会结束。

我尝试使用以下方法获取从 C 到 E 的路径:

MATCH path=(:C)-[:USE*]->(:E) RETURN path

这是对 return 18k 路径的查询最多需要 18 秒。 我试过使用扫描,但没有改进。

我如何才能在更短的时间内将此遍历改进为 return 结果? 我需要在 4-5 秒内得到结果。

系统配置:

系统内存为32GB

存储:SSD

当前 Neo4j 会议:

堆大小: 初始12GB 最大 12GB

缓存: 12GB

数据库大小:1.6GB

如果您的数据库路径有很多可变性(例如,C 节点并不总是跟在 D 节点之后),但您知道您总是需要特定的路径模式(例如, A->B->C->D->E),那么指定一个显式模式应该会快得多:

MATCH path=(:A)-[:USE]->(:B)-[:USE]->(:C)-[:USE]->(:D)-[:USE]->(:E)
RETURN path

可变长度路径模式很昂贵,因为它们具有指数复杂度(基于路径的深度)。

[更新]

即使您感兴趣的数据库路径没有任何可变性(例如,从 AE 的路径总是看起来像 A->B->C->D->E),但也有更长的包含这些路径的路径(例如,如果 E 节点有很长的传出 USE 路径),那么没有上限的可变长度路径模式将强制 neo4j 测试所有这些传出路径。在这种情况下,如果您仍然想使用可变长度路径模式,那么您应该指定一个固定的上限,因为您知道感兴趣路径的确切长度(在本例中为 4):

MATCH path=(:A)-[:USE*..4]->(:E) RETURN path