neo4j - 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 已更改。
非常感谢
解决方案
可以使用 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"}│
└───────────────────────────────────────────────┘
推荐阅读
- nginx - 如何在 Nginx 上获取 :authority 标头?
- javascript - 使用 Azure Functions 和 Azure SQL server 制作登录和注册系统
- django - django 中的 url 找不到页面错误
- git - Git:如何找出哪个版本的“主”别名?
- php - 上传 Excel 文件 Google Drive API
- reactjs - React.js - 扫描文档
- opendaylight - 实验室设置:带 mininet 的 OpenDayLight(铝制)
- javascript - Google API 使用 java 脚本获取对我的业务的评论
- javascript - 如何使用 kubernets 客户端库连接到 kubernets 集群?
- python - 有没有比使用 Reshape 更好的方法来重复张量内的图层?