Сайфер удаляет узел и его дочерний узел на основе условия - PullRequest
0 голосов
/ 03 декабря 2018

Я недавно начал использовать Neo4j (версия 3.4.1) и до сих пор изучаю нюансы.У меня есть следующие отношения узла в моем приложении.enter image description here

Я пытаюсь добиться следующего:

Я могу удалить узлы C1 или C2.Я также могу удалить их соответствующие отношения (например, HAS_X или HAS_Y).

Однако, когда я удаляю и C1, и C2, узел L1 и другие связанные с ним узлы (M1, M2 и M3) становятся сиротами.Следовательно, я хочу, чтобы всякий раз, когда я удаляю C1 или C2, если это единственный узел, имеющий отношение HAS_Y с узлом L1, то в этом случае узел L1 и связанные с ним узлы (M1, M2 и M3) также должны быть удалены,Если это не единственный узел, имеющий отношение HAS_Y с L1, в этом случае мы просто удаляем этот конкретный узел (т.е. C1 / C2).Узел L1 и остальные узлы остались нетронутыми.Узлы U1 и U2 остаются незатронутыми в обоих сценариях.

Я не уверен, как мне добиться этого с помощью одного запроса шифра.

Примечание: Мне удалосьдостичь моей цели, выполнив 2 отдельных запроса (1 для удаления узла C1 / C2 и еще один для удаления потерянного узла L1).Тем не менее, он не самый эффективный, так как мне приходится совершать две поездки в дб.

Может ли кто-нибудь дать мне информацию о том, как мне справиться с этой задачей?Я ищу решение для Cyper-запросов (я избегаю процедур APOC atm, так как я слышал, что оно требует некоторой модификации конфигурации neo4j db)

С уважением,

V

1 Ответ

0 голосов
/ 03 декабря 2018

Вы должны быть в состоянии сделать это только с Cypher:

...// above is your match to 'c', the node to delete
OPTIONAL MATCH (c)-[:HAS_Y]->(l)
DETACH DELETE c
WITH DISTINCT l
WHERE size(()-[:HAS_Y]->(l)) = 0
OPTIONAL MATCH (l)-[:HAS_Z*0..1]->(toDelete)
DETACH DELETE toDelete

Сначала мы сопоставим l, затем удалим c.На данный момент, мы должны предпринять действия только для любых l узлов, которые больше не имеют входящих отношений :HAS_Y.Мы фильтруем только по ним, а затем используем необязательное совпадение с отношением переменных 0..1 для захвата как узлов l, так и любых дочерних элементов, у которых они имеют отношения :HAS_Z, затем удаляем все эти узлы (оба lи все его возможные потомки будут адресованы через toDelete).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...