2017-06-16 3 views
1

Angenommen, ich die numerische ID eines Knotens in Gremlin haben .. verwendet mitFinden aller indirekt verbundenen Knoten mit spezifischen Beziehung Gremlin

g.V(n_id) 

Sagen Sie diesen Knoten ein Thema ist.

Jedes Thema kann eine Frage mit der Beziehung threadOf haben.

kann jede Frage eine Antwort oder einen Kommentar mit Beziehung threadOf

Wenn ich eine numerische ID erhalten als Eingabe ich ein Gremlin Abfrage möchten, die alle Fragen zu diesem Thema zurück und alle Antworten oder Kommentare im Zusammenhang mit diesen Fragen

Alle Beziehungen sind threadOf

Ist dies möglich mit Gremlin?

Antwort

5

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:[]]]] 
+0

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. –

+0

' 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')' –

+0

Erstaunlich !! Vielen Dank –

Verwandte Themen