Neo4J的APOC插件(3.1.3.6)运行速度非常慢

时间:2017-04-22 19:43:05

标签: neo4j neo4j-apoc

我最近将我的Neo4j升级到3.1.3,除此之外,还获得了最新的APOC插件(3.1.3.6)。

我有一些工作正常的代码,并且可以在大约一分半的时间内创建约300万个关系。但现在,它已经运行了8个多小时,并没有停止的迹象......

因为代码用于运行时没有任何问题,我希望在导致我的代码被堵塞的版本之间必须更改某些内容。

应该更改rock_n_roll(可能是apoc.periodic.commit的位置参数或其他内容)?感谢您的任何见解。

这就是我正在运行的。

CALL apoc.periodic.rock_n_roll(
  "MATCH (c:ChessPlayer),(r:Record) WHERE c.ChessPlayer_ID = r.ChessPlayer RETURN c,r",
  "CYPHER planner=rule WITH {c} AS c, {r} AS r CREATE (c)-[:HAD_RECORD]->(r)",
  200000)

1 个答案:

答案 0 :(得分:1)

我的理解是,调用是查询ChessPlayers和Records的笛卡尔积,然后尝试逐行过滤它们,然后对那些最终结果进行批量更新(这会占用大量内存,我想这个一个开放的交易是什么杀了你)。因此,如果你可以分解它以便每个事务可以触及尽可能少的节点,它应该能够更好地执行(特别是如果r.ChessPlayer被索引,因为现在你不需要加载所有它们)< / p>

CALL apoc.periodic.rock_n_roll(
  "MATCH (c:ChessPlayer) WHERE NOT EXISTS((c)-[:HAD_RECORD]->()) RETURN c",
  "MATCH (r:Record) WHERE c.ChessPlayer_ID = r.ChessPlayer WITH c,r CREATE UNIQUE (c)-[:HAD_RECORD]->(r)",
  100000)

periodic.commit()将采用类似的原则。您可以进行每次交易的较小(触摸的最少节点),批次将变得越快。