2016-09-15 2 views
0

Aus Gründen der Klarheit Zweck werden Schritt Namen als Bezeichner verwendetArangoDB - Wie finde ich Knoten, die nicht mit einem bestimmten verknüpft sind?

Ich habe folgendes gerichteten azyklischen Graphen (DAG):

DAG graph

Was ich versuche einen Knoten zu tun ist, zu wählen, und suchen Sie alle anderen Knoten, die nicht verbunden sind direkt an die ausgewählte, nur in einer ausgehenden Richtung.

Zum Beispiel: wenn ich "root step" wähle, sollte meine Abfrage nur "test step 3" zurückgeben, da es die einzige ist, die nicht direkt mit "root step" verbunden ist.

jedoch, wenn ich „Prüfschritt 2“ wählen, sollte es nur return „Prüfschritt 3“, und nicht „Prüfschritt“, weil „Prüfschritt * ist auf dem gleichen Niveau, dass“ Prüfschritt 2" ist

Vorerst ist hier, wie ich tun.

ich speichern, in jedem ‚‘., die Liste der Eltern es als Array (Prüfschritt hat Schritt [ ‚root Schritt‘] usw.)

Meine Abfrage lautet wie folgt (für Testschritt 2 als Beispiel):

FOR v, e IN 0..10 OUTBOUND "steps/test step 2" steps_relations 
    FILTER e._from != "steps/test step 2" 
    FILTER e._to != "steps/test step 2" 
    FILTER v._id != "steps/test step 2" 
    FILTER ["root step"] NONE IN v.parents 
RETURN {id: v._key, name: v.name } 

Für jetzt gibt es ein leeres Ergebnis anstelle des erwarteten ("Testschritt 3") zurück. Jede Hilfe wird sehr geschätzt

Antwort

1

Ich habe es endlich geschafft, dies zu beheben. Hier ist, wie ich es tat:

erste, habe ich zwei Felder zu jedem meiner „Stufen“ Dokument:

  • root: gleich true, wenn es die Wurzel des Baumes ist (wie „root Schritt"). Ansonsten verweist es einfach auf die interne ID des Root-Schritts

  • depth: ist gleich 0 für den Root-Schritt, wird aber inkrementiert. Wenn ich einen Schritt zu einem anderen hinzufüge, ist die Tiefe des neuen Schritts NUR dann gleich (Eltern + 1), wenn das Ergebnis größer als das tatsächlich gespeicherte ist.

Sobald ich diese haben, sieht meine Frage wie folgt:

Situation: Ich möchte alle Schritte zur Liste, die auf „Prüfschritt 2“ verknüpft werden können

FOR step, relation IN 0..10 ANY "steps/root step" steps_relations 
    FILTER step.depth > 1 /* THE DEPTH OF test step 2 WICH IS 1 */ 
    FILTER relation._from != "steps/test step 2" 
RETURN item 

Dies gibt erfolgreich "Testschritt 3"

0

Sie sollten lieber the min attribute verwenden, um direkt verbundene Kanten zu unterdrücken:

FOR v, e IN 2..10 OUTBOUND "steps/test step 2" steps_relations 
    RETURN {id: v._key, name: v.name } 

auf diese Weise erhalten Sie nur Pfade, die länger als ein Kantensprung sind, und die Eckpunkte ab 2.

Verwandte Themen