2017-07-07 130 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