如何在 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
可变长度路径模式很昂贵,因为它们具有指数复杂度(基于路径的深度)。
[更新]
即使您感兴趣的数据库路径没有任何可变性(例如,从 A
到 E
的路径总是看起来像 A->B->C->D->E
),但也有更长的包含这些路径的路径(例如,如果 E
节点有很长的传出 USE
路径),那么没有上限的可变长度路径模式将强制 neo4j 测试所有这些传出路径。在这种情况下,如果您仍然想使用可变长度路径模式,那么您应该指定一个固定的上限,因为您知道感兴趣路径的确切长度(在本例中为 4
):
MATCH path=(:A)-[:USE*..4]->(:E) RETURN path
我想找到从叶节点(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
可变长度路径模式很昂贵,因为它们具有指数复杂度(基于路径的深度)。
[更新]
即使您感兴趣的数据库路径没有任何可变性(例如,从 A
到 E
的路径总是看起来像 A->B->C->D->E
),但也有更长的包含这些路径的路径(例如,如果 E
节点有很长的传出 USE
路径),那么没有上限的可变长度路径模式将强制 neo4j 测试所有这些传出路径。在这种情况下,如果您仍然想使用可变长度路径模式,那么您应该指定一个固定的上限,因为您知道感兴趣路径的确切长度(在本例中为 4
):
MATCH path=(:A)-[:USE*..4]->(:E) RETURN path