2017-09-28 3 views
1

Je travaille actuellement avec un graphique qui indique les connexions entre les sommets. Les sommets peuvent être connectés dans les deux directions. Je suis curieux de savoir combien de sommets sont connectés les uns aux autres, quel que soit le sens de la connexion ou si des connexions existent dans les deux sens. Ainsi, par exemple, dans le graphique présenté ci-dessous, le nombre total de sommets connectés serait de 3 (alors qu'un simple comptage de bord nous indiquerait 4 arêtes).Gremlin: Nombre de connexions ignorant les arêtes avec une arête parallèle dans la direction opposée

Example Graph

En raison de la directionnalité des bords ce n'est pas le même problème résolu par la détection de bord en double fourni par les recettes Tinkerpop Y at-il une question Gremlin qui pourrait aider à ce chef d'accusation?

J'ai inclus quelques exemples de données ci-dessous:

vertex1 = graph.addVertex(“example","vertex1") 
vertex2 = graph.addVertex("example","vertex2") 
vertex3 = graph.addVertex("example","vertex3") 
vertex4 = graph.addVertex("example","vertex4") 

vertex1.addEdge("Connected_to",vertex2) 
vertex2.addEdge("Connected_to",vertex1) 
vertex2.addEdge("Connected_to",vertex3) 
vertex3.addEdge("Connected_to",vertex4) 

Je suis nouveau à la langue Gremlin et je ne parviens pas à créer une requête qui compte le nombre de connexions entre les sommets. Ce serait génial de recevoir de l'aide de votre part, alors que je me familiarise avec la complexité des requêtes Graph!

Répondre

2

Vous pouvez dedup() par les deux identifiants de sommets. Assurez-vous simplement d'avoir un ordre cohérent des deux sommets (par exemple ordre par leur identifiant), de sorte que la direction du bord n'a aucun impact.

gremlin> g.E() 
==>e[8][0-Connected_to->2] 
==>e[9][2-Connected_to->0] 
==>e[10][2-Connected_to->4] 
==>e[11][4-Connected_to->6] 
gremlin> g.E().dedup().by(bothV().order().by(id).fold()) 
==>e[8][0-Connected_to->2] 
==>e[10][2-Connected_to->4] 
==>e[11][4-Connected_to->6] 
gremlin> g.E().dedup().by(bothV().order().by(id).fold()).count() 
==>3 
+0

C'est une requête géniale et élégante. Je vous remercie! – Chris