ajaxfileupload struts2 null_Neo4j 实战(一):深入理解 EXISTS 和 NULL

阅读时间:5分钟】

4573bc877cf4f3154726f5d1568b1476.png

图数据库 Neo4j 使用过程中,由于没有表限制可能的属性,因此对于节点和关系的属性 non-existence 和 NULL 是等效的。也就是说,实际上不存在具有空值的属性,NULL 表示该属性根本不存在,这与具有表模式的关系数据库相反。在关系数据库中,表的一行数据,即使某列的值为null,依然存在这个字段。

例如,如果我们有一个图存在 :Person 节点,则以下两个查询结果相同:

MATCH (p:Person)WHERE p.id = $personIdRETURN NOT EXISTS(p.email)
MATCH (p:Person)WHERE p.id = $personIdRETURN p.email IS NULL

Neo4j 并不强制要求同类节点具有相同属性(建议保持一致)。当我们讨论的属性,在其它节点上正常使用(在该节点上缺失),或者在图中是无意义的,亦或者从未使用的属性(例如 p.pinkElephant ),如果该属性不存在,则如上所述的 NULL 检查将返回true。

同样,以下两个查询将导致删除该属性:

MATCH (p:Person)WHERE p.id = $personIdSET p.email = null
MATCH (p:Person)WHERE p.id = $personIdREMOVE p.email

使用映射更新节点属性的方法非常好用,可以从节点中动态清除多个属性:

WITH {email:null, dob:null} as clearPropsMATCH (p:Person)WHERE p.id = $personIdSET 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) <> trueRETURN 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 node1MATCH (node1)-[:ACTED_IN]->(m:Movie)RETURN node1

此时,下面的两个语句都将抛出错误:

OPTIONAL MATCH (node1:PinkElephant)WITH node1MERGE (node1)-[:ACTED_IN]->(m:Movie)RETURN node1

OPTIONAL MATCH (node1:PinkElephant)WITH node1CREATE (node1)-[:ACTED_IN]->(m:Movie)RETURN node1
c0f83d142ffc56139fa9222232b07a46.png

5.2 Null 属性值

当我们改用 null 属性值时,可以使用 null 属性值进行 MATCH 或 CREATE,但不能使用 MERGE:

例如下面两语句可以执行:

OPTIONAL MATCH (ele:PinkElephant)WITH eleMATCH (node1:Person{name:ele.name)-[:ACTED_IN]->(m:Movie)RETURN node1

OPTIONAL MATCH (ele:PinkElephant)WITH eleCREATE (node1:Person{name:ele.name)-[:ACTED_IN]->(m:Movie)RETURN node1

但这会引发错误:

OPTIONAL MATCH (ele:PinkElephant)WITH eleMERGE (node1:Person{name:ele.name)-[:ACTED_IN]->(m:Movie)RETURN node1
811f30c9ceffd1d5c77cbc5c6cd50ddd.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值