具有相同属性的重复边 neo4j

Duplicate edges with same properties neo4j

我有两个节点,在这两个节点之间,一遍又一遍地创建具有相同 属性 的相同边缘。我怎样才能避免这种情况?如果边有不同的属性,没关系,需要保留,但如果属性相同,应该只有一条边。

编辑:我正在使用 rails,我想通过应用程序而不是 Cypher 查询来完成此操作。

编辑:分享一些相关代码:

dis = Disease.where(disease: params[:disease]).first
fac = Factor.where(factor: params[:factor])
dis.factors.create(fac, prop: "p1")

所以,我想要的是,如果我输入相同的疾病和因素,它不会复制边缘(它当前正在做的),因为设置的 属性 也是相同的。但是,如果将来这个 p1 更改为 p2,则应添加边缘。

参考 post 模型 类(疾病和因素)。

你需要在 cypher 中使用 MERGE 关键字:它匹配一个模式,如果不存在则创建它。

这是一个基于电影图的例子:

MATCH (neo:Person { name:"Keanu Reeves"})
MATCH (matrix:Matrix { title:"The Matrix"})
MERGE (neo)-[:ACTED_IN {roles:['neo']}]->(matrix)

您可以多次执行此查询,Neo 和 Matrix 之间只有一条边。

干杯

你有两个选择。您可以在您的协会中使用 unique 选项:

http://neo4jrb.readthedocs.io/en/8.1.x/ActiveNode.html#creating-unique-relationships

这允许您指定任何内容,从两个节点之间只有一种关系类型(无论属性如何)到仅在所有属性完全相同时创建唯一节点。如果你创建一个 ActiveRel 模型,你也可以用 creates_unique 声明做同样的事情:

http://neo4jrb.readthedocs.io/en/8.1.x/ActiveRel.html#creating-unique-relationships