知识库

更新节点但返回更新前的状态

某些用例需要更新节点(或关系)属性,但返回节点(或关系)更新之前的状态。

您需要获取更新前的节点“快照”,并返回该快照而不是节点本身。

Neo4j 3.1 及以上版本

您可以使用映射投影来获取节点快照

MATCH (p:Person{name:'Keanu Reeves'})
WITH p, p {.*} as snapshot
SET p.name = 'The One'
RETURN snapshot

返回的映射结果的 name 属性仍将设置为“Keanu Reeves”。

请注意,结果是映射,而不是节点,因此返回的数据中不包含节点 ID 和标签。

返回显式 null 值

如果您需要明确地将(快照中)缺失的字段显示为 Neo4j 3.1 或更高版本中的 null 值,您也可以通过在投影中显式包含该字段来使用映射投影解决此问题。

MATCH (p:Person{name:'Keanu Reeves'})
WITH p, p {.*, .lastUpdated} as snapshot
SET p.lastUpdated = TIMESTAMP()
RETURN snapshot

如果节点上不存在 lastUpdated 属性,它仍将在映射中返回,其值为 null,而不是根本不出现。

Neo4j 3.0 及以下版本

映射投影不可用,因此请改用 properties()

MATCH (p:Person{name:'Keanu Reeves'})
WITH p, properties(p) as snapshot
SET p.name = 'The One'
RETURN snapshot

返回的映射结果的 name 属性仍将设置为“Keanu Reeves”。

请注意,结果是映射,而不是节点,因此返回的数据中不包含节点 ID 和标签。

返回显式 null 值

如果您需要在 Neo4j 3.0 中明确地将(快照中)缺失的字段显示为 null 值,您需要使用 APOC Procedures 的映射辅助函数。

MATCH (p:Person{name:'Keanu Reeves'})
WITH p, properties(p) as props
CALL apoc.map.setKey(props, 'lastUpdated', null) YIELD value as snapshot
SET p.lastUpdated = timestamp()
RETURN snapshot

如果节点上不存在 lastUpdated 属性,它仍将在映射中返回,其值为 null,而不是根本不出现。

© . All rights reserved.