5

我最近将我的 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)
4

1 回答 1

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)

period.commit() 将按照类似的原则工作。您可以使每个事务越小(接触的节点最少),批处理将变得越快。

于 2017-05-19T17:22:42.537 回答