2016-09-20 54 views
0

我有兩個不同的節點,標籤爲父母。這些節點都與hasParents關係有關。有400萬個類節點,700K個父節點。我想創建一個兄弟類節點之間的關係。我做了以下查詢:在Cypher中加速合併操作

Match (A:Class)-[:hasParents]-> (B:Parents) <-[:hasParents]-(C:Class) Merge (A)-[:Sibling]-[C] 

此查詢需要年齡才能完成。我已在class_idparent_id的索引ClassParents節點的財產。我正在使用Neo4j版本2.1.6。任何建議加快這一點。

回答

0

首先,索引不會幫助查詢,因爲屬性在查詢中的任何地方都沒有引用。

對於700K Parent節點和4M Class節點,每個父節點平均有5.7個類。由於一個父母下有5個班級,所以有15個關係,因此將有超過10M的關係爲整個圖形創建。

這就是很多對於一個事務,你幾乎肯定會遇到OutOfMemory錯誤。

爲了避免這種情況,您應該將更改批量分成幾個較小的事務。

我會使用標記標籤來管理進度。首先,標記所有家長:

MATCH (p:Parent) SET p:ToProcess 

然後,反覆選擇仍然要處理的節點的子集,並連接兄弟姐妹:

MATCH (p:ToProcess) 
REMOVE p:ToProcess 
WITH p 
LIMIT 1000 
OPTIONAL MATCH (p)<-[:hasParents]-(c:Class) 
WITH p, collect(c) AS children 
FOREACH (c1 IN children | 
    FOREACH (c2 IN filter(c IN children WHERE c <> c1) | 
     MERGE (c1)-[:Sibling]-(c2))) 
RETURN count(p) 

由於查詢返回父母的數被處理,你只需重複它直到它返回0.在這一點上,父母沒有ToProcess標籤了。

+0

我跑了最後一小時的查詢。我沒有在我的數據庫中看到任何「兄弟」關係。 –

+0

使用「LIMIT」執行一次查詢不會在1小時內返回?對於一位家長,您是否患有上百種病理病例?然後嘗試減少限制到100甚至10。 –