Поиск и удаление связанных узлов, не связанных с другими узлами - PullRequest
0 голосов
/ 08 января 2019

В нашем приложении (java 8) мы используем NEO4J (3.4) и для функции нам нужен запрос, который выполняет следующие действия:

Удалите все узлы типа «Team», которые не имеют отношения «OWNS», и все связанные узлы типа «Employee» с отношением «MEMBER_OF» к «Team», но только если нет других связей Employee с другими Командные узлы.

Я довольно новичок в NEO4J версии 3.4 и немного знаком с языком Cypher, но пока он мне не подходит.

Первая часть запроса, которую я получаю:

MATCH (team:Team) WHERE NOT (team)-[:OWNS]->() RETURN team

и я мог бы начать итерацию по набору результатов и т. Д., Но держу пари, что есть запрос для этой проблемы

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я решил, используя

MATCH (team:Team) WHERE NOT (team)-[:OWNS]->()
WITH team
OPTIONAL MATCH (team)-[r]-(allRelatedNodes)
WHERE size((allRelatedNodes)--()) = 1
DETACH DELETE team, allRelatedNodes

нужно проверить это с большим количеством данных, но, похоже, работает

0 голосов
/ 08 января 2019

[ОБНОВЛЕНО]

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

MATCH (team:Team) WHERE NOT (team)-[:OWNS]->()
OPTIONAL MATCH (team)<-[:MEMBER_OF]-(emp:Employee)
WITH team, CASE
  WHEN emp IS NULL THEN []
  ELSE COLLECT({emp: emp, cnt: SIZE([(emp)--(t2:Team) WHERE team<>t2|t2])}) END AS data
DETACH DELETE team
FOREACH(e IN [d IN data WHERE d.cnt = 0 | d.emp] | DETACH DELETE e)

[ОБНОВЛЕНО 2]

А вот улучшенная версия вашего собственного ответа. Более подробно о метках узлов и типах отношений и делается попытка удалить team только один раз.

MATCH (team:Team) WHERE NOT (team)-[:OWNS]->()
OPTIONAL MATCH (team)<-[:MEMBER_OF]-(emp:Employee)
WHERE SIZE((emp)--(:Team)) = 1
WITH COLLECT(emp) + team AS del
FOREACH(x IN del | DETACH DELETE x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...