Working with null

In Cypher®, null is used to represent missing or undefined values. All data types in Cypher are nullable. This means that type predicate expressions always return true for null values.

Conceptually, null means a missing or unknown value, and it is treated somewhat differently from other values. For example, returning a property from a node that does not have said property produces null. Most expressions that take null as input will produce null. In the case of a predicate used in a WHERE clause, anything that is not true is interpreted as being false.

null is not equal to null. Not knowing two values does not imply that they are the same value. This means that the expression null = null yields null, and not true.

Logical operations with null

The logical operators (AND, OR, XOR, NOT) treat null as the unknown value of three-valued logic.

Table 1. Truth table for logical operators
a b a AND b a OR b a XOR b NOT a

false

false

false

false

false

true

false

null

false

null

null

true

false

true

false

true

true

true

true

false

false

true

true

false

true

null

null

true

null

false

true

true

true

true

false

false

null

false

false

null

null

null

null

null

null

null

null

null

null

true

null

true

null

null

The IN operator and null

The IN operator follows similar logic. If Cypher can ascertain that something exists in a list, the result will be true. Any list that contains a null and does not have a matching element will return null. Otherwise, the result will be false.

Table 2. examples of expressions containing the IN operator
Expression Result

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

Using all, any, none, and single follows a similar rule. If the result can be calculated definitively, true or false is returned. Otherwise null is produced.

The [] operator and null

Accessing a list or a map with null will result in null:

Expression Result

[1, 2, 3][null]

null

[1, 2, 3, 4][null..2]

null

[1, 2, 3][1..null]

null

{age: 25}[null]

null

Using parameters to pass in the bounds, such as a[$lower..$upper], may result in a null for the lower or upper bound (or both). The following workaround will prevent this from happening by setting the absolute minimum and maximum bound values:

a[coalesce($lower,0)..coalesce($upper,size(a))]

Expressions that return null

  • Getting a missing element from a list: [][0], head([]).

  • Trying to access a property that does not exist on a node or relationship: n.missingProperty.

  • Comparisons when either side is null: 1 < null.

  • Arithmetic expressions containing null: 1 + null.

  • Some function calls where any argument is null: e.g., sin(null).

Using IS NULL and IS NOT NULL

Testing any value against null, either with the = operator or with the <> operator, always evaluates to null. Therefore, use the special equality operators IS NULL or IS NOT NULL.