neo4j Cypher -优化查询以进行影响分析

bkkx9g8r  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(263)

我有一个图,其中节点作为数据元素,关系表示数据流。我正在寻找一个简单的影响分析查询。让我们假设这个图:

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]中深度的增加而呈指数级增长,即使结果的增长非常小。
例如,当我将N11增加到12时,执行时间从30秒增加到87秒,即使结果计数从16k增加到17k。
这告诉我,它并不像我想象的那样工作,一些节点和边可能会被遍历多次。
如何优化此查询?
详细信息:
我使用最新的neo4j和ubuntu系统,16 GB RAM和4个核心。

n3ipq98p

n3ipq98p1#

你可以使用APOC(Awesome Procedures on Cypher)库中的apoc.path.subgraphAll来更好地控制遍历,避免多次访问节点。这应该会提高你的查询性能,因为它避免了多次访问节点和边:

MATCH (start)
WHERE id(start) = 70039
CALL apoc.path.subgraphAll(start, {
  maxLevel: 20, 
  relationshipFilter: ">", // Assuming all relationships are the same type
  uniqueness: "NODE_GLOBAL"
})
YIELD nodes, relationships
UNWIND relationships as rel
WITH DISTINCT rel
WITH id(startNode(rel)) as s, id(endNode(rel)) as ee
RETURN s, ee;

apoc.path.subgraphAll过程使用传出关系从开始节点开始遍历图,最多20层。唯一性参数设置为NODE_GLOBAL,这确保每个节点在遍历过程中只访问一次。
您需要将APOC库安装到您的Neo4j示例(如果您没有)才能使用上述查询。您可以在APOC文档中找到有关安装和配置APOC的详细信息。

相关问题