首页 > 解决方案 > Neo4j 检测节点修改

问题描述

我在 Neo4j 数据库中使用这种查询:

MERGE(n:type {key:"xyz"})
ON CREATE SET n.create_date = timestamp() 
ON MATCH SET n.update_date = timestamp()
SET n.att1=value1, n.att2=value2

ON MATCH 将帮助我确定是否已找到节点,但如果属性确实已更改,则无法确定。

有什么方法可以用来检测节点的任何属性是否已更改?例如,再次运行相同的查询将更改 update_date 属性,而不会真正更改属性。我希望能够检测到 att1 或 att2 已更改。

非常感谢

标签: neo4jcypher

解决方案


可以使用 APOC 触发器:

首先,下载并安装 APOC 并启用它:

apoc.trigger.enabled=true
dbms.security.procedures.unrestricted=apoc.trigger.*
dbms.security.procedures.whitelist=apoc.*

然后,您可以添加一个触发器,该触发器将在attr1属性更改时做出反应:

CALL apoc.trigger.add(
'updateTimestamp',
'UNWIND apoc.trigger.propertiesByKey({assignedNodeProperties},"attr1") as prop
WITH prop.old as oldProp, prop.new as newProp, prop.node AS n 
SET n.updated_at = timestamp()', {phase:'before'});

测试它:

CREATE (n:Node) SET n.attr1 = "hello"
MATCH (n:Node) RETURN n
╒════════════════════════════════════════════╕
│"n"                                         │
╞════════════════════════════════════════════╡
│{"updated_at":1543313569105,"attr1":"hello"}│
└────────────────────────────────────────────┘

更新节点:

MATCH (n:Node) SET n.attr1 = "hellonew"
MATCH (n:Node) RETURN n
╒═══════════════════════════════════════════════╕
│"n"                                            │
╞═══════════════════════════════════════════════╡
│{"updated_at":1543313626248,"attr1":"hellonew"}│
└───────────────────────────────────────────────┘

再次执行以检查属性未更改时是否未触发:

MATCH (n:Node) SET n.attr1 = "hellonew"
MATCH (n:Node) RETURN n
╒═══════════════════════════════════════════════╕
│"n"                                            │
╞═══════════════════════════════════════════════╡
│{"updated_at":1543313626248,"attr1":"hellonew"}│
└───────────────────────────────────────────────┘

推荐阅读