2016-03-30 21 views
0

:s numaralı bir gelene sahip olmayan bir :B düğümün bulunduğu bir yol (bu durumda veritabanının tamamını) bulmak ve yolun tüm :B s kaldırmak. Cypher: Yoldaki düğümleri kaldırın.

Bu

benim test veritabanı:

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

Geçen çalıştı sorgu bu, ama bir hata atar:

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) 

Hata mesaj:

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) 

Bunu geçerli bir şekilde nasıl ifade edebilirim?

+0

Sizin hata mesajınız ve sorunuz, farklı bir FOREACH sözcüklerini gösterir. – cybersam

+0

teşekkürler, düzeltildi. –

cevap

1

[REDAKTE]

Bu sizin için işe yarayabilecek: Daha büyük bir DB ise

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; 

, bu MATCH değişken uzunlukta yolunu belirtir çünkü çalıştırmak için uzun zaman alabilir. Bu bir sorunsa, makul bir üst sınır kullanmalısınız (ör. [r*..5]).

B düğümü, :s ilişkisiyle gelen yolları için WHERE yan tümcelerini filtreler. REDUCE işlevi, yoldaki tüm B düğümlerini toplar. UNWIND her B düğümünü ayrı bir sıraya koyar. DISTINCT, tüm yinelenen düğümleri siler, böylece silme denemesi, bir düğümü iki kez silmeye çalışmaz (neo4j'nin bir hata üretmesine neden olur). DETACH DELETE yan tümcesi, yalnızca B düğümlerini değil, aynı zamanda tüm ilişkilerini de silmeyecaktır (aynı zamanda bunu yapmadan bir düğümü silmenize izin verilmediğinden).

+0

"(değişiklik yok, satır yok) alıyorum." –

+0

Lütfen biraz güncellenmiş cevabımla tekrar deneyin. – cybersam

+0

Bu işe yarıyor. Ancak diğer durumlarda, "CASE" anahtar sözcüğü, vakalar listelenmeden önce söz konusu değişken veya özelliğe ihtiyaç duyar. neden burada değil? –