Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Uji kode Gremlin dalam konteks Anda akan menyebarkannya
Gremlin menyediakan beberapa cara bagi klien untuk mengirimkan kueri ke server. Mode pengiriman ini berbeda dalam bagaimana kueri dievaluasi dan bagaimana transaksi berperilaku. Perbedaan ini dapat menyebabkan hasil yang tidak terduga jika Anda mengembangkan dalam satu mode dan menerapkan di mode lain.
Mode skrip (pengiriman berbasis string)
Dalam mode skrip, klien mengirimkan seluruh kueri sebagai string teks ke server. Server mengevaluasi string lengkap, termasuk langkah-langkah terminal apa pun, dan mengalirkan hasilnya kembali ke klien. Alat dan metode berikut menggunakan mode skrip:
Konsol Gremlin — saat menggunakan perintah
:remoteMengirimkan string kueri melalui TinkerPop driver (misalnya, menggunakan
client.submit("g.V().count()")di Java)
Dalam mode skrip, klien mengirimkan kueri seperti berikut ke server sebagai string lengkap:
// 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()");
Server mengevaluasi kueri lengkap termasuk.next(). Jika tidak .next() menemukan hasil, server menaikkan NoSuchElementException dan transaksi berputar kembali.
Mode bytecode (objek traversal GLV)
Dalam mode bytecode, klien membangun objek traversal secara lokal menggunakan Gremlin Language Variant (GLV). Pengemudi membuat serial langkah traversal sebagai bytecode dan mengirimkannya ke server. Langkah-langkah terminal seperti .toList() atau .next() eksekusi di sisi klien untuk mengulangi hasil yang dikembalikan oleh server. Anda dapat menggunakan mode bytecode dengan Java, Python, Go, .NET JavaScript, dan TinkerPop-compliant driver pihak ketiga lainnya yang sesuai dengan versi mesin Neptunus yang digunakan.
Dalam mode bytecode, kueri yang sama terlihat seperti ini:
// 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();
Driver hanya mengirimkan traversal steps (g.V().addV().V()) sebagai bytecode. Server berhasil mengevaluasi traversal, melakukan transaksi, dan mengembalikan set hasil. Klien kemudian memanggil .next() secara lokal untuk membaca dari set hasil. Jika set hasil kosong, klien menaikkanNoSuchElementException, tetapi transaksi telah dilakukan di server.
Perbedaan perilaku transaksi
Perbedaan kritis antara mode ini adalah bagaimana langkah-langkah terminal memengaruhi transaksi:
Mode skrip — Server mengevaluasi langkah-langkah terminal. Jika langkah terminal seperti
.next()gagal karena set hasil kosong, server memperlakukan kueri sebagai gagal dan memutar kembali transaksi. Server tidak mempertahankan mutasi apa pun dalam traversal yang sama (seperti).addV()Mode Bytecode — Klien mengevaluasi langkah-langkah terminal. Server hanya mengevaluasi langkah-langkah traversal, berhasil melakukan transaksi, dan mengembalikan hasil. Jika klien kemudian memanggil set hasil
.next()kosong, yang dihasilkanNoSuchElementExceptionadalah kesalahan sisi klien saja. Transaksi telah dilakukan, sehingga server tetap melakukan mutasi apa pun.
Langkah-langkah terminal
Di Gremlin, langkah terminal adalah langkah-langkah
hasNext()— Pengembaliantruejika hasil tersedia,falsejika tidak.next()— Mengembalikan hasil berikutnya. MelemparNoSuchElementExceptionjika tidak ada hasil.next(n)— Mengembalikannhasil berikutnya sebagai daftar.toList()— Mengembalikan semua hasil sebagai daftar. Mengembalikan daftar kosong jika tidak ada hasil.toSet()— Mengembalikan semua hasil sebagai satu set. Mengembalikan set kosong jika tidak ada hasil.iterate()— Mengulangi semua hasil tanpa mengembalikannya. Gunakan ini untuk mutasi di mana Anda tidak memerlukan nilai pengembalian.
catatan
GLV bahasa individual dapat memberikan langkah-langkah terminal tambahan khusus untuk implementasinya. Lihat halaman khusus bahasa untuk detailnya.
Jika Anda mengembangkan dan menguji kode Anda dalam satu konteks, Anda dapat mengalami masalah. Misalnya, konsol Gremlin mengirimkan kueri sebagai skrip. Kode Anda mungkin berperilaku berbeda dalam produksi jika Anda menerapkannya dalam konteks yang berbeda, seperti melalui driver Java menggunakan bytecode.
penting
Pastikan untuk menguji kode Gremlin menggunakan mode pengiriman yang sama di mana ia akan digunakan, untuk menghindari perilaku transaksi yang tidak terduga.