View a markdown version of this page

Uji kode Gremlin dalam konteks Anda akan menyebarkannya - Amazon Neptune

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 query ke server. Mode pengiriman ini berbeda dalam cara 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 terminal apa pun, dan mengalirkan hasilnya kembali ke klien. Alat dan metode berikut menggunakan mode skrip:

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 a NoSuchElementException dan transaksi di putar kembali.

Mode Bytecode (objek traversal GLV)

Dalam mode bytecode, klien membangun objek traversal secara lokal menggunakan Gremlin Language Variant (GLV). Driver membuat serial langkah-langkah traversal sebagai bytecode dan mengirimkannya ke server. Langkah-langkah terminal seperti .toList() atau .next() jalankan 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 Neptune 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();

Pengemudi hanya mengirimkan langkah traversal (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 kumpulan hasil. Jika set hasil kosong, klien menaikkan aNoSuchElementException, tetapi transaksi telah dilakukan di server.

Perbedaan perilaku transaksi

Perbedaan kritis antara mode ini adalah bagaimana langkah-langkah terminal mempengaruhi transaksi:

  • Mode skrip — Server mengevaluasi langkah-langkah terminal. Jika langkah terminal seperti .next() gagal karena set hasil kosong, server memperlakukan kueri sebagai gagal dan mengembalikan transaksi. Server tidak mempertahankan mutasi apa pun dalam traversal yang sama (sepertiaddV()).

  • Mode Bytecode — Klien mengevaluasi langkah-langkah terminal. Server hanya mengevaluasi langkah-langkah traversal, berhasil melakukan transaksi, dan mengembalikan hasil. Jika klien kemudian memang .next() gil kumpulan hasil kosong, hasilnya NoSuchElementException hanya kesalahan sisi klien. Transaksi telah dilakukan, sehingga server mempertahankan mut asi apa pun.

Langkah terminal

Di Gremlin, langkah terminal adalah langkah-langkah yang menyebabkan traversal diserahkan ke Neptunus untuk evaluasi. Dalam mode bytecode, langkah terminal memicu driver untuk membuat serial dan mengirim traversal. Dalam mode skrip, langkah terminal adalah bagian dari string kueri yang dievaluasi pada server. Langkah-langkah terminal adalah:

  • hasNext()— Meng true embalikan jika hasil tersedia, false sebaliknya.

  • next()— Mengembalikan hasil berikutnya. Melempar NoSuchElementException jika tidak ada hasil.

  • next(n)— Mengembalikan n hasil 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 individu dapat menyediakan 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 menyebarkannya dalam konteks yang berbeda, seperti melalui driver Java menggunakan bytecode.

penting

Pastikan untuk menguji kode Gremlin menggunakan mode pengiriman yang sama di mana kode tersebut akan digunakan, untuk menghindari perilaku transaksi yang tidak terduga.