2016-06-09 82 views
0

關係在一般意義上,有沒有試圖評估血緣關係的設置需要多長時間在Neo4j的時候使用的最佳做法?估計時間來設置的Neo4j

例如,我成功地運用了數據導入工具,這是我在我的2.24GB的數據庫已經有了:

IMPORT DONE in 3m 8s 791ms. Imported: 7432663 nodes 0 relationships 119743432 properties

在設置關係的準備,我設置一些指標:

CREATE INDEX ON :ChessPlayer(player_id);
CREATE INDEX ON :Matches(player_id);

然後我讓它撕裂:

MATCH (p:Player),(m:Matches) 
WHERE p.player_id = m.player_id 
CREATE (p)-[r:HAD_MATCH]->(m) 

然後,我開始意識到,我不知道怎麼甚至估計多久,設置這些關係可能需要進行設置。是否有一個「信封」的計算方法來確定這種事物的至少一個球場數字?

我明白,每個人的情況是各階層,包括軟件,硬件和所需的模式不同。但任何討論毫無疑問都是有用的,並且會加深我的(以及任何讀這個的人)的理解。

PS:FWIW,我運行Ubuntu 14.04與16GB內存和英特爾酷睿i7-3630QM CPU @ 2.40GHz的

回答

1

這裏的問題是,你不考慮交易規模。在你的例子中,所有的:HAD_MATCH關係都是在一個單一的大型交易中創建的。事務內部首先在內存中建立,然後刷新到光盤。如果交易過大,以適應你的堆你可能會看到巨大的性能下降到因爲垃圾回收,甚至OutOfMemoryExceptions

通常要限制交易規模到例如10k - 100k原子操作。

在這種情況下可能最容易做的事務批處理是使用neo4j-apocrock_n_roll過程。它使用一個暗號語句來提供要處理的數據,以及第二個用於每個與前一個批處理中模式下的結果的運行。需要注意的是apoc需要的Neo4j 3.X:

CALL apoc.periodic.rock_n_roll(
    "MATCH (p:Player),(m:Matches) WHERE p.player_id = m.player_id RETURN p,m", 
    "WITH {p} AS p, {m} AS m CREATE (p)-[:HAD_MATCH]->(m)", 
    20000) 

有一個錯誤在3.0.0和3.0.1造成這個執行不太好。所以上面的是Neo4j> = 3.0.2。

如果是在3.0.0/3.0.1使用這個作爲一種解決方法:

CALL apoc.periodic.rock_n_roll(
    "MATCH (p:Player),(m:Matches) WHERE p.player_id = m.player_id RETURN p,m", 
    "CYPHER planner=rule WITH {p} AS p, {m} AS m CREATE (p)-[:HAD_MATCH]->(m)", 
    20000) 
+0

我傻 - 忘了'apoc.periodic.rock_n_roll' CALL'後' - 固定現在基於變更請求。謝謝你。 –