Удалить отношения, а затем добавить обратно к узлу neo4j - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел бы получить узел, удалить все исходящие отношения определенного типа, а затем добавить обратные отношения.

Проблема, с которой я столкнулся, состоит в том, что, как только я получаю узел, он все еще сохраняет свои прежние отношения, даже еслипосле удаления, вместо того, чтобы иметь 1, он удваивает все, что имеет.1-> 2-> 4-> 8 и т. Д.

Пример графика:

CREATE (a:Basic {name:'a'})
CREATE (b:Basic {name:'b'})
CREATE (c:Basic {name:'c'})
CREATE (a)-[:TO]->(b)
CREATE (a)-[:SO]->(c)

Запрос на удаление предыдущих отношений, а затем добавление новых отношений.(это всего лишь краткий пример, где на самом деле он не добавит обратно те же отношения, но, скорее всего, укажет его на другой узел).

MATCH (a:Basic {name:'a'})

WITH a
OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r

WITH a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)

WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c) 

Если я изменю CREATE на MERGE, то это решает проблему, но мне кажется странным слияние, когда я знаю, что только что удалил все отношения.Есть ли способ обновить «а» посередине запроса, чтобы он отражал изменения?Я хотел бы сохранить это в одном запросе

1 Ответ

0 голосов
/ 20 февраля 2019

Поведение, которое вы наблюдали, связано с тонким фактом, что предложение OPTIONAL MATCH сгенерировало 2 строки данных, в результате чего все последующие операции выполнялись дважды.

Чтобы заставить быть только одну строкуданных после предложения DELETE, вы можете использовать WITH DISTINCT a (вместо WITH a) сразу после предложения DELETE, например:

MATCH (a:Basic {name:'a'})

OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r

WITH DISTINCT a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)

WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...