2013-06-22 58 views
1

我有一個樹結構,像節點(8)有兩個子節點(13)和節點(14)。 當我通過cyhper刪除節點(8)時,如何刪除所有的孩子。如何通過長度變量刪除後續節點

我這樣寫密碼:「 START r = node(8)MATCH r - [:children * 0 ..] - > d with d Match d- [x] - ()Delete d,x」

它應該工作,但實際上它只能刪除節點(8)並得到一些錯誤。 我發現實際上它試圖刪除這樣的集合。

  • --- d -------------------ř
  • 節點(8)---------- REL(16 )
  • 節點(8)---------- REL(17)
  • 節點(9)----------相對。(16)
  • 節點(10) --------- Rel(17)

cyhper刪除第一個節點(8)後,它嘗試第二次刪除節點(8)並獲取錯誤,因爲它不再存在了。

它是有線事業當我寫暗號這樣的: 「START R =節點(8)MATCH的R - [:兒童* 0 ..] - > d返回d」 它返回:

  • --- --- d
  • 節點(8)
  • 節點(8)
  • 節點(9)
  • 節點(10)

它是正確的。但是,正如我們所知,我無法刪除它們之間的關係,所以我需要使用「WITH」編寫密碼:

「START r = node(8)MATCH r - [:children * 0 .. ] - > d與d匹配d- [x] - ()返回d,x「

並且它再次得到錯誤的結果。

  • --- d -------------------ř
  • 節點(8)---------- REL(16 )
  • 節點(8)---------- REL(17)
  • 節點(9)----------相對。(16)
  • 節點(10) --------- Rel(17)

任何人都可以幫助我嗎?真的很鬱悶。 我真的很喜歡neo4j,但我發現「刪除」部分是如此艱難。 爲什麼不直接使用「強制刪除」並讓Neo4j自動刪除這樣的關係:

「START r = node(8)MATCH r - [:children * 0 ..] - > d FORCE DELETE d」

順便說一句,爲什麼不能在「刪除」部分使用不同的?

回答

2

在早期的neo4j版本中存在一個錯誤 - 我不記得是哪一個。你正在使用哪個版本?您應該可以在不存在有關現有節點的錯誤的情況下執行此類查詢。

我也同意這個語法應該更容易。這是我得到它的工作。

start n=node(8) // start at the node you want to delete 
match n-[r:children*0..]->m, n-[anyothers?]-() // find your pattern to delete, and find any other relationships coming off of n (inbound/non :children) 
foreach(x in r: delete x) // delete all the relationships for children 
delete m, n, anyothers; // delete the nodes and any other relationships 
+0

WOW,它的工作原理,太棒了! 非常感謝,希望Neo4j團隊將來會改進刪除部分。 – yades

+0

順便說一句,我正在使用2.2.0-M03, 但我已經試過1.8版本,1.9版本,他們都有同樣的問題。 – yades