Consulta Gremlin para encontrar el subgráfico completo al que un nodo específico está conectado de alguna manera
Soy nuevo en Gremlin y lo estoy usando gremlin-python
para 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_1
está conectadoCreditCard_A
con el1_HasCreditCard_A
bordeCustomer_2
está conectadoCreditCard_B
con el2_HasCreditCard_B
bordeCustomer_3
está conectadoCreditCard_A
con el3_HasCreditCard_A
borde
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_1
en la consulta, el subgráfico resultante contendríaCustomer_1
,Customer_3
,CreditCardA
,1_HasCreditCard_A
y3_HasCreditCard_A
. - Si especifiqué , el subgráfico
Customer_2
devuelto consistiría enCustomer_2
,CreditCard_B
,2_HasCreditCard_B
. - Si consulté
Customer_3
, se devolvería exactamente el mismo objeto de subgráfico que devolvió laCustomer_1
consulta.
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
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
emit
paso antes delrepeat
- Agregaría un
dedup
paso 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