2014-07-24 81 views
1

我正在Cypher上使用REST API在相對較大的組中創建獨特的節點和關係。使用Cypher的FOREACH將節點數組插入到Neo4j中隨着數據的添加變得越來越慢

我的數據模式很簡單:(node1:Account {id:xx})-[:follows]->(node2:Account {id:yy})
其中Account:id是一個唯一的參數(不是新生成的一個),並具有一個約束。

我有一個添加node1的id的列表,我把它放在map和feed中作爲參數。

我使用(大多是從這裏幫助)Cypher支架查詢:

params = {nodes: [{"id": id}, {"id": id}..]} 

MATCH (node1:Account {id: 12345) 
FOREACH (n in {nodes} | MERGE(node2:Account {id: n.id}) 
MERGE (node1)-[r:FOLLOWS]->(node2)) 
SET node1.lastFetch=timestamp() 

這工作。它使用節點2的現有節點,或者根據需要創建一個節點並創建新的關係。但是我在數據庫中擁有的節點越多,它越慢。我一次增加約500個,大約需要20秒。當我第一次開始時,它幾乎是瞬間的。 DB目前擁有約16k個帳戶節點。

有沒有更有效的方法來做到這一點?我對Neo4j很新,所以我不確定什麼是好的表現。我應該期待更好的性能(它運行在舊的intel mac塔上),或者通常需要一段時間才能完成這些質量插入。

+0

你的指數是什麼樣的?你有':Account(id)'的唯一約束或者至少一個索引嗎?您是否嘗試過使用事務端點? – jjaderberg

+0

感謝您花時間順便寫下您的問題。 (+1) – jjaderberg

+0

@jjaderberg謝謝。是的,:Account(id)有一個唯一的約束。我現在將會使用googling交易端點。 –

回答

1

我想出了這個問題。我最近決定改變我的標籤的命名規則,使其更加一致。當我刪除舊標籤並添加新標籤時,我不會想到需要重新建立索引和約束條件。當我查看neo4j-shell中的模式時,我在我的舊標籤上看到了我的約束和索引。基本上我在:Account(id):ACCOUNT(id)沒有索引,工作沒有再做很多了。

我很欣賞讓我第二次看索引的方法。

相關問題