处理 null

在 Cypher® 中,null 用于表示缺失或未定义的值。Cypher 中的所有数据类型都可为空。这意味着类型谓词表达式 始终对 null 值返回 true

从概念上讲,null 表示**缺失或未知值**,并且它的处理方式与其他值略有不同。例如,从没有该属性的节点返回属性将产生 null。大多数以 null 作为输入的表达式将产生 null。在 WHERE 子句中使用的谓词的情况下,任何不是 true 的内容都将被解释为 false。

null 不等于 null。不知道两个值并不意味着它们是同一个值。这意味着表达式 null = null 产生 null,而不是 true

null 的逻辑运算

逻辑运算符 (ANDORXORNOT) 将 null 视为三值逻辑的未知值

表 1. 逻辑运算符的真值表
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

IN 运算符和 null

IN 运算符 遵循类似的逻辑。如果 Cypher 可以确定某物存在于列表中,则结果将为 true。任何包含 null 且没有匹配元素的列表都将返回 null。否则,结果将为 false

表 2. 包含 IN 运算符的表达式的示例
表达式 结果

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

使用 allanynonesingle 遵循类似的规则。如果结果可以确定性地计算,则返回 truefalse。否则会产生 null

[] 运算符和 null

使用 null 访问列表或映射将导致 null

表达式 结果

[1, 2, 3][null]

null

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

null

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

null

{age: 25}[null]

null

使用参数传入边界,例如 a[$lower..$upper],可能会导致下边界或上边界(或两者)为 null。以下解决方法将通过设置绝对最小和最大边界值来防止这种情况发生

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

返回 null 的表达式

  • 从列表中获取缺失的元素:[][0]head([])

  • 尝试访问节点或关系上不存在的属性:n.missingProperty

  • 当任一侧为 null 时的比较:1 < null

  • 包含 null 的算术表达式:1 + null

  • 某些函数调用,其中任何参数都为 null:例如,sin(null)

使用 IS NULLIS NOT NULL

使用 = 运算符或 <> 运算符将任何值与 null 进行比较,始终计算为 null。因此,请使用特殊的相等运算符IS NULL 或 IS NOT NULL.