2017-04-22 47 views
5

我最近將我的Neo4j升級到了3.1.3,並且獲得了最新的APOC插件(3.1.3.6)。Neo4J的APOC插件(3.1.3.6)運行速度很慢

我有一段可以正常工作的代碼,可以在大約一分半鐘的時間內創建約300萬個關係。但現在,它已經運行了8小時以上,並沒有顯示出停止的跡象...

因爲用於運行沒有任何問題,我希望的東西必須有導致版本之間已經改變了代碼我代碼已被borked。

是否應該更改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

以前使用的是什麼版本的neo4j和apoc? – cybersam

+0

嗨cybersam!我知道我正在運行'neo4j-community-3.0.1',但我不確定我的apoc版本是什麼:/ –

回答

1

我的理解是,呼叫查詢ChessPlayers和記錄的笛卡爾乘積,然後試圖通過行他們過濾掉行,然後做這些最終結果批量更新(這吃大量的內存,我認爲這個開放交易是什麼讓你失望)。所以,如果你可以分解它,以便每個事務可以觸及儘可能少的節點,它應該能夠大大提高性能(特別是如果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) 

periodic.commit()的工作原理類似。您可以創建每個事務的較小(最少的節點),批次將變得越快。