2016-03-31 4 views
0

У меня есть этот тест базы данных:Cypher: Узел не найден в одном запросе

enter image description here

Я хочу, чтобы удалить этот путь с двумя +B узлами справа. Этот случай обычно может быть описан как путь, который содержит PS узлов (+B узлов также являются PS узлами, у которых нет входящего края :SOURCE. Подход, который я хочу удалить, равен (writer) (исключая), и этот узел который не имеет входящий :SOURCE края (в том числе)

за то, что у меня есть этот запрос:.

MATCH p1=(writer:A {type:'writer'})-[*]->(Q:PS)-[:TARGET*]->(T) 
WITH (Q), (writer) 
MATCH (Q) 
WHERE NOT()-[:SOURCE]->(Q) 
WITH (Q), (writer) 

MATCH p2=(writer)-[*]->(Q) 
WHERE ANY (x IN NODES(p2)[1..] WHERE x:PS AND NOT()-[:SOURCE]->(x)) 

WITH REDUCE(s = [], y IN NODES(p2)[1..] | CASE 
    WHEN y:PS THEN s + y 
    ELSE s END) AS todo 
FOREACH (z IN todo | DETACH DELETE z); 

Это первое идентифицирует упомянутый узел (ы), а затем передает их на, чтобы сделать новый выбор пути, что заканчивается на этом узле.Это все работает правильно.Что не работает, это самая последняя часть, начинающаяся с WITH REDUCE. oes не найти Q, но Q даже не встречается в этой части.

Ошибка Node <some ID> not found. Почему это? Почему он не находит узел снова и почему он даже пытается в последней части? Вырезание последней части и запрос работают так, как предполагалось до этой точки.

ответ

1

[ОБНОВЛЕНО]

Эта ошибка обычно означает, что вы пытаетесь удалить узел, который уже был удален, или удалить связь, которая имеет узел конечной точки, которая уже была удалена.

Попробуйте заменить пункт FOREACH со следующим фрагментом, который устраняет повторяющиеся узлы, прежде чем пытаться удалить их, а также удаляет отношения до узлов:

UNWIND todo AS node 
WITH DISTINCT node 
MATCH (node)-[r]-() 
WITH COLLECT(DISTINCT node) AS nodes, COLLECT(DISTINCT r) AS rels 
FOREACH(r IN rels | DELETE r) 
FOREACH(n IN nodes | DELETE n); 

Кроме того, ваш запрос, кажется, очень неэффективно. Вот более простая версия, которая включает в себя следующее исправление:

MATCH p=(:A {type:'writer'})-[*]->(:PS)-[:TARGET]->() 
WHERE ANY (x IN NODES(p)[1..-1] WHERE x:PS AND NOT()-[:SOURCE]->(x)) 
WITH REDUCE(s = [], y IN NODES(p)[1..] | CASE 
    WHEN y:PS THEN s + y 
    ELSE s END) AS todo 
UNWIND todo AS node 
WITH DISTINCT node 
MATCH (node)-[r]-() 
WITH COLLECT(DISTINCT node) AS nodes, COLLECT(DISTINCT r) AS rels 
FOREACH(r IN rels | DELETE r) 
FOREACH(n IN nodes | DELETE n); 
+0

Нет, запрос на этот узел vey показывает, что он все еще существует. Пробовал ваш код в любом случае, но такую ​​же ошибку, как и ожидалось. –

+1

Я добавил, что должна быть гораздо более простая версия вашего запроса. Это может работать лучше. Обратите внимание, что ему не нужно использовать идентификаторы узлов (например, 'Q'). – cybersam

+0

Спасибо, но теперь я получаю «Невозможно загрузить NODE с идентификатором 17049». 'MATCH (N) WHERE ID (N) = 17049 RETURN N', хотя возвращает этот точный узел, поэтому он * есть *. –