Requête Gremlin pour trouver le sous-graphe entier auquel un nœud spécifique est connecté de quelque manière que ce soit
Je suis nouveau sur Gremlin et j'utilise gremlin-python
pour 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_1
est connectéCreditCard_A
à1_HasCreditCard_A
bordCustomer_2
est connectéCreditCard_B
à2_HasCreditCard_B
bordCustomer_3
est connectéCreditCard_A
à3_HasCreditCard_A
bord
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_1
dans la requête, le sous-graphe résultant contiendraitCustomer_1
,Customer_3
,CreditCardA
,1_HasCreditCard_A
et3_HasCreditCard_A
. - Si je spécifiais
Customer_2
, le sous-graphe renvoyé serait composé deCustomer_2
,CreditCard_B
,2_HasCreditCard_B
. - Si j'interrogeais
Customer_3
, le même objet de sous-graphe que celui renvoyé par laCustomer_1
requê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
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