1

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

我这样写密码:“START r=node(8) MATCH r-[:children*0..]-> d With d Match d-[x]-() Delete d,x”

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

  • ---d-------r
  • 节点(8)---------Rel(16)
  • 节点(8)---------Rel(17)
  • 节点(9)---------Rel(16)
  • 节点(10)---------Rel(17)

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

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

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

这是正确的。但正如我们所知,我不能删除它们与它们的关系,所以我需要用“WITH”写一个密码:

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

它再次得到错误的结果。

  • ---d-------r
  • 节点(8)---------Rel(16)
  • 节点(8)---------Rel(17)
  • 节点(9)---------Rel(16)
  • 节点(10)---------Rel(17)

谁能帮我?真的很郁闷。我真的很喜欢 neo4j,但我发现“删除”部分太难了。为什么不直接使用“强制删除”并让 Neo4j 自动删除关系,就像这样:

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

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

4

1 回答 1

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
于 2013-06-23T04:49:46.637 回答