2016-03-30 27 views
0

ノードがあり、入力ノードが:s -edgeでないパス(この場合はデータベース全体)を見つけて、そのパスのすべてを削除したい場合は、:Bを削除します。Cypher:ノードをパスから削除する

これは私のテストデータベースです:

MERGE (B1:B {name:"B1"})-[:t]->(B2:B {name:"B2"})-[:t]->(B3:B {name:"B3"})-[:t]->(B4:B {name:"B4"})-[:t]->(B5:B {name:"B5"})-[:t]->(C1:D {name:"D1"}) 
MERGE (A1:A {name:"A1"})-[:s]->(B1) 
MERGE (A2:A {name:"A2"})-[:s]->(B2) 
MERGE (A3:A {name:"A3"})-[:s]->(B4) 
MERGE (A5:A {name:"A5"})-[:s]->(B5) 

5)

enter image description here

私は最後にこれですしようとしたが、それは誤りスロークエリ:

MATCH p=(n:A)-[*] ->(o:B)-[:t*]->(m:D) 
WITH NODES(p)[1..-1] AS Pspace_nodes, o, p 
MATCH o WHERE NOT()-[:s]->(o) 
FOREACH (n IN Pspace_nodes| MATCH n-[*]-() DELETE n , r) 

エラーメッセージ:

py2neo.cypher.error.statement.InvalidSyntax: Invalid use of MATCH inside FOREACH (line 4, column 29 (offset: 143)) 
"FOREACH (n IN Pspace_nodes| MATCH n-[*]-() DELETE n , r) 

これを有効な方法で表現するにはどうすればよいですか?

+0

エラーメッセージとクエリで異なる「FOREACH」節が表示されます。 – cybersam

+0

ありがとう、それを修正しました。 –

答えて

1

[EDITED]

これはあなたのために働くかもしれない:MATCHは可変長のパスを指定しているため、より大きなDBに

MATCH p=(:A)-[r*]-(:D) 
WHERE ANY (x IN NODES(p)[1..-1] WHERE x:B AND NOT()-[:s]->(x)) 
WITH REDUCE(s =[], y IN NODES(p)[1..-1]| CASE WHEN y:B THEN s + y ELSE s END) AS todo 
UNWIND todo AS node 
WITH DISTINCT node 
DETACH DELETE node; 

、これは実行に時間がかかることがあります。これが問題の場合は、妥当な上限(たとえば、[r*..5])を使用する必要があります。

WHERE句は、Bノードを持つパスをフィルタリングし、入力は:sです。 REDUCE関数は、パス内のすべてのノードBを収集します。 UNWINDは、各Bノードを別の行に配置します。 DISTINCTはすべての重複ノードを削除して、削除試行でノードを2回削除しないようにします(neo4jでエラーが発生します)。 DETACH DELETE句は、それらのノードを削除するだけでなく、ノードを削除することも許可されていないため、すべての関係も削除します。

+0

私は "(変更なし、行なし)"を取得しています。 –

+0

少し更新された回答でもう一度お試しください。 – cybersam

+0

それは動作します。しかし、他のケースでは、 'CASE'キーワードは、ケースがリストされる前に、問題の変数またはプロパティを必要とします。なぜここにいないの? –

関連する問題