Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Test del codice Gremlin nel contesto in cui verrà implementato
Gremlin offre ai client diversi modi per inviare domande al server. Queste modalità di invio differiscono nel modo in cui le interrogazioni vengono valutate e nel comportamento delle transazioni. Queste differenze possono portare a risultati inaspettati se si sviluppa in una modalità e si implementa in un'altra.
Modalità script (invio basato su stringhe)
In modalità script, il client invia l'intera query come stringa di testo al server. Il server valuta la stringa completa, inclusi tutti i passaggi del terminale, e trasmette i risultati al client. I seguenti strumenti e metodi utilizzano la modalità script:
Gremlin Console: quando si utilizza il comando
:remoteInvio di stringhe di query tramite TinkerPop driver (ad esempio, utilizzo in Java)
client.submit("g.V().count()")
In modalità script, il client invia una query come la seguente al server come stringa completa:
// Script mode – the entire string, including .next(), is sent to the server // V('non-existing-id') yields nothing because no vertex with that ID exists Cluster cluster = Cluster.build().addContactPoint("your-neptune-endpoint") .port(8182).enableSsl(true).create(); Client client = cluster.connect(); client.submit("g.V('existing-id').addV('person').V('non-existing-id').next()");
Il server valuta la query completa, inclusi.next(). Se non .next() trova risultati, il server genera un NoSuchElementException e la transazione viene ripristinata.
modalità bytecode (oggetti trasversali GLV)
In modalità bytecode, il client crea un oggetto trasversale localmente utilizzando una Gremlin Language Variant (GLV). Il driver serializza le fasi di attraversamento come bytecode e le invia al server. Passaggi terminali come .toList() o .next() eseguiti sul lato client per iterare sui risultati restituiti dal server. È possibile utilizzare la modalità bytecode con Java, Python, Go JavaScript, .NET e altri TinkerPop-compliant driver di terze parti adatti alla versione del motore Neptune utilizzata.
In modalità bytecode, la stessa query ha il seguente aspetto:
// Bytecode mode – the driver sends the traversal steps as bytecode // .next() executes on the client to iterate results Cluster cluster = Cluster.build().addContactPoint("your-neptune-endpoint") .port(8182).enableSsl(true).create(); GraphTraversalSource g = traversal().withRemote( DriverRemoteConnection.using(cluster)); g.V("existing-id").addV("person").V("non-existing-id").next();
Il driver invia solo i passaggi trasversali () g.V().addV().V() come bytecode. Il server valuta correttamente l'attraversamento, esegue il commit della transazione e restituisce il set di risultati. Il client chiama quindi .next() localmente per leggere il set di risultati. Se il set di risultati è vuoto, il client genera unNoSuchElementException, ma la transazione è già stata confermata sul server.
Differenze nel comportamento delle transazioni
La differenza fondamentale tra queste modalità è il modo in cui le fasi terminali influiscono sulle transazioni:
Modalità script: il server valuta i passaggi del terminale. Se un'operazione del terminale
.next()fallisce perché il set di risultati è vuoto, il server considera la query come fallita e ripristina la transazione. Il server non presenta alcuna mutazione persistente nello stesso attraversamento (ad esempio).addV()Modalità bytecode: il client valuta i passaggi del terminale. Il server valuta solo le fasi trasversali, esegue correttamente la transazione e restituisce i risultati. Se il client richiama
.next()quindi un set di risultati vuoto, il risultatoNoSuchElementExceptionè solo un errore lato client. La transazione è già stata confermata, quindi il server mantiene eventuali mutazioni.
Fasi del terminale
In Gremlin, le fasi terminali sono le fasi
hasNext()— Restituiscetruese i risultati sono disponibili,falsealtrimenti.next()— Restituisce il risultato successivo. LanciaNoSuchElementExceptionse non esistono risultati.next(n)— Restituisce inrisultati successivi sotto forma di elenco.toList()— Restituisce tutti i risultati sotto forma di elenco. Restituisce un elenco vuoto se non esistono risultati.toSet()— Restituisce tutti i risultati come set. Restituisce un set vuoto se non esistono risultati.iterate()— Itera tutti i risultati senza restituirli. Utilizzatelo per le mutazioni in cui non è necessario il valore restituito.
Nota
I GLV in lingue individuali possono fornire passaggi terminali aggiuntivi specifici per la loro implementazione. Consultate le pagine specifiche della lingua per i dettagli.
Se sviluppate e testate il codice in un contesto, potete incorrere in problemi. Ad esempio, la console Gremlin invia le interrogazioni come script. Il codice potrebbe comportarsi diversamente in produzione se lo si distribuisce in un contesto diverso, ad esempio tramite il driver Java utilizzando il bytecode.
Importante
Assicurati di testare il codice Gremlin utilizzando la stessa modalità di invio in cui verrà distribuito, per evitare comportamenti inaspettati nelle transazioni.