2017-06-16 6 views
1

Supposons que j'ai des noeuds indirectement liés à la relation spécifique, l'identifiant numérique d'un nœud dans Gremlin .. utilisé avecTrouver tous Gremlin

g.V(n_id) 

Dites ce nœud est un sujet.

Chaque sujet peut avoir une question avec la relation threadOf.

Chaque question peut avoir une réponse ou un commentaire avec relation threadOf

Si je reçois un identifiant numérique en entrée, je voudrais une requête gremlin qui renvoie toutes les questions liées à ce sujet et toutes les réponses ou commentaires liés à ces questions

Toutes les relations sont threadOf

est-ce possible avec Gremlin?

Répondre

5

Il y a plusieurs façons de faire cela avec Gremlin. Supposons que ce graphique (avec des questions de Gremlin il est toujours utile d'inclure un petit échantillon de graphique dans la question elle-même comme celui-ci):

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() 

Le graphique ci-dessus est un arbre de sorte qu'il pourrait être préférable de le retourner comme l'un. Pour ce faire, nous pouvons utiliser tree step. Le sujet est à id sommet « 0 » si nous voulons tous la hiérarchie « threadOf » nous pourrions faire:

gremlin> g.V(0L).out('threadOf').out('threadOf').tree().by('text') 
==>[topic:[question 1:[comment 2:[],comment 1:[],answer 1:[]],question 2:[answer 2:[]]]] 

Cela fonctionne, mais il suppose que nous connaissons la profondeur de l'arbre de « threadOf » bords (nous pas out() deux fois de sommet « 0 » Si nous ne savons pas la profondeur que nous pouvons faire.

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

Merci pour la réponse très détaillée .. la première solution fonctionne en partie lorsque j'utilise 'in' au lieu de Comme vous l'avez dit, je ne connais pas la profondeur de l'arbre, donc j'ai besoin d'utiliser la seconde solution, mais quand j'utilise 'in' pour ça, j'obtiens une erreur inattendue de jeton –

+0

' in' est un mot réservé dans groovy donc tu nie d le préfixer avec le nom de la classe pour cette importation statique de l'étape 'in()'. en d'autres termes, 'g.V (0L) .repeat (__. in ('threadOf')). emit(). tree(). par ('text')' –

+0

Incroyable !! Merci beaucoup –