我有一个图,其中节点作为数据元素,关系表示数据流。我正在寻找一个简单的影响分析查询。让我们假设这个图:
a -> b -> c -> d -> e
b -> b
c -> b
目前,我的查询看起来像这样:
MATCH (start)-[e*1..20]->(n2) where id(start)=70039
unwind e as b
with distinct b
with id(startNode(b)) as s, id(endNode(b)) as ee
return s, ee;
然而,这个查询非常慢,而且它所花费的时间随着[e*1..N]
中深度的增加而呈指数级增长,即使结果的增长非常小。
例如,当我将N
从11
增加到12
时,执行时间从30秒增加到87秒,即使结果计数从16k增加到17k。
这告诉我,它并不像我想象的那样工作,一些节点和边可能会被遍历多次。
如何优化此查询?
详细信息:
我使用最新的neo4j和ubuntu系统,16 GB RAM和4个核心。
1条答案
按热度按时间n3ipq98p1#
你可以使用APOC(Awesome Procedures on Cypher)库中的
apoc.path.subgraphAll
来更好地控制遍历,避免多次访问节点。这应该会提高你的查询性能,因为它避免了多次访问节点和边:apoc.path.subgraphAll
过程使用传出关系从开始节点开始遍历图,最多20层。唯一性参数设置为NODE_GLOBAL
,这确保每个节点在遍历过程中只访问一次。您需要将APOC库安装到您的Neo4j示例(如果您没有)才能使用上述查询。您可以在APOC文档中找到有关安装和配置APOC的详细信息。