具有相同属性的重复边缘neo4j
问题描述:
我有两个节点,其间具有相同属性的相同边缘一遍又一遍地创建。我怎样才能避免这种情况?如果边缘具有不同的属性,那么它的OK和它需要保留,但是如果属性相同,则只应该有一条边。具有相同属性的重复边缘neo4j
编辑:我正在使用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模型类(疾病和因素)。
答
你有两种选择。您可以使用unique
选项您协会(S):
http://neo4jrb.readthedocs.io/en/8.1.x/ActiveNode.html#creating-unique-relationships
这可以让你从那里在两个节点(无论性质的)之间只有关系类型之一,只有创造独特的任何指定如果所有属性完全相同,则为节点。如果您创建一个ActiveRel
模式,你也可以做的creates_unique
声明同样的事情:我没有使用CYPHER查询
http://neo4jrb.readthedocs.io/en/8.1.x/ActiveRel.html#creating-unique-relationships
答
您需要在cypher中使用MERGE
关键字:它匹配一个模式或者在模式不存在时创建它。
这是一个基于电影图的例子:
MATCH (neo:Person { name:"Keanu Reeves"})
MATCH (matrix:Matrix { title:"The Matrix"})
MERGE (neo)-[:ACTED_IN {roles:['neo']}]->(matrix)
您可以执行这个查询多时间,你只会有新&矩阵之间的一个边缘。
干杯
但是在这种情况下,对于不同的属性,我也无法制作多个边,对吧? – vish4071
或者它似乎'独特:所有'就是我想要的?! – vish4071
如果您使用'unique:true' /'unique :::none'(两者相同),则只会创建该关系类型的一个关系。如果指定'unique::all',它将始终创建一个新的关系,除非所有的属性都相同。 ':on'选项可以让你更具体地指定属性 –