我有两个节点,在这两个节点之间,一遍又一遍地创建具有相同属性的相同边缘。我怎么能避免这个?如果边缘具有不同的属性,则确定并且需要保留它,但如果属性相同,则应该只有一个边缘。
编辑:我使用的是rails,我想通过应用程序而不是Cypher查询来实现这一点。
编辑:分享一些相关的代码:
dis = Disease.where(disease: params[:disease]).first
fac = Factor.where(factor: params[:factor])
dis.factors.create(fac, prop: "p1")
所以,我想要的是如果我输入相同的疾病和因子,它不会复制边缘(它当前正在做),因为设置的属性也是相同的。但是,如果将来p1
更改为p2
,则应添加边缘。
关于模型类(疾病和因子),请参考Neo4j inconsistent behaviour of model classes。
答案 0 :(得分:1)
您需要在cypher中使用MERGE
关键字:匹配模式或创建模式(如果不存在)。
这是一个基于电影图的例子:
MATCH (neo:Person { name:"Keanu Reeves"})
MATCH (matrix:Matrix { title:"The Matrix"})
MERGE (neo)-[:ACTED_IN {roles:['neo']}]->(matrix)
你可以多次执行这个查询,你只能在Neo和amp;之间有一个优势。基质
干杯
答案 1 :(得分:1)
您有两种选择。您可以在关联中使用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