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

Mon*_*eck 5 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)
Run Code Online (Sandbox Code Playgroud)

Tez*_*zra 1

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

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)
Run Code Online (Sandbox Code Playgroud)

period.commit() 将按照类似的原理工作。每笔交易的规模越小(接触的节点最少),批量处理的速度就越快。