Consulta Gremlin para encontrar el subgráfico completo al que un nodo específico está conectado de alguna manera

Aug 19 2020

Soy nuevo en Gremlin y lo estoy usando gremlin-pythonpara recorrer mi gráfico. El gráfico se compone de muchos grupos o subgráficos que están interconectados y no interconectados con ningún otro grupo en el gráfico.

Un ejemplo simple de esto es un gráfico con 5 nodos y 3 aristas:

  • Customer_1está conectado CreditCard_Acon el 1_HasCreditCard_Aborde
  • Customer_2está conectado CreditCard_Bcon el 2_HasCreditCard_Bborde
  • Customer_3está conectado CreditCard_Acon el 3_HasCreditCard_Aborde

Quiero una consulta que devuelva un objeto de subgráfico de todos los nodos y bordes conectados (dentro o fuera) al nodo consultado. Luego puedo almacenar este subgráfico como una variable y luego ejecutar diferentes recorridos en él para calcular cosas diferentes.

Esta consulta tendría que ser recursiva, ya que estos clústeres podrían estar formados por nodos que están a muchos saltos (hacia adentro o hacia afuera) entre sí. También hay muchos tipos diferentes de nodos y aristas, y todos deben devolverse.

Por ejemplo:

  • Si lo especifiqué Customer_1en la consulta, el subgráfico resultante contendría Customer_1, Customer_3, CreditCardA, 1_HasCreditCard_Ay 3_HasCreditCard_A.
  • Si especifiqué , el subgráfico Customer_2devuelto consistiría en Customer_2, CreditCard_B, 2_HasCreditCard_B.
  • Si consulté Customer_3, se devolvería exactamente el mismo objeto de subgráfico que devolvió la Customer_1consulta.

He usado tanto Neo4J con Cypher como Dgraph con GraphQL y encontré esta tarea bastante fácil en estos dos idiomas, pero me cuesta un poco más entender gremlin.

EDITAR:

A partir de esta pregunta , la respuesta seleccionada debería lograr lo que quiero, pero sin especificar el tipo de borde cambiando .both('created')solo a .both().

Sin embargo, la sintaxis del bucle: .loop{true}{true}no es válida en Python, por supuesto. ¿Esta función de bucle está disponible en gremlin-python? No puedo encontrar nada.

EDITAR 2:

He intentado esto y parece estar funcionando como se esperaba, creo.

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

¿Es esta una solución válida para lo que estoy buscando? ¿También es posible incluir el nodo consultado en este resultado?

Respuestas

2 noam621 Aug 20 2020 at 13:51

Con respecto a la segunda edición, parece una solución válida que devuelve todos los vértices conectados al vértice inicial. Algunas pequeñas correcciones:

  • puedes cambiar el bothE().otherV()aboth()
  • si desea obtener también el vértice inicial, debe mover el emitpaso antes delrepeat
  • Agregaría un deduppaso para eliminar todos los vértices duplicados (puede haber más de 1 ruta a un vértice)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

ejemplo:https://gremlify.com/jngpuy3dwg9