2017-07-21 2 views

Répondre

3

Je suppose que « B » est une propriété indexée appelée « myId »:

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

L'utilisation de union() fait deux choses comme dans ce cas, il a deux arguments. Le premier est le __(). Ceci est juste une fonction d'identité. Il inclut le sommet "B" dans le résultat des sommets déposés. En d'autres termes, le union() reçoit le vertex "B" en entrée, et nous ne faisons rien avec lui sauf l'inclure dans les résultats du union(). Le second argument du union prend le sommet "B" et parcourt récursivement pour trouver tous les sommets enfants. L'utilisation de emit() ici est importante car elle dit à la répétition de renvoyer tous les sommets enfants qu'elle trouve en chemin (et pas seulement les feuilles de l'arbre).

Dans les commentaires, il a été mentionné que __() n'est pas pris en charge par la version Microsoft de Gremlin dans leur client .NET. J'espère qu'ils y travaillent. Je suppose que vous pouvez contourner ce problème avec ce peu de laideur (ou quelque chose de similaire je suppose):

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

Une autre approche pourrait consister à utiliser store():

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

L'approche store est pas aussi belle comme l'approche précédente, car il doit construire un List dans la mémoire que vous extrayez de l'effet secondaire "d" avec cap() puis redéployez cette liste à l'itérateur à supprimer.

+0

Salut stephen, Merci pour votre replay, je suis nouveau au gremlin, qu'est-ce que __ signifie en méthode d'union, j'ai une exeption "Le nom" __ "n'existe pas dans le contexte actuel" .Peut-être tell – cva

+0

Merci pour votre description, j'ai essayé comme "gV(). has ('id', 'thomas1'). union (gV ('thomas1'), répétez (out()) .émit(). drop() "parce que j'utilise .net par l'intermédiaire de la fonction d'identité à l'intérieur de l'union par l'exception .So j'ai essayé comme ci-dessus Mais il a seulement baissé le bord thomas1 pas les enfants thomas1 – cva

+0

C'est trop mauvais sur' __() '. Je suis un peu C'est l'étape la plus facile à mettre en œuvre et, bien qu'il ne s'agisse essentiellement que d'une fonction de transfert, vous pouvez voir où cela pourrait avoir son utilité. travaillera pour vous –