Frage

Ich versuche, Beziehungen zwischen Knoten mit optionalen, aber spezifischen Knoten/Beziehungen dazwischen zu finden (neo4j 2.0 M6).

In meinem Datenmodell kann „Gen“ „PARTOF“ einer „Gruppe“ sein.Ich habe „INTERACT“-Beziehungen zwischen „Gen“-„Gen“, „Gen“-„Gruppe“ und „Gruppe“-„Gruppe“ (rote Linien im Modellbild).

Ich möchte dies auf alle „INTERACT“-Beziehungen zwischen „Gene“ reduzieren:beide direkt (Gene-INTERACT-Gene) und über eine oder zwei „Gruppen“ (Gene-PARTOF-Group-INTERACT-Gene).


enter image description here


Mit mehreren Cypher-Abfragen ist das natürlich einfach:

# direct INTERACT
MATCH (g1:Gene)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via one Group
MATCH (g1:Gene)-[:PARTOF]-(gr:Group)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via two Group
MATCH (g1:Gene)-[:PARTOF]-(gr1:Group)-[r:INTERACT]-(gr2:Group)-[:PARTOF]-(g2:Gene)
RETURN g1, g2

Aber wäre es möglich, eine einzelne Cypher-Abfrage zu erstellen, die optionale „Gruppenschritte“ im Pfad übernimmt?Bisher habe ich nur optionale Beziehungen und verwendet shortestPaths, aber ich habe keine Ahnung, ob ich nach einem oder zwei optionalen Knoten zwischen zwei Genen filtern kann.

War es hilfreich?

Lösung

Sie können jeder Beziehung, die Sie dem Pfad hinzufügen, eine Tiefe zwischen null und eins zuweisen.Versuchen Sie etwas wie

MATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN g1,g2

Und um zu sehen, wie die übereinstimmenden Pfade tatsächlich aussehen, geben Sie einfach den gesamten Pfad zurück

MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN p

Die Deklaration von Knotenbezeichnungen für die optionalen Teile dieses Musters ist jedoch etwas mühsam, daher geht diese Abfrage davon aus, dass Gene nicht Teil von etwas anderem als Gruppen sind und nur mit Gruppen und anderen Genen interagieren.Wenn ein Gen haben kann [:PARTOF] dann zu etwas anderem (gr1) wird das etwas binden und die Abfrage ist nicht mehr zuverlässig.Fügen Sie einfach eine where-Klausel hinzu, z

WHERE gr1:Group AND gr2:Group

schließt den Fall aus, in dem die optionalen Teile nicht übereinstimmen, sodass das nicht funktioniert (es wäre wie bei Ihrer dritten Abfrage).Ich bin mir sicher, dass es gelöst werden kann, aber wenn Ihr tatsächliches Modell nicht viel komplexer ist als das, was Sie in Ihrer Frage beschreiben, sollte dies der Fall sein.

Ich habe mir erlaubt, Ihr Modell in einer Konsole zu interpretieren Hier, probieren Sie es aus, um zu sehen, ob es das tut, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top