Gremlin query per trovare l'intero sottografo a cui è connesso in qualche modo un nodo specifico

Aug 19 2020

Sono nuovo di zecca in Gremlin e sto usando gremlin-pythonper attraversare il mio grafico. Il grafico è composto da molti cluster o sottografi che sono interconnessi e non interconnessi con nessun altro cluster nel grafico.

Un semplice esempio di questo è un grafico con 5 nodi e 3 spigoli:

  • Customer_1è connesso CreditCard_Acon 1_HasCreditCard_Abordo
  • Customer_2è connesso CreditCard_Bcon 2_HasCreditCard_Bbordo
  • Customer_3è connesso CreditCard_Acon 3_HasCreditCard_Abordo

Voglio una query che restituisca un oggetto sottografico di tutti i nodi e i bordi collegati (dentro o fuori) al nodo interrogato. Posso quindi memorizzare questo sottografico come variabile e quindi eseguire diversi attraversamenti su di esso per calcolare cose diverse.

Questa query dovrebbe essere ricorsiva poiché questi cluster potrebbero essere costituiti da nodi che si trovano a molti salti (verso l'interno o verso l'esterno) l'uno dall'altro. Esistono anche molti tipi diversi di nodi e spigoli e tutti devono essere restituiti.

Per esempio:

  • Se ho specificato Customer_1nella query, il sottografo risultante conterrebbe Customer_1, Customer_3, CreditCardA, 1_HasCreditCard_Ae 3_HasCreditCard_A.
  • Se ho specificato Customer_2, il sottografo restituito sarebbe composto da Customer_2, CreditCard_B, 2_HasCreditCard_B.
  • Se eseguissi una query , verrebbe restituito Customer_3esattamente lo stesso oggetto sottografo restituito dalla query.Customer_1

Ho usato sia Neo4J con Cypher che Dgraph con GraphQL e ho trovato questo compito abbastanza facile in queste due lingue, ma sto lottando un po 'di più con la comprensione di Gremlin.

MODIFICARE:

Da questa domanda , la risposta selezionata dovrebbe ottenere ciò che voglio, ma senza specificare il tipo di bordo cambiando .both('created')solo in .both().

Tuttavia, la sintassi del ciclo: .loop{true}{true}ovviamente non è valida in Python. Questa funzione loop è disponibile in gremlin-python? Non riesco a trovare nulla.

MODIFICA 2:

Ho provato questo e sembra funzionare come previsto, credo.

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

È una soluzione valida per quello che sto cercando? È anche possibile includere il nodo interrogato in questo risultato?

Risposte

2 noam621 Aug 20 2020 at 13:51

Per quanto riguarda la seconda modifica, questa sembra una soluzione valida che restituisce tutti i vertici collegati al vertice iniziale. Alcune piccole correzioni:

  • puoi cambiare il bothE().otherV()toboth()
  • se vuoi ottenere anche il vertice di partenza devi spostare il emitgradino prima delrepeat
  • Aggiungerei un deduppassaggio per rimuovere tutti i vertici duplicati (può essere più di 1 percorso per un vertice)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

esempio:https://gremlify.com/jngpuy3dwg9