2017-07-21 11 views

Antwort

3

Ich gehe davon aus, dass „B“ ist eine indizierte Eigenschaft namens „myid“:

g.V().has('myId','B'). 
    union(__(), 
     repeat(out()).emit()). 
    drop() 

Die Verwendung von union() macht zwei Dinge, wie es in diesem Fall zwei Argumente hat. Die erste ist die __(). Dies ist nur eine Identitätsfunktion. Es enthält den "B" -Knoten im Ergebnis der gelöschten Scheitelpunkte. Mit anderen Worten, die union() empfängt den "B" -Verschluss, wie er eingegeben wird, und wir machen nichts damit, außer es in die Ergebnisse der union() aufzunehmen. Das zweite Argument zu union nimmt den Vertex "B" und durchläuft rekursiv alle Kindknoten. Die Verwendung von emit() hier ist wichtig, da es die Wiederholung anweist, alle Kindknoten zurückzugeben, die es auf dem Weg findet (und nicht nur die Blätter des Baums).

In den Kommentaren wurde erwähnt, dass __() nicht von Microsoft-Version von Gremlin in ihrem .NET-Client unterstützt wird. Hoffentlich arbeiten sie daran. Ich denke, man kann mit diesem wenig Hässlichkeit um die Arbeit (oder etwas ähnliches nehme ich an):

g.V().has('myId','B'). 
    union(fold().unfold(), 
     repeat(out()).emit()). 
    drop() 

Ein weiterer Ansatz könnte sein, store() zu verwenden:

g.V().has('myId','B'). 
    store('d'). 
    repeat(out().store('d')). 
    cap('d'). 
    unfold(). 
    drop() 

Der store Ansatz nicht so schön ist wie der vorherige Ansatz, weil es eine List im Speicher erstellen muss, die Sie aus dem "d" -Seiteffekt mit cap() extrahieren und dann diese Liste zurück zum Iterator entfalten, um fallen gelassen zu werden.

+0

Hallo stephen, Danke für deine Wiederholung, ich bin neu im Gremlin, was bedeutet __ in der union Methode, ich habe eine Ausnahme "Der Name' __ 'existiert nicht im aktuellen Kontext ".Können Sie bitte erzählen – cva

+0

Danke für Ihre Beschreibung, ich habe versucht wie "gV(). hat ('id', 'thomas1'). union (gV ('thomas1'), wiederholen (out()). emit(). drop() "weil ich durch .net dort Identität Funktion innerhalb der Union durch Ausnahme. So habe ich versucht, wie oben, aber es nur die thomas1 Rand nicht thomas1 childs. – cva

+0

Das ist schade um' __() '. Ich bin ein bisschen Ich bin überrascht, dass das nicht unterstützt wird.Es ist der einfachste Schritt zu implementieren, und während es im Wesentlichen nur eine Pass-Through-Funktion ist, können Sie sehen, wo es seine Verwendung haben könnte .. Anyway, aktualisiert meine Antwort ... hoffentlich einer dieser beiden zusätzlichen Ansätze wird für dich arbeiten –

Verwandte Themen