neo4j - 如何更新 Neo4J Cypher 中的关系属性?
问题描述
我有以下 Neo4J Cypher 查询:
MATCH (u:User {uid: $userId})
UNWIND $contextNames as contextName
MERGE (context:Context {name:contextName.name,by:u.uid,uid:contextName.uid})
ON CREATE SET context.timestamp=$timestamp
MERGE (context)-[:BY{timestamp:$timestamp}]->(u)
context
最后一个字符串总是在 the和u
节点之间创建一个新的关系。但是,如果我只想更新它怎么办?如何将此逻辑集成到上面的查询中?
我必须在WITH context,u
之前添加MERGE
然后添加rel:BY
到查询中吗?
或者做MATCH (context)-[rel:BY....
然后更新rel
?
只是寻找最有效的“最佳实践”方式来做到这一点。
谢谢!
解决方案
可能会出现两种情况:
context
和之间的关系u
已经存在context
和之间的关系u
还不存在(这将在context
刚刚通过合并创建时发生)
当您运行以下行时
MERGE (context)-[:BY{timestamp:$timestamp}]->(u)
Neo4j 将检查给定时间戳值BY
之间是否已经存在关系context
。u
如果是,则不会创建新关系。我猜时间戳不是匹配关系的正确标识符,特别是因为您写了要更新它。因此,我建议通过以下方式更新查询:
MATCH (u:User {uid: $userId})
UNWIND $contextNames as contextName
MERGE (context:Context {name:contextName.name,by:u.uid,uid:contextName.uid})
ON CREATE SET context.timestamp=$timestamp
MERGE (context)-[by:BY]->(u)
SET by.timestamp=$timestamp
这样,如果关系不存在,则将创建一个关系。无论哪种方式,时间戳都将设置为指定的值。
推荐阅读
- java - 在 Junit mockMVC 中模拟空对象
- typescript - 如何在页面刷新时正确水合 NextJS 中的 Redux 状态?
- javascript - 使用 JavaScript 重定向到另一个应用程序中的 Django url
- complex-event-processing - 在 NEsper 引擎中导入事件(数据)
- laravel - Laravel:Vue组件无法识别
- php - 如何为有回复的评论显示显示回复按钮?
- laravel - Laravel Vue - 存储数组
- java - 延迟来自队列rabbitmq spring的消息
- reactjs - 如何更快地更新 React Native 应用程序中的 ERC20 代币数量?
- python - 点云缩小