Gremlin query per trovare l'intero sottografo a cui è connesso in qualche modo un nodo specifico
Sono nuovo di zecca in Gremlin e sto usando gremlin-python
per 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
è connessoCreditCard_A
con1_HasCreditCard_A
bordoCustomer_2
è connessoCreditCard_B
con2_HasCreditCard_B
bordoCustomer_3
è connessoCreditCard_A
con3_HasCreditCard_A
bordo
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_1
nella query, il sottografo risultante conterrebbeCustomer_1
,Customer_3
,CreditCardA
,1_HasCreditCard_A
e3_HasCreditCard_A
. - Se ho specificato
Customer_2
, il sottografo restituito sarebbe composto daCustomer_2
,CreditCard_B
,2_HasCreditCard_B
. - Se eseguissi una query , verrebbe restituito
Customer_3
esattamente 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
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
emit
gradino prima delrepeat
- Aggiungerei un
dedup
passaggio 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