Frage

Dies ist ein Graph, dessen Knoten existieren in vielen verbundenen Komponenten auf einmal wegen eines Knotens Beziehungen sind eine Sammlung von Randgruppen, so dass nur eine Kante pro Kante Gruppe auf einmal vorhanden sein kann. Ich muss in der Lage, alle angeschlossenen Komponenten zu finden, die ein Knoten in vorhanden ist. Was ist der beste Weg wäre, diese Grafik in Neo4j zu speichern, um schnell alle angeschlossenen Komponenten zu finden, die ein Knoten in existiert? Gibt es eine Möglichkeit den in Querungen gebaut, dies zu tun?

Auch: Gibt es einen Namen für diese Art von Graph? Ich würde schätzen alle Hilfe / Ideen.

Update:

Es tut uns nicht klar. Alle Knoten sind vom gleichen Typ. Knoten eine variable Anzahl von Randgruppen. Genau eine Kante von jeder Kante Gruppe muss für eine bestimmte angeschlossene Komponente gewählt werden. Ich werde versuchen, durch Beispiel zu erklären:

Node x1 is related to: (x2 or x3 or x4) AND (x5 or x6) AND (x7)
Node x2 is related to: (x8) AND (x9 or x10)

So erste Randgruppe x1 (x2, x3, x4) ist, ist seine zweite Randgruppe (x5, x6), und seine dritte Randgruppe ist (x7).

Also hier sind ein paar verbundenen Komponenten, die x1 gibt es in:

KK1:

x1 is related to: x2, x5, x7
x2 is related to: x8 x9 

CC2:

x1 is related to: x2, x6, x7
x2 is related to: x8, x9

CC3:

x1 is related to: x3, x5, x7

CC4:

x1 is related to: x3, x6, x7

etc.

Ich bin dankbar für Ihre Hilfe in dieser.

Update2:

Ich glaube, ich werde in der Lage sein, dies zu tun, wenn es eine Antwort auf diese Frage: wie kann ich den Beziehungstyp zu verwenden, als eine Funktion des aktuellen Knotens bei jedem Schritt eines Traversal mit Neo4j angeben?

War es hilfreich?

Lösung

Sie so, wie ich verstehe Ihre Frage, die Sie haben eine Reihe von Knoten, nennen wir sie X Knoten , die zu einer Anzahl von Knoten des Typs (oder so ähnlich) verbunden sind, nennen wir diese Knoten em < > T-Knoten . Ein X-Knoten kann Verbindungen zu mehrere T-Knoten hat, aber nur eine Verbindung zu jedem T-Knoten oder möglicherweise nur eine Verbindung zu jedem Art von T-Knoten (Ihre Beschreibung ein wenig unscharf ist hier).

So wie ich dies durch die Verwendung einer Relationship für jeden (Art) T-Knoten modellieren würde. Dann können Sie verwenden x_node.getRelationships (T_TYPE_ONE, T_TYPE_TWO, ... etc ...), um alle T-Knoten von einem X-Knoten zu erhalten. Wenn Sie einen X-Knoten mutieren ist, wo Sie Ihre invariant pflegen müssen, dass es nur höchstens eine Beziehung zu jedem (Art) T Knoten haben kann. Sie tun dies durch die Verwendung x_node.getSingleRelationship (THE_T_TYPE_YOURE_MUTATING), wenn das null zurückgibt, es ist sicher eine neue Beziehung dieser Art zu addieren, wenn es eine Beziehung gibt, werden Sie es entfernen, bevor Sie den neuen hinzufügen können.

ASCII-art Beispiel für dieses Modell (wie ich es interpretieren):

(x1)--T_ONE-->(t1a)   (t1b)<--T_ONE--(x2)--T_FOUR-->(t4a)
 |\                                   |
 \ |---T_TWO-->(t2a)                 /
  \                                 /
   |---T_THREE-->(t3a)<--T_THREE---/

In dem obigen Beispiel beiden X-Knoten sind Teil T_ONE Komponenten, sondern x1 ist ein Teil von T_ONE Komponente T1a und x2 ist ein Teil von T1b. Sie sind beide Teil der T_THREE Komponente T3a, dann ist x1 Teil T_TWO Komponente T2a und x2 ist ein Teil von T_FOUR Komponente t4a. Abfragt in diesem Beispiel würde in etwa so aussehen:

Iterable<Relationship> x1_comps = x1.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);
Iterable<Relationship> x2_comps = x2.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);

Und Aktualisierung würde wie folgt aussehen:

void setComponent(Node xNode, RelationshipType tType, Node tNode) {
    Relationship current = xNode.getSingleRelationship(tType);
    if (current != null) current.delete();
    xNode.createRelationshipTo(tNode, tType);
}

Bitte lassen Sie mich wissen, wenn ich Ihre Anforderungen falsch interpretiert habe, und ich werde glücklich sein, Ihre aktualisierte Beschreibung einen Stich zu geben.

Andere Tipps

In Bezug auf der anderen Abfrage, wies ich auf einige Möglichkeiten für feinkörnige Funktionen aus: wie kann ich der Beziehungstyp zu verwenden, als eine Funktion des aktuellen Knotens bei jedem Schritt eines Traversal mit Neo4j angeben? Im Grunde genommen keine traverser verwenden, aber die direkter node.getRelationship * API und Ihre eigene Iteration für feinkörnige Kontrolle bauen.

Ist das Ihr Problem lösen?

/ Peter Neubauer

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