在 Cypher 中,如果关系不存在,我该如何创建关系;如果确实如此,请更新属性
Posted
技术标签:
【中文标题】在 Cypher 中,如果关系不存在,我该如何创建关系;如果确实如此,请更新属性【英文标题】:In Cypher, how can I create a relationship if it doesn't exist; update property if it does 【发布时间】:2012-07-06 10:50:53 【问题描述】:在 Neo4J 的 Cypher 中,给定两个节点,如果它们之间没有关系,我想创建一个权重属性为 1 的关系(Foo 类型)。如果这种关系已经存在,我想增加它的权重属性。
有没有在单个 Cypher 查询中执行此操作的好方法?谢谢!
编辑:一些额外的细节: 节点已创建、唯一且在索引中。
【问题讨论】:
您可以使用 SNAPSHOT 版本的 neo4j 吗?在 neo4j 1.8 中,您可以使用 Cypher 更新图形,但不能在任何其他版本中。 所以本质上你正在寻找扫描所有节点,如果连接,增加,如果没有,创建关系? 尼古拉斯,感谢您的回复。我添加了一些额外的细节;节点是唯一的并且被索引,所以我认为我不应该扫描所有节点。但是,除此之外,您的评论是正确的:如果连接,则增加,如果没有,则创建关系。 【参考方案1】:这正是我们在 1.8 中添加 CREATE UNIQUE
的原因。
START a=node(...), b=node(...)
CREATE UNIQUE a-[r:CONNECTED_TO]-b
SET r.weight = coalesce(r.weight?, 0) + 1
阅读更多关于CREATE UNIQUE
here、问号here和合并here的信息。
【讨论】:
完美!正是我想要的。我知道 RELATE,但不知道合并短语。 “?”究竟是什么意思?做什么? 从 Neo4j 2.0 开始?运算符已被删除。见:neo4j.com/docs/snapshot/… 创建唯一性现在已弃用,请改用 MERGE:neo4j.com/docs/developer-manual/current/cypher/clauses/merge【参考方案2】:为了完成 Andres 的回答,属性末尾的问号现在是 Neo4j 2 的错误。 所以请求将是:
MATCH a, b
WHERE a(...) AND b(...)
CREATE UNIQUE a-[r:CONNECTED_TO]->b
SET r.weight = coalesce(r.weight, 0) + 1
【讨论】:
【参考方案3】:为了将来参考,CREATE UNIQUE 已被弃用(请参阅here)。看起来你可以用 MATCH 和 MERGE 做类似的事情:
MATCH (a:Person name: 'Wonder Woman')
MERGE (b:Person name: 'Aries')
MERGE (a)-[r:FOUGHT]->(b)
ON CREATE SET r.weight = 1
ON MATCH SET r.weight = r.weight + 1
所以在这里,神奇女侠至少与白羊座战斗过一次,否则会增加重量。
【讨论】:
以上是关于在 Cypher 中,如果关系不存在,我该如何创建关系;如果确实如此,请更新属性的主要内容,如果未能解决你的问题,请参考以下文章