如何按长度变量删除后续节点

时间:2013-06-22 09:13:19

标签: neo4j cypher

我有一个树结构,就像node(8)有两个子节点(13)和节点(14)。 当我通过cyhper删除node(8)时,如何删除所有子节点。

我写这样的密码:“ START r = node(8)MATCH r - [:children * 0 ..] - > d使用d匹配d- [x] - ()删除d,x“

它应该工作,但实际上它只删除node(8)并得到一些错误。 我发现实际上它正试图删除这样的集合。

  • --- d ------------------- - [R
  • 节点(8)----------相对。(16)
  • 节点(8)----------相对。(17)
  • 节点(9)----------相对。(16)
  • 节点(10)---------相对。(17)

在cyhper删除第一个节点(8)之后,它尝试第二次删除节点(8)并因为它不再存在而得到错误。

当我写这样的密码时,这是有线的原因: “START r = node(8)MATCH r - [:children * 0 ..] - > d返回d” 它返回:

  • --- --- d
  • 节点(8)
  • 节点(8)
  • 节点(9)
  • 节点(10)

这是对的。但是正如我们所知,我无法删除它们之间的关系,所以我需要用“WITH”来编写一个密码:

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

它再次得到错误的结果。

  • --- d ------------------- - [R
  • 节点(8)----------相对。(16)
  • 节点(8)----------相对。(17)
  • 节点(9)----------相对。(16)
  • 节点(10)---------相对。(17)

任何人都可以帮助我吗?真的很郁闷。 我真的很喜欢neo4j,但我发现“删除”部分非常难熬。 为什么不使用“强制删除”并使Neo4j自动删除关系,如下所示:

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

顺便说一句,为什么不能在“删除”部分使用distinct?

1 个答案:

答案 0 :(得分: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