2017-07-07 3 views
1

J'ai deux noeuds entre lesquels, le même arête avec la même propriété est créé encore et encore. Comment puis-je éviter ça? Si les arêtes ont des propriétés différentes, c'est ok et il doit être conservé mais si les propriétés sont identiques, il ne devrait y avoir qu'un seul arête.Arêtes dupliquées avec les mêmes propriétés neo4j

EDIT: J'utilise des rails et je veux le faire par l'intermédiaire de l'application et non de la requête Cypher.

EDIT: Partage du code pour la pertinence:

dis = Disease.where(disease: params[:disease]).first 
fac = Factor.where(factor: params[:factor]) 
dis.factors.create(fac, prop: "p1") 

Alors, ce que je veux est si je l'entrée même maladie et le facteur, il pas double emploi avec le bord (ce qui fait actuellement) comme propriété défini est aussi même. Toutefois, si à l'avenir, ce p1 devient p2, le bord doit être ajouté.

Référez le poste Neo4j inconsistent behaviour of model classes pour les classes de modèles (Maladie et facteur).

Répondre

1

Vous avez deux options. Vous pouvez utiliser l'option unique sur votre association (s):

http://neo4jrb.readthedocs.io/en/8.1.x/ActiveNode.html#creating-unique-relationships

Cela vous permet de spécifier quoi que ce soit à partir de là étant une seule de ce type de relation entre deux noeuds (quelle que soit les propriétés), seulement créer uniques nœuds si toutes les propriétés sont exactement les mêmes. Si vous créez un modèle ActiveRel, vous pouvez aussi faire la même chose avec la déclaration creates_unique:

http://neo4jrb.readthedocs.io/en/8.1.x/ActiveRel.html#creating-unique-relationships

+0

Mais dans ce cas, pour différentes propriétés aussi, je ne serai pas en mesure de faire plusieurs bords, non? – vish4071

+0

Ou il semble «unique: tout» est ce que je veux ?! – vish4071

+0

Si vous utilisez 'unique: true' /' unique:: none' (les deux sont identiques), une seule relation de ce type de relation sera créée. Si vous spécifiez 'unique:: all', il créera toujours une nouvelle relation, sauf si tous les attributs sont identiques. L'option ': on' vous permet de spécifier des propriétés plus précisément –

1

Vous devez utiliser le mot clé MERGE dans cypher: it Correspond à un modèle ou créez-le s'il n'existe pas.

C'est un exemple basé sur le graphique du film:

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

Vous pouvez exécuter cette requête plusieurs fois, vous n'aurez un bord entre Neo & Matrix.

Salutations

+0

Je ne suis pas en utilisant CYPHER pour effectuer des requêtes. J'ai mentionné ses rails que j'utilise. – vish4071

+0

Alors pouvez-vous partager un peu de code? – logisima

+0

Bien sûr, fait cela. – vish4071