具有相同属性neo4j的重复边

时间:2017-07-07 06:42:47

标签: ruby-on-rails neo4j associations neo4j.rb

我有两个节点,在这两个节点之间,一遍又一遍地创建具有相同属性的相同边缘。我怎么能避免这个?如果边缘具有不同的属性,则确定并且需要保留它,但如果属性相同,则应该只有一个边缘。

编辑:我使用的是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

2 个答案:

答案 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