【翻译自:https://neo4j.com/developer/kb/understanding-non-existent-properties-and-null-values/ 】 【阅读时间:5 分钟】 【由Neo4j APAC授权编译发布】
知乎原文
图数据库 Neo4j 使用过程中,由于没有表限制可能的属性,因此对于节点和关系的属性 non-existence 和 NULL 是等效的。也就是说,实际上不存在具有空值的属性,NULL 表示该属性根本不存在,这与具有表模式的关系数据库相反。在关系数据库中,表的一行数据,即使某列的值为null,依然存在这个字段。 例如,如果我们有一个图存在 :Person 节点,则以下两个查询结果相同:
MATCH (p:Person)
WHERE p.id = $personId
RETURN NOT EXISTS(p.email)
MATCH (p:Person)
WHERE p.id = $personId
RETURN p.email IS NULL
Neo4j 并不强制要求同类节点具有相同属性(建议保持一致)。当我们讨论的属性,在其它节点上正常使用(在该节点上缺失),或者在图中是无意义的,亦或者从未使用的属性(例如 p.pinkElephant ),如果该属性不存在,则如上所述的 NULL 检查将返回true。 同样,以下两个查询将导致删除该属性:
MATCH (p:Person)
WHERE p.id = $personId
SET p.email = null
MATCH (p:Person)
WHERE p.id = $personId
REMOVE p.email
使用映射更新节点属性的方法非常好用,可以从节点中动态清除多个属性:
WITH {email:null, dob:null} as clearProps
MATCH (p:Person)
WHERE p.id = $personId
SET p += clearProps
1、NULL 映射值 这也表明,对于节点和关系的属性 non-existence 和 NULL 是等效的,但对于映射或集合而言并不相同。如上所述,映射中实体为空与缺少该条目不同。 使用映射投影时,这种区别尤其有用。映射投影是节点属性的视图映射,即使该节点上不存在该属性,它也可以用于强制显示返回数据的属性。 例如,:Person 节点可能存在 email 属性,在下面的查询中,返回的节点数据中有可能存在 email 属性,具体取决于该属性是否存在于每个返回的节点上:
MATCH (p:Person)
RETURN p
但是,如果我们希望总是显示 email 属性,如果该属性不存在,则显示NULL,我们将使用映射投影,如下所示:
MATCH (p:Person)
RETURN p {.*, .email}
2、NULL 列表值
列表中也允许使用 NULL:
RETURN [1,2,3,null,5]
但是,基于节点或关系属性的聚合会跳过或忽略空值:
MATCH (p:Person)
RETURN count(p.email) as emailCount
该计数不包含空值。
MATCH (p:Person)
RETURN collect(p.email) as emails
这将跳过空值;返回的集合不包含任何 null。 3、在逻辑表达式和其他上下文中使用NULL Neo4j 开发人员手册详细介绍了如何在逻辑表达式中使用NULL,以及何时表达式将返回NULL的详细信息。 4、使用COALESCE()为空值使用默认值 在某些情况下,当节点或关系上不存在属性时,我们可能希望显示默认值。或者我们可能想对一个可能的空值执行相等或不相等比较,如果该值恰好为空,则使用默认值。 COALESCE()允许处理这些情况,它接受任意数量的参数,并返回遇到的第一个非空值。
MATCH (p:Person)
RETURN collect(COALESCE(p.email, 'NOT SET')) as emails
我们看到列表中包括“ NOT SET”,而不是像以前那样忽略空值。
MATCH (p:Person)
WHERE COALESCE(p.optedIn, false) <> true
RETURN p
使用COALESCE(),我们可以将null作为不同值进行比较。请注意,与null 的相等或不相等比较(例如null <> true)会得出null,而不是布尔值,因此COALESCE()在这里特别有用。
MATCH (p:Person)
RETURN COALESCE(p.email, p.backupEmail, p.backupBackupEmail, 'NOT SET') as email
允许进行多个备选,第一个非空值将被使用。 5、NULL 匹配和合并 5.1 Null 节点变量 当你执行 MATCH 查询时,返回的节点变量为空的情况下(例如,OPTIONAL MATCH 执行失败),您无法执行后续的 CREATE 或 MERGE。 例如,当没有 :PinkElephant 节点时,此查询语句有效,但不会返回记录:
OPTIONAL MATCH (node1:PinkElephant)
WITH node1
MATCH (node1)-[:ACTED_IN]->(m:Movie)
RETURN node1
此时,下面的两个语句都将抛出错误:
OPTIONAL MATCH (node1:PinkElephant)
WITH node1
MERGE (node1)-[:ACTED_IN]->(m:Movie)
RETURN node1
和
OPTIONAL MATCH (node1:PinkElephant)
WITH node1
CREATE (node1)-[:ACTED_IN]->(m:Movie)
RETURN node1
5.2 Null 属性值 当我们改用 null 属性值时,可以使用 null 属性值进行 MATCH 或 CREATE,但不能使用 MERGE: 例如下面两语句可以执行:
OPTIONAL MATCH (ele:PinkElephant)
WITH ele
MATCH (node1:Person{name:ele.name)-[:ACTED_IN]->(m:Movie)
RETURN node1
和
OPTIONAL MATCH (ele:PinkElephant)
WITH ele
CREATE (node1:Person{name:ele.name)-[:ACTED_IN]->(m:Movie)
RETURN node1
但这会引发错误:
OPTIONAL MATCH (ele:PinkElephant)
WITH ele
MERGE (node1:Person{name:ele.name)-[:ACTED_IN]->(m:Movie)
RETURN node1
更多技术咨询: 联系人:于先生 Email:yusonglin@we-yun.com 微信号:ysllong_0226 微云数聚官网:www.we-yun.com