3

ノードのすべてのリレーションシップ (着信およびアウトカミング) を削除したい (リレーションシップは多くの異なるノードに存在する可能性があります)

何かのようなもの :

start n=node:(1000) MATCH n<-[r]->anynode DELETE r

ここで「anynode」は、一致する「最初の」リンクされたノードとして解釈されるため、機能しません。

何か案は?

4

2 に答える 2

13

あなたがしたい:

start n=node(1000) 
match n-[r]-() 
delete r;
于 2013-01-25T02:13:43.497 に答える
0

大規模な更新アクションの一部としてすべてのリレーションシップを削除しようとすると、@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アプローチの両方で同じ効果が得られます。

于 2017-03-23T23:38:17.737 に答える