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.
joinOrder
SPARQLsintaks 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.
joinOrder
SPARQLcontoh 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, termasukJane
.Satu orang bernama
Jane
yang:likes
10 orang, termasukJohn
.
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:
Temukan semua orang yang bernama
John
.Temukan semua orang yang terhubung ke
John
berdasarkan edge:likes
.Saring set ini berdasarkan orang yang bernama
Jane
.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:
Cari node satu orang dengan
:name
Jane
.Cari node satu orang dengan
:name
John
.Pastikan bahwa node pertama terhubung ke node kedua dengan edge
:likes
.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
.