#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. Спасибо! Это то, что я искал. Да, это немного халтурно, но работает для моих нужд.