更新节点但返回其更新前的状态
某些用例需要更新节点(或关系)的属性,但返回更新前的节点(或关系)状态。
您需要在更新之前获取该节点的“快照”,并返回该快照而不是节点本身。
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 和标签。
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 值返回,而不是根本不出现。
此页面有帮助吗?