处理 null
在 Cypher® 中,null 用于表示缺失或未定义的值。Cypher 中的所有数据类型都可以为 null。这意味着类型谓词表达式对于 null 值总是返回 true。
从概念上讲,null 表示缺失或未知的值,它的处理方式与其他值略有不同。例如,从一个没有某属性的节点中返回该属性会产生 null。大多数以 null 作为输入的表达式都会产生 null。在 WHERE 子句中使用的谓词的情况下,任何不为 true 的结果都被解释为 false。
null 不等于 null。不知道两个值是什么并不意味着它们是相同的值。这意味着表达式 null = null 的结果为 null,而不是 true。
与 null 的逻辑运算
布尔运算符(AND、OR、XOR、NOT)将 null 视为三值逻辑中的未知值。
| a | b | a AND b |
a OR b |
a XOR b |
NOT a |
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IN 运算符和 null
IN 运算符遵循类似的逻辑。如果 Cypher 可以确定列表中存在某项,结果将为 true。任何包含 null 且没有匹配元素的列表都将返回 null。否则,结果为 false。
| 表达式 | 结果 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
使用 all、any、none 和 single 也遵循类似的规则。如果结果可以明确计算出来,则返回 true 或 false。否则产生 null。
[] 运算符和 null
使用 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 NULL 和 IS NOT NULL
使用 = 运算符或 <> 运算符将任何值与 null 进行测试,结果总是 null。因此,请使用专门的相等运算符 IS NULL 或 IS NOT NULL。在属性上使用 IS NOT NULL(例如 n.prop IS NOT NULL)用于测试该属性是否存在且不为 null。