2016-03-08 69 views
1

我有一個Neo4j的分貝〜250M節點(社區版,V2.3.2),我需要運行一個查詢,將遍歷所有節點和更新屬性。這不是我的日常查詢的一部分,但一次性的維護任務,我必須跑。更新所有節點的圖形

我可以很容易地用Cypher表達它,但它看起來像Neo4J試圖在內存中保存所有節點,然後執行我的SET操作,導致它耗盡內存,甚至更糟 - 將整個JVM放入不斷的GC循環。任何機會,我可以讓它運行在一個foreach循環,一次在一個節點上運行?

我的Cypher查詢將是:

MATCH (n:MyNode) WHERE NOT HAS (n.newColumn) SET n.newColumn=n.c1+n.c2

如果它運行了大量的時間,我不介意,只是它不會崩潰的服務器本身。如果Cypher不是這項任務的最佳工具,我也可以使用其他API。

而且在更普遍的 - 什麼時候你需要在你的Neo4j DB經營的是「全圖形掃描」查詢的最佳做法是什麼?

謝謝!

回答

4

這將導致需要建立在內存中第一承諾時向沖洗光盤之前,一個巨大的交易。

這裏最好的做法是limit交易的範圍,並調用語句多次:

MATCH (n:MyNode) 
WHERE NOT HAS (n.newColumn) 
WITH n LIMIT 10000 
SET n.newColumn=n.c1+n.c2 
RETURN count(n) 

運行該語句,直到你回來的0

結果要自動化的過程你可以使用apoc proceduresapoc.periodic.iterate()這樣的

call apoc.periodic.iterate(
'MATCH (n:MyNode) WHERE NOT exists(n.newColumn) RETURN n', 
'SET n.newColumn=n.c1+n.c2', {batchSize:10000,iterateList:true,parallel:true} 
);