8.7 Работа с NULL
8.7.1 Выражения, которые возвращают NULL
В Cypher NULL используется для обозначения отсутствующего или неопределенного значения. Концептуально NULL означает “отсутствующее неизвестное значение” и обрабатывается несколько иначе, чем другие значения. Например, при получении свойства узла, которого он не имеет, говорят, что свойство произвело NULL. Большинство выражений, которые получают NULL на входе, будут производить NULL. Это относится и к булевым выражениям, которые используются в качестве предикатов в предложении WHERE. В данном случае всё, что не является TRUE, интерпретируется как ложь.
NULL не равен NULL. Если мы не знаем двух значений, это не значит, что они суть одно и то же. Поэтому выражение NULL = NULL даст нам NULL, а не TRUE.
Логические операторы (т.е. AND, OR, XOR, IN) трактуют NULL как значение UNKNOWN (“неизвестно”) в трехзначной логике. Ниже представлена таблица истинности значений для AND, OR и XOR.
a | b | a AND b | a OR b | a XOR b |
---|---|---|---|---|
FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | NULL | FALSE | NULL | NULL |
FALSE | TRUE | FALSE | TRUE | TRUE |
TRUE | FALSE | FALSE | TRUE | TRUE |
TRUE | NULL | NULL | TRUE | NULL |
TRUE | TRUE | TRUE | TRUE | FALSE |
NULL | FALSE | FALSE | NULL | NULL |
NULL | NULL | NULL | NULL | NULL |
NULL | TRUE | NULL | TRUE | NULL |
Оператор IN следует подобной логике. Если Cypher знает, что элемент существует в коллекции, результат будет TRUE. Любая коллекция, которая содержит NULL и не имеет совпадающего элемента, вернёт NULL. В противном случае, результатом будет false. Вот таблица с примерами:
Выражение | Результат |
---|---|
2 IN [1, 2, 3] | TRUE |
2 IN [1, NULL, 3] | NULL |
2 IN [1, 2, NULL] | TRUE |
2 IN [1] | FALSE |
2 IN [] | FALSE |
NULL IN [1,2,3] | NULL |
NULL IN [1,NULL,3] | NULL |
NULL IN [] | FALSE |
Использование ALL, ANY, NONE и SINGLE подчиняется подобному правилу. Если результат может быть вычислен определенно, возвращается TRUE или FALSE. В противном случае возникает NULL.
8.7.2 Выражения, которые возвращают NULL
- Получение отсутствующего элемента в коллекции: [][0], head([])
- Попытка доступа к свойству, которое не существует для узла или связи: n.missingProperty
- Сравнение с NULL: 1 < NULL
- Арифметические выражения, включающие NULL: 1 + NULL
- Вызовы функций, когда среди аргументов присутствует NULL: sin(NULL)