2016-04-25 127 views
2

爲了保持我的數據庫從孤立的節點乾淨,我想刪除一個節點 - 由給定的屬性值標識 - 和每個相關的節點沒有任何其他相關節點。Cypher刪除一個節點和所有相關的節點,如果他們沒有進一步的關係

這可能嗎?目前,我這樣做:

MATCH (poi:PointOfInterest)-[r]-(allRelatedNodes) 
WHERE poi.id="X007" 
DETACH DELETE poi, r, allRelatedNodes; 

但是,刪除所有相關節點包括將連接到其他節點,如果他們不刪除的人。

有沒有辦法刪除節點和所有與其他節點沒有關係的節點?


編輯由作者

的明顯的答案是正確的。我終於解決了我的問題

MATCH (poi:Node)-[r*0..1]-(allRelatedNodes) 
WHERE poi.name = "A" 
AND size((allRelatedNodes)--()) < 2  
DETACH DELETE poi, allRelatedNodes; 

回答

2

如果使allRelatedNodes匹配可選,確保allRelatedNodes只需要poi一個關係,那麼你應該能夠僅如果它們存在刪除連接到X007的人。另外,您不需要在刪除語句中指定r,因爲DETACH負責處理此問題。

MATCH (poi:PointOfInterest) 
WHERE poi.id = "X0007" 
WITH poi 
OPTIONAL MATCH (poi)-[r]-(allRelatedNodes) 
WHERE size((allRelatedNodes)--()) = 1  
DETACH DELETE poi, allRelatedNodes 

使用Neo4j的3.0,用下面的圖開始...

Starting Sample Graph

並執行上述查詢(如下所列)的親密傳真...

MATCH (poi:Node)-[r]-(allRelatedNodes) 
WHERE poi.name = "A" 
AND size((allRelatedNodes)--()) = 1  
DETACH DELETE poi, allRelatedNodes 

我留下了這張圖。

enter image description here

如果不刪除這一切在一個查詢你也可以使用這個那個一定要照顧它。

MATCH (poi:PointOfInterest)-[r]-(allRelatedNodes) 
WHERE poi.id = "X007" 
AND size((allRelatedNodes)--()) = 1 
WITH poi, collect(allRelatedNodes) as allRelatedNodes 
DETACH DELETE poi 
WITH allRelatedNodes 
UNWIND allRelatedNodes as node 
DELETE node 
+0

這幾乎是我想要的。 – Matthias

+0

但是,當有其他節點與'allRelatedNodes'有關時,這不會刪除'poi'。無論如何,我需要刪除「poi」! – Matthias

+0

任何想法@Dave Bennett? – Matthias

相關問題