ノードのすべてのリレーションシップ (着信およびアウトカミング) を削除したい (リレーションシップは多くの異なるノードに存在する可能性があります)
何かのようなもの :
start n=node:(1000) MATCH n<-[r]->anynode DELETE r
ここで「anynode」は、一致する「最初の」リンクされたノードとして解釈されるため、機能しません。
何か案は?
あなたがしたい:
start n=node(1000)
match n-[r]-()
delete r;
大規模な更新アクションの一部としてすべてのリレーションシップを削除しようとすると、@eve-freeman によるソリューションを使用して問題が発生しました (つまり、既存のリレーションシップを削除してから新しいリレーションシップを作成し、ノード プロパティを更新します)。
MATCH (n:Node { uuid: '1' })
OPTIONAL MATCH (n)-[r]-()
DELETE r
WITH n
MATCH (f:Foo { uuid: '2' })
CREATE (n)-[:LIKES]->(f)
WITH n
MATCH (b:Bar { uuid: '3' })
CREATE (n)<-[:LOVES]-(b)
SET n.name = 'Howard'
RETURN n
何らかの理由で、重複したエントリが作成されました (これが発生する理由を知りたいと思います)。
"n"
{"name":"Howard","uuid":"1"}
{"name":"Howard","uuid":"1"}
Set 2 properties, deleted 2 relationships, created 4 relationships, started streaming 2 records after 6 ms and completed after 6 ms.
以下の(COLLECT
そしてその後FOREACH
)を使用するとうまくいくようです:
MATCH (n:Node { uuid: '1' })
OPTIONAL MATCH (n)-[r]-()
WITH n, COLLECT (r) AS rels
FOREACH (r IN rels | DELETE r)
WITH n
MATCH (f:Foo { uuid: '2' })
CREATE (n)-[:LIKES]->(f)
WITH n
MATCH (b:Bar { uuid: '3' })
CREATE (n)<-[:LOVES]-(b)
SET prd.name = 'Howard'
RETURN n
戻り値:
"n"
{"name":"Howard","uuid":"1"}
Set 1 property, deleted 2 relationships, created 2 relationships, started streaming 1 record after 3 ms and completed after 3 ms.
更新 (2020 年 8 月 14 日):
重複したエントリを作成しました
これは正しくありません。実際には重複するエントリは作成されず、結果が重複するだけです。ただし、 と の両方の関係の複製が作成され(n)-[:LIKES]->(f)
ます(n)<-[:LOVES]-(b)
。
これは、 と他のノードの間に複数の既存の関係が存在することが原因(n)
です (上記のシナリオで(n)
は、他の 2 つのノードとの関係がありました)。
に続いてOPTIONAL MATCH (n)-[r]-()
、クエリは 2 つの行を処理します: 一致した関係ごとに 1 つです (各行には(n)
ノード自体も含まれます)。
DELETE r
次に、各行に含まれる関係を削除します。
このWITH n
コマンドでn
は、リレーションシップが削除されても 2 行の結果が表示されるため、各行には(n)
ノードのみが含まれます (各行で同じです)。
これにより、各行に対して後続のコマンドが実行され、その結果、重複した関係が作成され、結果が重複します。
解決策は、行の削除後に個別の行のみが引き継がれるようにすることです。これはWITH DISTINCT n
、たとえばを使用して実現されます。
MATCH (n:Node { uuid: '1' })
OPTIONAL MATCH (n)-[r]-()
DELETE r
WITH DISTINCT n
MATCH (f:Foo { uuid: '2' })
CREATE (n)-[:LIKES]->(f)
WITH n
MATCH (b:Bar { uuid: '3' })
CREATE (n)<-[:LOVES]-(b)
SET n.name = 'Howard'
RETURN n
これと上記のCOLLECT
/FOREACH
アプローチの両方で同じ効果が得られます。