在 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 UNIQUEhere、问号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 中,如果关系不存在,我该如何创建关系;如果确实如此,请更新属性的主要内容,如果未能解决你的问题,请参考以下文章

如果使用Perl不存在目录,我该如何创建目录?

neo4j cypher 节点可以模糊匹配么

Cypher where子句因多条路径而失败

使用Cypher创建与现有节点的多个关系

neo4j cypher - 麻烦制造关系

Neo4j 第十一篇:Cypher函数