1

node(8) に node(13) と node(14) の 2 つの子があるように、ツリー構造があります。node(8) を cyhper で削除するときに、すべての子を削除するにはどうすればよいですか。

私は cypher を次のように書きます:" 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) を削除した後、2 回目に 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 With d Match d-[x]-() Return 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 に答える