我最近将我的 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)
最佳答案
我的理解是 call 是查询 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() 的工作原理类似。您可以进行的每笔交易越小(接触的节点越少),批次就会变得越快。
关于Neo4J 的 APOC 插件 (3.1.3.6) 运行很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43563828/