【问题标题】:Cypher Query Take long time to execute to find end nodeCypher Query 需要很长时间才能找到结束节点
【发布时间】:2026-02-06 22:50:01
【问题描述】:

实际上,当我运行我的查询时,没有得到任何结果,甚至是异常或错误。然后查询继续运行并产生死锁。

我正在使用neo4j

MATCH p=(a:player{id:"500025"})-[:ADDRESS*]->(b:player)
WHERE NOT ((b)-[:ADDRESS]->()) AND (b.playerId = a.playerId)
WITH relationships(p) AS consRel, length(p) AS size, nodes(p) AS consAct
RETURN DISTINCT consAct AS activities,  consRel AS relationships

【问题讨论】:

  • 查询正在运行,但需要很长时间才能执行,然后在一小时后陷入僵局
  • 虽然我的回答是一个合理的猜测,但您需要提供更多信息才能让其他人做出更明智的回答。请提供有关您的数据模型的信息,并且(在您的 var-length 关系上添加合理的上限之后)执行查询的 PROFILE,并在展开所有计划元素之后(右下角的双向下箭头按钮)结果窗格)将查询计划添加到您的描述中。

标签: neo4j neo4j-ogm


【解决方案1】:

在你的可变长度关系上添加一个上限,很可能是可能的路径数量猛增,并且比数据库可以处理的工作多得多(你可能还想检查你的内存配置设置,以防堆或页面缓存太低了)。

您可以查看正在构建的路径数:

MATCH p=(a:player{id:"500025"})-[:ADDRESS*..10]->(b:player)
WHERE NOT ((b)-[:ADDRESS]->()) AND (b.playerId = a.playerId)
RETURN count(p)

查看计数如何随着您增加 var-length 关系的上限而增加。随着上限的增加,路径的数量很可能会达到数百万或更多。您可能应该选择一个合理的上限并坚持下去。

【讨论】:

  • 实际上我需要找到结束节点 p=(a:player{id:"500025"})-[:ADDRESS*..10]->(b:player) 所以我使用了这个 p =(a:player{id:"500025"})-[:ADDRESS*]->(b:player)
  • 我的配置内存很高
  • 重点是要说明这种方法可能不可行。请在增加上限时观察计数。然后你可能会看到(如果我是对的)如果没有上限,这个查询可能永远无法完成。
  • :player(playerId) 在你的图表中是唯一的吗?如果没有,对于给定的玩家a,有多少个 :player 节点具有相同的playerId
  • 实际上我在 neo4j 中总共有 4000 多个数据