处理 null

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

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

null 不等于 null。不知道两个值是什么并不意味着它们是相同的值。这意味着表达式 null = null 的结果为 null,而不是 true

null 的逻辑运算

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

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

包含 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 NULLIS NOT NULL。在属性上使用 IS NOT NULL(例如 n.prop IS NOT NULL)用于测试该属性是否存在且不为 null。