2013-08-06 176 views
2

我在Neo4j中做了一些錯誤的動作,現在我們有一個包含重複節點的圖。在重複對中,完整屬性集屬於該對中的第一個,並且關係全部屬於該對中的第二個。索引是node_auto_index。Neo4j:合併重複節點

節點:

Id Name Age From  Profession 

1 Bob 23 Canada  Doctor 
2 Amy 45 Switzerland Lawyer 
3 Sam 09 US 
4 Bob 
5 Amy 
6 Sam 

關係:

Id Start End Type 
1  4  6  Family 
2  5  6  Family 
3  4  5  Divorced 

我試圖避免重做整個批量導入。有沒有辦法在基於「名稱」字符串屬性的密碼中合併節點,同時保留所有屬性和關係?

謝謝!

+0

我只是重新做批量導入它肯定是更快:) –

+0

好吧,我結束了這樣做。作爲參考,我試過的查詢在兩天後仍在運行。 –

回答

1

好吧,我想我想通了:

START first=node(*), second=node(*) 
WHERE has(first.Name) and has(second.Name) and has(second.Age) and NOT(has(first.Age)) 
WITH first, second 
WHERE first.Name= second.Name 
SET first=second 

查詢仍在處理,但有這樣做的更有效的方法?

1

您在這兩套產品之間創建了一個交叉產品,這樣會很昂貴。更好的做法是進行名稱索引查找。

START first=node(*), second=node(*) 
WHERE has(first.Name) and has(second.Name) and has(second.Age) and NOT(has(first.Age)) 
WITH first, second 
SKIP 20000 LIMIT 20000 
WHERE first.Name= second.Name 
SET first=second 

而且您可能還必須對處理進行分頁。

START n=node:node_auto_index("Name:*") 
WITH n.Name, collect(n) nodes 
SKIP 20000 LIMIT 20000 
WHERE length(nodes) == 2 
WITH head(filter(x in nodes : not(has(x.Age)))) as first, head(filter(x in nodes : has(x.Age))) as second 
SET first=second 
+1

要清楚,您是否在此查詢中創建了索引查找?你能解釋它是如何工作的。 –