Neo4j / Cypher ДЛЯ КАЖДОГО квадратные скобки и использование «ТОГДА [1]»

#neo4j #cypher #graph-databases #cypher-3.1

#neo4j #шифр #графические базы данных #cypher-3.1

Вопрос:

Я видел несколько примеров операторов cypher FOREACH, которые ссылаются на число 1 в квадратных скобках, и я не могу найти документацию по нему. Это рабочая инструкция:

 FOREACH(i in CASE WHEN NOT rel IS NULL THEN [1] ELSE [] END |
DELETE rel CREATE (newest)-[:NEXT_SUB_REPLY]->(prevNewest))
  

и как бы я ни был рад, что это работает, я хотел бы больше узнать об использовании квадратных скобок и использовании числа 1. Из контекста я понимаю, что он перебирает и когда

 CASE WHEN NOT rel IS NULL
  

верно, он выполняет

 DELETE rel CREATE (newest)-[:NEXT_SUB_REPLY]->(prevNewest)
  

и в противном случае это ничего не делает. Документы Neo4j очень легки для FOREACH и не содержат ни использования квадратных скобок, ни использования 1 в предложении THEN .

Ответ №1:

Это своего рода взлом для поддержки условного выполнения инструкции. По сути, это эквивалентно следующему псевдокоду:

 IF (rel IS NOT NULL) THEN {
   DELETE rel CREATE (newest)-[:NEXT_SUB_REPLY]->(prevNewest))
}
  

FOREACH будет выполнять итерацию по коллекции и выполнять некоторую операцию для каждого элемента коллекции. Если в коллекции нет элементов, операция выполняться не будет. Если в коллекции есть один элемент, он будет запущен один раз.

Что касается того, почему это [1] в запросе, на самом деле это не имеет значения, и это в основном просто соглашение и зависит от личного вкуса. Это будет работать одинаково с любой одноэлементной коллекцией — например [true] , или [null] обоих должно быть достаточно. Важно то, что истинная часть CASE инструкции возвращает одноэлементный массив, а в противном случае массив с нулевым элементом.

В документах содержится больше информации, а также (возможно) менее нечитаемые альтернативы, если вы готовы использовать зависимость от библиотеки APOC.

Комментарии:

1. Спасибо! Это то, что я искал. Да, это немного халтурно, но работает для моих нужд.