2017-07-07 85 views
1

我有两个节点,其间具有相同属性的相同边缘一遍又一遍地创建。我怎样才能避免这种情况?如果边缘具有不同的属性,那么它的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模型类(疾病和因素)。

回答

1

你有两种选择。您可以使用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

+0

但是在这种情况下,对于不同的属性,我也无法制作多个边,对吧? – vish4071

+0

或者它似乎'独特:所有'就是我想要的?! – vish4071

+0

如果您使用'unique:true' /'unique :::none'(两者相同),则只会创建该关系类型的一个关系。如果指定'unique::all',它将始终创建一个新的关系,除非所有的属性都相同。 ':on'选项可以让你更具体地指定属性 –

1

您需要在cypher中使用MERGE关键字:它匹配一个模式或者在模式不存在时创建它。

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

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

您可以执行这个查询多时间,你只会有新&矩阵之间的一个边缘。

干杯

+0

。我已经提到了我正在使用的导轨。 – vish4071

+0

那么你可以分享一些代码吗? – logisima

+0

当然,是这样做的。 – vish4071