2016-11-02 10 views
1

我有2個查詢中的Neo4jNeo4j的創建與個別報表

MERGE (f:Foo {id:1}) 
MERGE (b:Bar {id:1}) 
with f,b 
FOREACH (i IN range(0,999) | create (f)-[:Qux]->(b)); 

新增2個標籤一對多關係比循環更慢,創建2個節點,設置2個屬性,創建1000間的關係,聲明39執行女士。

MERGE (f:Foo {id:1}) 
MERGE (b:Bar {id:1}) 
with f,b 
CREATE (f) - [:Qux] -> (b) 
CREATE (f) - [:Qux] -> (b) 
... (1000 times) 
CREATE (f) - [:Qux] -> (b) 

新增2個標籤,創建2個節點,設置2個屬性,創建1000間的關係,在8301毫秒執行的語句。

爲什麼創建與語句的關係比使用循環慢得多?

我希望能夠一次創建多個關係,但由於我想在每個個人關係中包含數據,所以循環不合適。我怎麼能這樣做,快速沒有使用循環。我假設我的語法有一些錯誤的假設。

注:我清除了圖運行的每個這些

回答

2

你絕對要使用迭代循環仍然之前,因爲那時DB只需要分析一個CREATE聲明,並重新使用它(迭代是Java原生的,所以很容易翻譯請求以迭代到快速查詢)。如果您需要爲每個關係分配屬性,請展開屬性列表而不是RANGE()

UNWIND {r_props} AS r_prop 
CREATE (f) - [r:Qux] -> (b) 
SET r = r_prop 

或者,如果你需要計算每個客戶關係基礎上的查詢性能,放鬆的範圍,你可以做的每個關係的全套Cypher支架操作(MATCH等):

UNWIND range(0, 999) AS i 
CREATE (f) - [r:Qux] -> (b) 
MATCH (n:OtherNode {id: i}) 
SET r = PROPERTIES(n) 

使用FOREACH很方便,但可以限制。不管怎樣,你仍然需要一個迭代循環,因爲它總是會更快解釋neo4j

+0

那麼額外的時間基本上來自查詢解析? –

+0

不僅僅是解析,執行結果代碼和內存更輕也會更快,因爲如果將查詢手動轉換爲Java,情況就會如此。規劃人員不會選擇代碼的迭代方式,因此您將失去優化的所有潛力。 –

+0

好酷生病給我一個嘗試 –