2016-03-30 5 views
0

Я хочу найти путь (в данном случае всю базу данных), где есть узел :B, у которого нет входящего :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

[Изменено]

Это может работать для вас:

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; 

В большой БД, это может занять много времени, чтобы работать, потому что MATCH указывает путь переменной длины. Если это проблема, вы должны использовать разумную верхнюю границу (например, [r*..5]).

Фильтры WHERE для путей с узлом B без входящей связи :s. Функция REDUCE собирает все узлы B в пути. UNWIND помещает каждый узел B в отдельную строку. DISTINCT удаляет все повторяющиеся узлы, чтобы попытка удаления не пыталась дважды удалить узел (что приводит к тому, что neo4j генерирует ошибку). Предложение DETACH DELETE не только удалит те узлы B, но также и все их отношения (поскольку вам не удастся удалить узел, не делая этого).

+0

Я получаю "(без изменений, без строк)". –

+0

Повторите попытку с моим слегка обновленным ответом. – cybersam

+0

Это работает. Но в других случаях ключевому слову 'CASE' нужна переменная или свойство, о которых идет речь, после того, как они перечислены. почему не здесь? –

Смежные вопросы