Petunjuk joinOrder SPARQL kueri - Amazon Neptune

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Petunjuk joinOrder SPARQL kueri

Saat Anda mengirimkan SPARQL kueri, mesin kueri Amazon Neptunus menyelidiki struktur kueri. Mesin tersebut mengurutkan ulang bagian dari kueri dan mencoba untuk meminimalkan jumlah pekerjaan yang diperlukan untuk evaluasi dan waktu respon kueri.

Misalnya, urutan pola tripel yang terhubung biasanya tidak dievaluasi dalam urutan yang diberikan. Urutan tersebut diurutkan ulang menggunakan heuristik dan statistik seperti selektivitas masing-masing pola dan bagaimana mereka terhubung melalui variabel bersama. Selain itu, jika kueri Anda berisi pola yang lebih kompleks seperti subkueri,FILTERs, atau kompleks OPTIONAL atau MINUS blok, mesin kueri Neptunus menyusunnya kembali jika memungkinkan, bertujuan untuk urutan evaluasi yang efisien.

Untuk kueri yang lebih kompleks, urutan di mana Neptune memilih untuk mengevaluasi kueri mungkin tidak selalu optimal. Misalnya, Neptune mungkin kehilangan karakteristik spesifik data instans (seperti mencapai node daya dalam grafik) yang muncul selama evaluasi kueri.

Jika Anda tahu karakteristik data yang tepat dan ingin secara manual mendikte urutan eksekusi kueri, gunakan petunjuk kueri joinOrder Neptune untuk menentukan bahwa kueri dievaluasi dalam urutan yang diberikan.

joinOrderSPARQLsintaks petunjuk

Petunjuk joinOrder kueri ditentukan sebagai pola rangkap tiga yang disertakan dalam SPARQL kueri.

Untuk kejelasan, sintaks berikut menggunakan awalan hint yang didefinisikan dan disertakan dalam kueri untuk menentukan namespace petunjuk kueri Neptune:

PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> scope hint:joinOrder "Ordered" .
Cakupan yang Tersedia
  • hint:Query

  • hint:Group

Untuk informasi lebih lanjut tentang cakupan petunjuk kueri, lihat Lingkup petunjuk SPARQL kueri di Neptunus.

joinOrderSPARQLcontoh petunjuk

Bagian ini menunjukkan kueri yang ditulis dengan dan tanpa petunjuk kueri joinOrder dan optimasi terkait.

Sebagai contoh, asumsikan bahwa set data berisi hal berikut ini:

  • Satu orang bernama John yang :likes 1.000 orang, termasuk Jane.

  • Satu orang bernama Jane yang :likes 10 orang, termasuk John.

Tidak Ada Petunjuk Kueri

SPARQLKueri berikut mengekstrak semua pasangan orang bernama John dan Jane yang keduanya saling menyukai dari satu set data jejaring sosial:

PREFIX : <https://example.com/> SELECT ?john ?jane { ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }

Mesin kueri Neptune mungkin mengevaluasi pernyataan dalam urutan yang berbeda dari yang ditulis. Sebagai contoh, mesin mungkin memilih untuk menilai dalam susunan berikut:

  1. Temukan semua orang yang bernama John.

  2. Temukan semua orang yang terhubung ke John berdasarkan edge :likes.

  3. Saring set ini berdasarkan orang yang bernama Jane.

  4. Saring set ini berdasarkan orang yang terhubung ke John berdasarkan edge :likes.

Menurut set data, mengevaluasi dalam urutan ini menghasilkan 1.000 entitas yang diekstraksi pada langkah kedua. Langkah ketiga mempersempit ini ke node tunggal, Jane. Langkah terakhir kemudian menentukan bahwa Jane juga :likes node John.

Petunjuk Kueri

Akan menguntungkan untuk memulai dengan node Jane karena dia hanya memiliki 10 edge :likes keluar. Hal ini mengurangi jumlah pekerjaan selama evaluasi kueri dengan menghindari ekstraksi 1.000 entitas selama langkah kedua.

Contoh berikut menggunakan petunjuk joinOrderkueri untuk memastikan bahwa Jane node dan tepi keluarnya diproses terlebih dahulu dengan menonaktifkan semua penataan ulang gabungan otomatis untuk kueri:

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }

Skenario dunia nyata yang berlaku mungkin berupa aplikasi jaringan sosial di mana orang-orang dalam jaringan diklasifikasikan sebagai influencer dengan banyak koneksi atau sebagai pengguna normal dengan beberapa koneksi. Dalam skenario seperti itu, Anda dapat memastikan bahwa pengguna normal (Jane) diproses sebelum influencer (John) dalam kueri seperti contoh sebelumnya.

Petunjuk Kueri dan Pengurutan Ulang

Anda dapat mengolah contoh ini satu langkah lebih jauh. Jika Anda tahu bahwa atribut :name unik untuk node tunggal, Anda bisa mempercepat kueri dengan pengurutan ulang dan menggunakan petunjuk kueri joinOrder. Langkah ini memastikan bahwa node unik diekstraksi pertama.

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person2 :name "John" . ?person1 :likes ?person2 . ?person2 :likes ?person1 . }

Dalam kasus ini, Anda dapat mengurangi kueri untuk tindakan tunggal berikut di setiap langkah:

  1. Cari node satu orang dengan :name Jane.

  2. Cari node satu orang dengan :name John.

  3. Pastikan bahwa node pertama terhubung ke node kedua dengan edge :likes.

  4. Pastikan bahwa node kedua terhubung ke node pertama dengan edge :likes.

penting

Jika Anda memilih urutan yang salah, petunjuk kueri joinOrder dapat menyebabkan penurunan kinerja yang signifikan. Sebagai contoh, contoh sebelumnya akan menjadi tidak efisien jika atribut :name tidak unik. Jika semua 100 node diberi nama Jane dan semua 1.000 node diberi nama John, maka akhir kueri akan memeriksa 1.000 * 100 (100.000) pasang untuk edge :likes.