【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
  • 如果 Aliceaddress 属性未设置,则返回 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
  • 原因: NULLNULL 进行比较时,返回 NULL 而非 true

3.4 NULLWHERE 子句中的表现
MATCH (n:Person)
WHERE n.age > 30
RETURN n.name
  • 如果 ageNULLn.age > 30 的结果为 NULL,不会匹配到该节点。

3.5 IS NULLIS 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

四、空值与 ANDORXOR 的逻辑值表

Cypher 使用三值逻辑(TRUEFALSENULL),当 NULL 参与 ANDORXOR 运算时,结果遵循以下逻辑:


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
  • 结果: truefalse

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() 可以替代 NULLIS NULLIS NOT NULL 用于检测 NULL
  • 在数学、字符串拼接、条件判断等操作中,如果不妥善处理 NULL,可能导致结果为 NULL
  • ANDORXOR 逻辑运算符在有 NULL 参与时,遵循三值逻辑,并根据具体情况返回 TRUEFALSENULL
  • IN 运算符在处理 NULL 时也遵循类似逻辑,需要特别注意在列表中存在 NULL 的情况。

掌握 NULL 的使用和处理技巧,可以帮助你在 Cypher 查询中更好地控制数据的完整性和一致性。