具有相同属性的重复边 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
我有两个节点,在这两个节点之间,一遍又一遍地创建具有相同 属性 的相同边缘。我怎样才能避免这种情况?如果边有不同的属性,没关系,需要保留,但如果属性相同,应该只有一条边。
编辑:我正在使用 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