【Cypher】空值(NULL)
Cypher 中的空值(NULL)详解
一、什么是 Cypher 中的 NULL?
NULL 是 Cypher 中的特殊值,用于表示:
- 属性不存在
- 未知或未定义的值
- 查询未匹配到结果时
在 Cypher 中,NULL
是一种占位符,不能直接参与数学运算或字符串操作,也不能与其他 NULL
进行比较。
二、Cypher 中 NULL
的基本特性
2.1 属性不存在时返回 NULL
MATCH (n:Person)
RETURN n.name, n.age
- 如果
age
属性不存在,Cypher 会返回NULL
。
2.2 关系或路径未匹配时返回 NULL
MATCH (n:Person)-[r:KNOWS]->(m:Person)
RETURN n.name, m.name
- 如果
Person
节点没有KNOWS
关系,m.name
返回NULL
。
2.3 使用 OPTIONAL MATCH
返回 NULL
MATCH (n:Person)
OPTIONAL MATCH (n)-[:KNOWS]->(m:Person)
RETURN n.name, m.name
-
OPTIONAL MATCH
允许匹配失败,未匹配的部分将返回NULL
。
2.4 未设置的属性返回 NULL
MATCH (n:Person {name: 'Alice'})
RETURN n.address
- 如果
Alice
的address
属性未设置,则返回NULL
。
三、Cypher 中 NULL
的常见运算
3.1 NULL
参与数学运算
RETURN 5 + NULL AS result
-
结果:
NULL
-
原因: 任何
NULL
参与的数学运算都会返回NULL
。
3.2 NULL
进行字符串拼接
RETURN 'Hello' + NULL AS result
-
结果:
NULL
-
原因: 字符串拼接中如果有
NULL
,结果仍为NULL
。
3.3 NULL
进行布尔比较
RETURN NULL = NULL AS result
-
结果:
NULL
-
原因:
NULL
与NULL
进行比较时,返回NULL
而非true
。
3.4 NULL
在 WHERE
子句中的表现
MATCH (n:Person)
WHERE n.age > 30
RETURN n.name
- 如果
age
为NULL
,n.age > 30
的结果为NULL
,不会匹配到该节点。
3.5 IS NULL
和 IS NOT NULL
MATCH (n:Person)
WHERE n.age IS NULL
RETURN n.name
-
IS NULL
检测属性是否为NULL
。
MATCH (n:Person)
WHERE n.age IS NOT NULL
RETURN n.name
-
IS NOT NULL
检测属性是否存在且不为NULL
。
四、空值与 AND
、OR
和 XOR
的逻辑值表
Cypher 使用三值逻辑(TRUE
、FALSE
、NULL
),当 NULL
参与 AND
、OR
和 XOR
运算时,结果遵循以下逻辑:
4.1 AND
运算逻辑
-
AND
只有当两个值都为TRUE
时,结果才为TRUE
; - 如果任一值为
FALSE
,结果为FALSE
; - 只要有
NULL
参与,结果通常为NULL
。
A | B | A AND B |
---|---|---|
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
FALSE |
TRUE |
NULL |
NULL |
FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
NULL |
FALSE |
NULL |
TRUE |
NULL |
NULL |
FALSE |
FALSE |
NULL |
NULL |
NULL |
4.2 OR
运算逻辑
-
OR
只要有一个值为TRUE
,结果就为TRUE
; - 如果两个值都为
FALSE
,结果为FALSE
; - 如果其中一个值为
NULL
,结果取决于另一个值。
A | B | A OR B |
---|---|---|
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
TRUE |
TRUE |
NULL |
TRUE |
FALSE |
TRUE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
NULL |
NULL |
NULL |
TRUE |
TRUE |
NULL |
FALSE |
NULL |
NULL |
NULL |
NULL |
4.3 XOR
运算逻辑
-
XOR
(异或)当两个值不同(一个TRUE
一个FALSE
)时返回TRUE
; - 如果两个值相同(均为
TRUE
或均为FALSE
),返回FALSE
; - 如果有
NULL
参与,通常返回NULL
。
A | B | A XOR B |
---|---|---|
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
TRUE |
TRUE |
NULL |
NULL |
FALSE |
TRUE |
TRUE |
FALSE |
FALSE |
FALSE |
FALSE |
NULL |
NULL |
NULL |
TRUE |
NULL |
NULL |
FALSE |
NULL |
NULL |
NULL |
NULL |
4.4 IN
运算逻辑
-
IN
运算符用于检查值是否存在于列表中; - 如果值为
NULL
或列表中包含NULL
,结果通常为NULL
; - 如果值匹配,则返回
TRUE
,否则返回FALSE
。
A | List | A IN List |
---|---|---|
5 |
[1, 2, 3, 5] |
TRUE |
4 |
[1, 2, 3, 5] |
FALSE |
NULL |
[1, 2, 3, 5] |
NULL |
5 |
[1, NULL, 3, 5] |
TRUE |
6 |
[1, NULL, 3, 5] |
NULL |
NULL |
[NULL, NULL] |
NULL |
五、处理 NULL
的常用函数
5.1 coalesce()
-
coalesce()
返回参数列表中第一个非NULL
的值。
RETURN coalesce(NULL, 10, 20) AS result
-
结果:
10
5.2 exists()
-
exists()
检测属性是否存在。
MATCH (n:Person)
RETURN exists(n.age) AS hasAge
-
结果:
true
或false
5.3 CASE
语句处理 NULL
MATCH (n:Person)
RETURN n.name,
CASE
WHEN n.age IS NULL THEN 'Unknown'
ELSE n.age
END AS age
-
结果: 如果
age
为空,返回Unknown
;否则返回age
值。
5.4 apoc.util.validate()
处理 NULL
MATCH (n:Person)
CALL apoc.util.validate(n.age IS NULL, 'Age is missing!', null)
RETURN n.name, n.age
-
apoc.util.validate()
检测NULL
并抛出错误或返回特定值。
六、总结
-
Cypher 中的
NULL
表示属性不存在、关系未匹配或值未定义,不能直接与其他值进行比较。 - 使用
coalesce()
可以替代NULL
,IS NULL
和IS NOT NULL
用于检测NULL
。 - 在数学、字符串拼接、条件判断等操作中,如果不妥善处理
NULL
,可能导致结果为NULL
。 -
AND
、OR
和XOR
逻辑运算符在有NULL
参与时,遵循三值逻辑,并根据具体情况返回TRUE
、FALSE
或NULL
。 -
IN
运算符在处理NULL
时也遵循类似逻辑,需要特别注意在列表中存在NULL
的情况。
掌握 NULL
的使用和处理技巧,可以帮助你在 Cypher 查询中更好地控制数据的完整性和一致性。
上一篇: 对QDateTime
下一篇: NullByte: