我正在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塔上),或者通常需要一段時間才能完成這些質量插入。
你的指數是什麼樣的?你有':Account(id)'的唯一約束或者至少一個索引嗎?您是否嘗試過使用事務端點? – jjaderberg
感謝您花時間順便寫下您的問題。 (+1) – jjaderberg
@jjaderberg謝謝。是的,:Account(id)有一個唯一的約束。我現在將會使用googling交易端點。 –