#neo4j #cypher
#neo4j #cypher
Вопрос:
Я пытаюсь использовать Neo4j Cypher для реализации следующей функции: учитывая узел, проверьте, есть ли у него какие-либо исходящие ребра с определенным типом отношений. Если это так, верните узлы, к которым он может обращаться по этим ребрам, в противном случае удалите этот узел. И мой код выглядит так
MATCH (m:Node{Properties})
WITH (size((m)-[:type]->(:Node))) AS c,m
WHERE c=0
DETACH DELETE m
Однако я не знаю, как применить условие if / else здесь, и этот код реализует только часть того, что мне нужно. Я был бы очень признателен за вашу помощь и предложения!
Например, база данных выглядит так:
A-[тип]->B
A-[тип]-> C
Если исходный узел является A и у него есть два ребра с этим типом B и C, то я хочу, чтобы запрос возвращал B и C в качестве результата. Если исходный узел равен B, его следует удалить, потому что у B. такого исходящего ребра нет.
Комментарии:
1. Вероятно, вы захотите использовать условные процедуры APOC
2. Спасибо за ваше предложение, но у меня возникли некоторые проблемы с использованием запроса APOC в java..it всегда есть какие-то ошибки
3. что ж, мы всегда можем вам в этом помочь 🙂
Ответ №1:
[ОБНОВЛЕНО]
Следующий запрос использует FOREACH
хак для условного удаления m
и возвращает либо найденные n
узлы, либо NULL
, если их не было.
OPTIONAL MATCH (m:Node {...Properties...})-[:type]->(n:Node)
FOREACH(x IN CASE WHEN n IS NULL THEN [1] END | DETACH DELETE m)
RETURN n
Вы также можете использовать процедуру APOC apoc.do.when вместо FOREACH
взлома:
OPTIONAL MATCH (m:Node {...Properties...})-[:type]->(n:Node)
CALL apoc.do.when(n IS NULL, 'DETACH DELETE m', '', {m: m}) YIELD value
RETURN n
Комментарии:
1. Спасибо за ваш ответ! Но похоже, что он не может вернуть все доступные узлы, когда исходный узел имеет исходящие ребра с этим типом.
2. В вашем первоначальном вопросе не содержалось требования о том, чтобы что-либо было возвращено. Смотрите мой обновленный ответ
3. Большое вам спасибо и извините, что я не четко описал свой вопрос! 🙂
4. Извините, что снова беспокою вас, меня немного смущает буква «x» в предложении FOREACH, означает ли это номер обращения?
5.
x
И[1]
просто необходимы, чтобы сделатьFOREACH
предложение законным и работать по назначению (выполнитьDETACH DELETE m
iffn IS NULL
).1
Значение в[1]
могло быть любым, иx
значение игнорируется. Подход APOC немного более понятен для непосвященных, но может быть менее производительным.