Neo4j если узел не имеет исходящих ребер, удалите этот узел, иначе верните его следующие узлы

#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 iff n IS NULL ). 1 Значение в [1] могло быть любым, и x значение игнорируется. Подход APOC немного более понятен для непосвященных, но может быть менее производительным.