我最近将我的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)
答案 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()将采用类似的原则。您可以进行每次交易的较小(触摸的最少节点),批次将变得越快。