2017-07-07 3 views
1

Ich habe zwei Knoten zwischen denen, die gleiche Kante mit der gleichen Eigenschaft immer und immer wieder erstellt wird. Wie kann ich das vermeiden? Wenn die Kanten unterschiedliche Eigenschaften haben, ist es in Ordnung und es muss beibehalten werden, aber wenn die Eigenschaften identisch sind, sollte nur eine Kante vorhanden sein.Doppelte Kanten mit gleichen Eigenschaften neo4j

EDIT: Ich benutze Schienen und ich möchte dies über die Anwendung und nicht Cypher Abfrage tun.

EDIT: einige Codes für Relevanz Gemeinsame Nutzung:

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

Also, was ich will, ist, wenn ich Eingabe derselben Krankheit und Faktor, den Rand nicht dupliziert (was es gerade tut) als Eigenschaft festgelegt wird, ist auch gleich. Ändert sich diese p1 in Zukunft zu p2, sollte die Kante hinzugefügt werden.

Siehe Beitrag Neo4j inconsistent behaviour of model classes für Modellklassen (Krankheit und Faktor).

Antwort

1

Sie haben zwei Möglichkeiten. Sie könnten die unique Option auf Ihrem Verband (n) verwenden:

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

Dies Sie alles von dort nur als einer dieser Beziehung Typ zwischen zwei Knoten (unabhängig von Eigenschaften), um nur die Erstellung von einzigartigen angeben kann, Knoten, wenn alle Eigenschaften genau gleich sind. Wenn Sie ein ActiveRel Modell erstellen, können Sie auch die gleiche Sache mit der creates_unique Erklärung:

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

+0

Aber in diesem Fall, für verschiedene Eigenschaften auch, werde ich nicht in der Lage sein, mehrere Kanten zu machen, richtig? – vish4071

+0

Oder es scheint "einzigartig: alles" ist was ich will ?! – vish4071

+0

Wenn Sie 'unique: true' /' unique:: none' verwenden (beide sind identisch), wird nur eine Beziehung dieses Beziehungstyps erstellt. Wenn Sie "unique:: all" angeben, wird immer eine neue Beziehung erstellt, sofern nicht alle Attribute identisch sind. Mit der Option ': on' können Sie Eigenschaften genauer spezifizieren –

1

Sie müssen MERGE Schlüsselwort in cypher verwenden: es ein Muster zuordnen oder erstellen Sie es, wenn es nicht existiert.

Dies ist ein Beispiel auf dem Film Graph basiert:

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

Sie können diese Abfrage mehrfach ausführen, werden Sie nur eine Kante zwischen Neo & Matrix haben.

Prost

+0

Ich bin nicht CYPHER für die Abfrage verwenden. Ich habe seine Schienen erwähnt, die ich benutze. – vish4071

+0

Also können Sie ein wenig Code teilen? – logisima

+0

Sicher, hat das gemacht. – vish4071

Verwandte Themen