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 richieste al server. Queste modalità di invio differiscono nel modo in cui le richieste 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 eventuali passaggi del terminale, e trasmette i risultati al client. I seguenti strumenti e metodi utilizzano la modalità script:
Console Gremlin: quando si utilizza il comando
:remoteInvio di stringhe di query tramite TinkerPop driver (ad esempio, utilizzando 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 l'intera query, inclusi.next(). Se non .next() trova risultati, il server genera un NoSuchElementException e la transazione viene annullata.
Modalità bytecode (oggetti che attraversano GLV)
In modalità bytecode, il client crea un oggetto di attraversamento localmente utilizzando una Gremlin Language Variant (GLV). Il driver serializza i passaggi di attraversamento come bytecode e li invia al server. I passaggi del terminale, ad esempio, .toList() .next() vengono 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 di attraversamento () 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 eseguita 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 le fasi del terminale. Se una fase del terminale
.next()fallisce perché il set di risultati è vuoto, il server considera la query come fallita e annulla la transazione. Il server non presenta alcuna mutazione nello stesso attraversamento (ad esempio).addV()Modalità bytecode: il client valuta i passaggi del terminale. Il server valuta solo le fasi di attraversamento, esegue correttamente la transazione e restituisce i risultati. Se il client richiama quindi un set di risultati
.next()vuoto, il risultatoNoSuchElementExceptionè solo un errore sul lato client. La transazione è già stata confermata, quindi il server persiste in caso di mutazione.
Fasi del terminale
In Gremlin, le fasi terminali
hasNext()— Restituiscetruese i risultati sono disponibili,falsealtrimenti.next()— Restituisce il risultato successivo. GeneraNoSuchElementExceptionse 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. Usalo per le mutazioni in cui non è necessario il valore restituito.
Nota
I GLV nelle singole lingue possono fornire passaggi terminali aggiuntivi specifici per la loro implementazione. Per i dettagli, consulta le pagine specifiche della lingua.
Se sviluppate e testate il codice in un unico contesto, potreste incorrere in problemi. Ad esempio, la console Gremlin invia le query 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
Assicuratevi di testare il codice Gremlin utilizzando la stessa modalità di invio in cui verrà distribuito, per evitare un comportamento imprevisto delle transazioni.