2014-10-27 70 views
1

我有一個像下面的場景:Neo4j的寫入性能提高

CREATE (p:Person{guid:1}) 
CREATE (b1:Book{guid:1}) 
CREATE (b2:Book{guid:2}) 
CREATE (b3:Book{guid:3}) 

MATCH (p:Person{guid:1}),(b1:Book{guid:1}) CREATE (p)-[:READ]->(b1) 
MATCH (p:Person{guid:1}),(b2:Book{guid:2}) CREATE (p)-[:READ]->(b2) 
MATCH (p:Person{guid:1}),(b3:Book{guid:3}) CREATE (p)-[:READ]->(b3) 

目前,上述暗號查詢順序運行。我需要提高寫操作的性能。

我認爲p,b1,b2,b3的創建可以並行發生。一旦完成,p和b1,b2和b3之間的連接可以並行發生。 此外,我認爲上述查詢可以在一個批處理而不是單獨的寫入操作。

我正在使用neo4jphpnode-neo4j

我認爲我們有Transactional Cypher HTTP endpointBatch operations。這些是否提高了寫入性能?哪種情況對於以上情況更好?

看起來像neo4jphp支持批處理和密碼處理事務。但不確定是否有可能在node-neo4j中實現批處理/密碼處理事務。

回答

1

您應該使用paramterized Cypher爲了消除解析語句和建立查詢計劃的開銷。

在你的情況下,語句可以改爲:

MERGE (p:Person{guid:{personGuid}}) 
MERGE (b:Book{guid:{bookGuid}}) 
CREATE (p)-[:READ]->(b) 

和供應作爲參數:

{ "personGuid": 1, "bookGuid": 1 } 
{ "personGuid": 1, "bookGuid": 2 } 
{ "personGuid": 1, "bookGuid": 3 } 

一定要具有指標:

CREATE INDEX ON :Person(guid) 
CREATE INDEX ON :Book(guid) 

使用事務端點嘗試將〜10k-50k基本操作合併到一個事務中以在內存之間具有良好平衡消費和交易開銷。

+0

非常感謝。我還有一個疑問,我的寫查詢如下所述:https://onedrive.live.com/redir?resid=879CBF0D0A286E6D%21113如何組合這些查詢並進行單個寫入操作? – 2014-11-25 19:14:32