首页 > 解决方案 > 如何更新 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

只是寻找最有效的“最佳实践”方式来做到这一点。

谢谢!

标签: neo4jcypher

解决方案


可能会出现两种情况:

  1. context和之间的关系u已经存在
  2. context和之间的关系u还不存在(这将在context刚刚通过合并创建时发生)

当您运行以下行时

MERGE (context)-[:BY{timestamp:$timestamp}]->(u)

Neo4j 将检查给定时间戳值BY之间是否已经存在关系contextu如果是,则不会创建新关系。我猜时间戳不是匹配关系的正确标识符,特别是因为您写了要更新它。因此,我建议通过以下方式更新查询:

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

这样,如果关系不存在,则将创建一个关系。无论哪种方式,时间戳都将设置为指定的值。


推荐阅读