Es gibt ein paar Möglichkeiten, wie Sie das mit Gremlin machen können. Lassen Sie uns dieses Diagramm übernehmen (mit Gremlin Fragen ist es immer hilfreich, eine kleine grafische Darstellung Probe in der Frage, wie sich diese schließen):
gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('topic').property('text','topic').as('t').
......1> addV('question').property('text','question 1').as('q1').
......2> addV('question').property('text','question 2').as('q2').
......3> addV('comment').property('text','comment 1').as('c1').
......4> addV('comment').property('text','comment 2').as('c2').
......5> addV('answer').property('text','answer 1').as('a1').
......6> addV('answer').property('text','answer 2').as('a2').
......7> addE('threadOf').from('t').to('q1').
......8> addE('threadOf').from('t').to('q2').
......9> addE('threadOf').from('q1').to('c1').
.....10> addE('threadOf').from('q1').to('c2').
.....11> addE('threadOf').from('q1').to('a1').
.....12> addE('threadOf').from('q2').to('a2').iterate()
Die obige Grafik ist ein Baum, so dass es am besten sein, könnte es als ein zurückzukehren. Um dies zu tun, können wir tree step verwenden. Das Thema ist bei Vertex-ID „0“ so, wenn wir alle „threadOf“ Hierarchie wünschen konnten wir gerade tun:
gremlin> g.V(0L).out('threadOf').out('threadOf').tree().by('text')
==>[topic:[question 1:[comment 2:[],comment 1:[],answer 1:[]],question 2:[answer 2:[]]]]
Das funktioniert, aber es wird davon ausgegangen wir die Tiefe des Baumes der „threadOf“ Kanten kennen (wir out()
zweimal von Vertex „0“ Schritt, wenn wir die Tiefe nicht wissen, was wir tun können.
gremlin> g.V(0L).repeat(out('threadOf')).emit().tree().by('text')
==>[topic:[question 1:[comment 2:[],comment 1:[],answer 1:[]],question 2:[answer 2:[]]]]
Vielen Dank für die sehr ausführliche Antwort .. die erste Lösung funktioniert teilweise, wenn ich 'verwenden in' statt "out". Wie du sagtest, kenne ich die Tiefe des Baumes nicht, also brauche ich die zweite Lösung. Wenn ich 'in' dafür benutze, bekomme ich einen unerwarteten Token Fehler. –
' in' ist ein reserviertes Wort in groovy also brauchst du d, um es mit dem Klassennamen für diesen statischen Import des 'in()' Schrittes voranzutreiben. mit anderen Worten, 'g.V (0L) .repeat (__. in ('threadOf')). emit(). tree(). by ('text')' –
Erstaunlich !! Vielen Dank –