Requête Gremlin pour trouver le sous-graphe entier auquel un nœud spécifique est connecté de quelque manière que ce soit

Aug 19 2020

Je suis nouveau sur Gremlin et j'utilise gremlin-pythonpour parcourir mon graphique. Le graphe est composé de nombreux clusters ou sous-graphes qui sont intra-connectés et non interconnectés avec un autre cluster du graphe.

Un exemple simple de ceci est un graphe avec 5 nœuds et 3 arêtes :

  • Customer_1est connecté CreditCard_Aà 1_HasCreditCard_Abord
  • Customer_2est connecté CreditCard_Bà 2_HasCreditCard_Bbord
  • Customer_3est connecté CreditCard_Aà 3_HasCreditCard_Abord

Je veux une requête qui renverra un objet sous-graphique de tous les nœuds et arêtes connectés (in ou out) au nœud interrogé. Je peux ensuite stocker ce sous-graphe en tant que variable, puis exécuter différentes traversées dessus pour calculer différentes choses.

Cette requête devrait être récursive car ces clusters pourraient être constitués de nœuds éloignés les uns des autres de nombreux sauts (entrants ou sortants). Il existe également de nombreux types de nœuds et d'arêtes différents, et ils doivent tous être renvoyés.

Par exemple:

  • Si je spécifiais Customer_1dans la requête, le sous-graphe résultant contiendrait Customer_1, Customer_3, CreditCardA, 1_HasCreditCard_Aet 3_HasCreditCard_A.
  • Si je spécifiais Customer_2, le sous-graphe renvoyé serait composé de Customer_2, CreditCard_B, 2_HasCreditCard_B.
  • Si j'interrogeais Customer_3, le même objet de sous-graphe que celui renvoyé par la Customer_1requête serait renvoyé.

J'ai utilisé à la fois Neo4J avec Cypher et Dgraph avec GraphQL et j'ai trouvé cette tâche assez facile dans ces deux langages, mais j'ai un peu plus de mal à comprendre le gremlin.

ÉDITER:

À partir de cette question , la réponse sélectionnée devrait atteindre ce que je veux, mais sans spécifier le type de bord en changeant .both('created')juste .both().

Cependant, la syntaxe de la boucle : .loop{true}{true}n'est bien sûr pas valide en Python. Cette fonction de boucle est-elle disponible dans gremlin-python? Je ne trouve rien.

ÉDITION 2 :

J'ai essayé ceci et cela semble fonctionner comme prévu, je pense.

g.V(node_id).repeat(bothE().otherV().simplePath()).emit()

Est-ce une solution valable pour ce que je recherche? Est-il également possible d'inclure le nœud interrogé dans ce résultat ?

Réponses

2 noam621 Aug 20 2020 at 13:51

En ce qui concerne la deuxième modification, cela ressemble à une solution valide qui renvoie tous les sommets connectés au sommet de départ. Quelques petites corrections :

  • vous pouvez changer le bothE().otherV()enboth()
  • si vous voulez également obtenir le sommet de départ, vous devez déplacer l' emitétape avant lerepeat
  • J'ajouterais une dedupétape pour supprimer tous les sommets en double (il peut y avoir plus d'un chemin vers un sommet)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

exemple :https://gremlify.com/jngpuy3dwg9