View a markdown version of this page

Fitur OpenCypher menjelaskan - Amazon Neptune

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

Fitur OpenCypher menjelaskan

explainFitur OpenCypher adalah alat layanan mandiri di Amazon Neptune yang membantu Anda memahami pendekatan eksekusi yang diambil oleh mesin Neptune. Untuk memanggil penjelasan, Anda meneruskan parameter ke permintaan HTTPS OpenCypher denganexplain=mode, di mana nil mode ainya dapat menjadi salah satu dari berikut ini:

  • static- Dalam static mode, hanya explain mencetak struktur statis dari rencana kueri. Itu tidak benar-benar menjalankan query.

  • dynamic- Dalam dynamic mode, explain juga menjalankan kueri, dan menyertakan aspek dinamis dari rencana kueri. Ini mungkin termasuk jumlah binding perantara yang mengalir melalui operator, rasio binding masuk ke binding keluar, dan total waktu yang dibutuhkan oleh masing-masing operator.

  • details- Dalam details mode, explain mencetak informasi yang ditampilkan dalam mode dinamis ditambah detail tambahan, seperti string kueri OpenCypher yang sebenarnya dan perkiraan jumlah rentang untuk pola yang mendasari operator gabungan.

Misalnya, menggunakan POST dengan dynamic mode:

AWS CLI
aws neptunedata execute-open-cypher-explain-query \ --endpoint-url https://your-neptune-endpoint:port \ --open-cypher-query "MATCH (n) RETURN n LIMIT 1" \ --explain-mode dynamic

Untuk informasi selengkapnya, lihat execute-open-cypher- explain-query di Referensi Perintah. AWS CLI

SDK
import boto3 from botocore.config import Config client = boto3.client( 'neptunedata', endpoint_url='https://your-neptune-endpoint:port', config=Config(read_timeout=None, retries={'total_max_attempts': 1}) ) response = client.execute_open_cypher_explain_query( openCypherQuery='MATCH (n) RETURN n LIMIT 1', explainMode='dynamic' ) print(response['results'].read().decode('utf-8'))

Untuk contoh AWS SDK dalam bahasa lain, lihatAWS SDK.

awscurl
awscurl https://your-neptune-endpoint:port/openCypher \ --region us-east-1 \ --service neptune-db \ -X POST \ -d "query=MATCH (n) RETURN n LIMIT 1" \ -d "explain=dynamic"
catatan

Contoh ini mengasumsikan bahwa AWS kredenSIAL Anda dikonfigurasi di lingkungan Anda. Ganti us-east-1 dengan Wilayah cluster Neptunus Anda.

curl
curl https://your-neptune-endpoint:port/openCypher \ -d "query=MATCH (n) RETURN n LIMIT 1" \ -d "explain=dynamic"

Keterbatasan untuk OpenCypher menjelaskan di Neptunus

Rilis OpenCypher menjelaskan saat ini memiliki batasan berikut:

  • Jelaskan rencana saat ini hanya tersedia untuk kueri yang melakukan operasi read-only. Kueri yang melakukan segala jenis mutasiCREATE, sepertiDELETE,MERGE,, SET dan sebagainya, tidak didukung.

  • Operator dan output untuk paket tertentu dapat berubah dalam rilis mendatang.

Operator DFE di OpenCypher menjelaskan output

Untuk menggunakan informasi yang disediakan explain fitur OpenCypher, Anda perlu memahami beberapa detail tentang cara kerja mesin kueri DFE (DFE menjadi mesin yang digunakan Neptune untuk memproses kueri OpenCypher).

Mesin DFE menerjemahkan setiap kueri ke dalam pipeline operator. Mulai dari operator pertama, solusi perantara mengalir dari satu operator ke operator berikutnya melalui pipeline operator ini. Setiap baris dalam tabel penjelasan mewakili hasil, hingga titik evaluasi.

Operator yang dapat muncul dalam rencana kueri DFE adalah sebagai berikut:

DFEApply - Mengeksekusi fungsi yang ditentukan di bagian argumen, pada nilai yang disimpan dalam variabel yang ditentukan

DFEBindRelation— Mengikat bersama variabel dengan nama yang ditentukan

DFEChunkLocalSubQuery— Ini adalah operasi non-pemblokiran yang bertindak sebagai pembungkus di sekitar subkueri yang sedang dilakukan.

DFEDistinctColumn— Mengembalikan subset berbeda dari nilai input berdasarkan variabel yang ditentukan.

DFEDistinctRelation— Mengembalikan subset berbeda dari solusi input berdasarkan variabel yang ditentukan.

DFedRain — Muncul di akhir subkueri untuk bertindak sebagai langkah penghentian untuk subkueri tersebut. Jumlah solusi dicatat sebagaiUnits In. Units OutSelalu nol.

DFEForwardValue— Menyalin semua potongan input secara langsung sebagai potongan output untuk diteruskan ke operator hilirnya.

DFEGroupByHashIndex- Melakukan operasi group-by atas solusi input berdasarkan indeks hash yang dihitung sebelumnya (menggunakan DFEHashIndexBuild operasi). Sebagai output, input yang diberikan diperpanjang oleh kolom yang berisi kunci grup untuk setiap solusi input.

DFEHashIndexBuild- Membangun indeks hash di atas satu set variabel sebagai efek samping. Indeks hash ini biasanya digunakan kembali dalam operasi selanjutnya. Lihat DFEHashIndexJoin atau DFEGroupByHashIndex di mana indeks hash ini dapat digunakan.

DFEHashIndexJoin— Melakukan penggabungan atas solusi masuk terhadap indeks hash yang dibuat sebelumnya. Lihat DFEHashIndexBuild di mana indeks hash ini dapat dibangun.

DFEJoinExists— Mengambil relasi input tangan kiri dan kanan, dan mempertahankan nilai dari relasi kiri yang memiliki nilai yang sesuai dalam relasi kanan seperti yang didefinisikan oleh variabel gabungan yang diberikan.

— Ini adalah operasi non-pemblokiran yang bertindak sebagai pembungkus untuk subquery, memungkinkannya dijalankan berulang kali untuk digunakan dalam loop.

DFEMergeChunks— Ini adalah operasi pemblokiran yang menggabungkan potongan dari operator hulu menjadi satu potongan solusi untuk diteruskan ke operator hilirnya (kebalikan dari). DFESplitChunks

dFeminus — Mengambil relasi input tangan kiri dan kanan, dan mempertahankan nilai dari relasi kiri yang tidak memiliki nilai yang sesuai dalam relasi kanan seperti yang didefinisikan oleh variabel gabungan yang diberikan. Jika tidak ada tumpang tindih dalam variabel di kedua relasi, maka operator ini hanya mengembalikan relasi input tangan kiri.

DFENotExists— Mengambil relasi input tangan kiri dan kanan, dan mempertahankan nilai dari relasi kiri yang tidak memiliki nilai yang sesuai dalam relasi kanan seperti yang didefinisikan oleh variabel gabungan yang diberikan. Jika tidak ada tumpang tindih dalam variabel di kedua relasi, maka operator ini mengembalikan relasi kosong.

DFEOptionalJoin— Melakukan gabungan luar kiri (juga disebut gabungan OPSIONAL): solusi dari sisi kiri yang memiliki setidaknya satu mitra gabungan di sisi kanan digabungkan, dan solusi dari sisi kiri tanpa mitra gabungan di sisi kanan diteruskan apa adanya. Ini adalah operasi pemblokiran.

DFEPipelineJoin— Menggabungkan input terhadap pola tupel yang ditentukan oleh pattern argumen.

DFEPipelineRangeCount— Menghitung jumlah solusi yang cocok dengan pola tertentu, dan mengembalikan solusi satu kali yang berisi nilai hitungan.

DFEPipelineScan— Memindai database untuk pattern argumen yang diberikan, dengan atau tanpa filter yang diberikan pada kolom (s).

DFEproject - Mengambil beberapa kolom input dan memproyeksikan hanya kolom yang diinginkan.

DFEeduce — Melakukan fungsi agregasi yang ditentukan pada variabel tertentu.

DFERelationalJoin— Menggabungkan input dari operator sebelumnya berdasarkan kunci pola yang ditentukan menggunakan gabungan gabungan. Ini adalah operasi pemblokiran.

DFERouteChunks— Mengambil potongan input dari tepi masuk tunggalnya dan merutekan potongan tersebut di sepanjang beberapa tepi keluarnya.

DFESelectRows— Operator ini secara selektif mengambil baris dari solusi relasi input kiri untuk meneruskan ke operator hilirnya. Baris yang dipilih berdasarkan pengidentifikasi baris yang disediakan dalam relasi input kanan operator.

DFEserialize — Menserialisasi hasil akhir kueri menjadi serialisasi string JSON, memetakan setiap solusi input ke nama variabel yang sesuai. Untuk hasil node dan edge, hasil ini diserialkan menjadi peta properti entitas dan metadata.

DFEsort — Mengambil relasi input dan menghasilkan relasi yang diurutkan berdasarkan kunci pengurutan yang disediakan.

DFESplitByGroup- Membagi setiap potongan input tunggal dari satu tepi masuk menjadi potongan keluaran yang lebih kecil sesuai dengan grup baris yang diidentifikasi oleh ID baris dari potongan input yang sesuai dari tepi masuk lainnya.

DFESplitChunks— Membagi setiap potongan input tunggal menjadi potongan output yang lebih kecil (kebalikan dari). DFEMergeChunks

DFEStreamingHashIndexBuild— Versi streaming dariDFEHashIndexBuild.

DFEStreamingGroupByHashIndex— Versi streaming dariDFEGroupByHashIndex.

DFEsubQuery — Operator ini muncul di awal semua rencana dan merangkum bagian-bagian dari rencana yang dijalankan pada mesin DFE, yang merupakan keseluruhan rencana untuk OpenCypher.

DFESymmetricHashJoin— Menggabungkan input dari operator sebelumnya berdasarkan kunci pola yang ditentukan menggunakan hash join. Ini adalah operasi non-pemblokiran.

DFEsync — Operator ini adalah operator sinkronisasi yang mendukung rencana non-pemblokiran. Dibutuhkan solusi dari dua tepi yang masuk dan meneruskan solusi ini ke tepi hilir yang sesuai. Untuk tujuan sinkronisasi, input di sepanjang salah satu tepi ini dapat disangga secara internal.

DFEtee — Ini adalah operator percabangan yang mengirimkan set solusi yang sama ke beberapa operator.

DFETermResolution- Melakukan operasi pelokalan atau globalisasi pada inputnya, menghasilkan kolom masing-masing pengidentifikasi lokal atau global.

— Membuka daftar nilai dari kolom input ke kolom output sebagai elemen individu.

DFEunion — Mengambil dua atau lebih hubungan input dan menghasilkan penyatuan relasi tersebut menggunakan skema keluaran yang diinginkan.

SolutionInjection— Muncul sebelum yang lainnya dalam output penjelasan, dengan nilai 1 di kolom Unit Out. Namun, ini berfungsi sebagai no-op, dan tidak benar-benar menyuntikkan solusi apa pun ke mesin DFE.

TermResolution— Muncul di akhir rencana dan menerjemahkan objek dari mesin Neptunus ke objek OpenCypher.

Kolom di OpenCypher menjelaskan keluaran

Informasi rencana kueri yang dihasilkan Neptunus sebagai OpenCypher menjelaskan output berisi tabel dengan satu operator per baris. Tabel memiliki kolom berikut:

ID — ID numerik operator ini dalam paket.

Keluar #1 (dan Keluar #2) — ID operator yang berada di hilir dari operator ini. Paling banyak ada dua operator hilir.

Nama — Nama operator ini.

Argum en — Setiap detail yang relevan untuk operator. Ini termasuk hal-hal seperti skema input, skema keluaran, pola (untuk PipelineScan danPipelineJoin), dan sebagainya.

Mode — Label yang menggambarkan perilaku operator mendasar. Kolom ini sebagian besar kosong (-). Satu pengecualian adalahTermResolution, di mana mode bisaid2value_opencypher, menunjukkan resolusi dari nilai ID ke OpenCypher.

Unit In — Jumlah solusi yang diteruskan sebagai input ke operator ini. Operator tanpa operator hulu, sepertiDFEPipelineScan,SolutionInjections, dan tanpa nilai statis yang DFESubquery disuntikkan, akan memiliki nilai nol.

Unit Kelu ar — Jumlah solusi yang dihasilkan sebagai output dari operator ini. DFEDrainadalah kasus khusus, di mana jumlah larutan yang dikeringkan dicatat Units In dan Units Out selalu nol.

Rasio — Rasio Units Out terhadapUnits In.

Waktu (ms) — Waktu CPU yang dikonsumsi oleh operator ini, dalam milidetik.

Contoh dasar OpenCypher menjelaskan keluaran

Berikut ini adalah contoh dasar dari output OpenCypherexplain. Kueri adalah pencarian simpul tunggal dalam kumpulan data rute udara untuk node dengan kode bandara ATL yang memanggil explain menggunakan details mode dalam format output ASCII default.

Untuk memanggil ku explain eri ini:

AWS CLI
aws neptunedata execute-open-cypher-explain-query \ --endpoint-url https://your-neptune-endpoint:port \ --open-cypher-query "MATCH (n {code: 'ATL'}) RETURN n" \ --explain-mode details

Untuk informasi selengkapnya, lihat execute-open-cypher- explain-query di Referensi Perintah. AWS CLI

SDK
import boto3 from botocore.config import Config client = boto3.client( 'neptunedata', endpoint_url='https://your-neptune-endpoint:port', config=Config(read_timeout=None, retries={'total_max_attempts': 1}) ) response = client.execute_open_cypher_explain_query( openCypherQuery="MATCH (n {code: 'ATL'}) RETURN n", explainMode='details' ) print(response['results'].read().decode('utf-8'))

Untuk contoh AWS SDK dalam bahasa lain, lihatAWS SDK.

awscurl
awscurl https://your-neptune-endpoint:port/openCypher \ --region us-east-1 \ --service neptune-db \ -X POST \ -d "query=MATCH (n {code: 'ATL'}) RETURN n" \ -d "explain=details"
catatan

Contoh ini mengasumsikan bahwa AWS kredenSIAL Anda dikonfigurasi di lingkungan Anda. Ganti us-east-1 dengan Wilayah cluster Neptunus Anda.

curl
curl https://your-neptune-endpoint:port/openCypher \ -d "query=MATCH (n {code: 'ATL'}) RETURN n" \ -d "explain=details"

explainOutputnya:

Query: MATCH (n {code: 'ATL'}) RETURN n ╔════╤════════╤════════╤═══════════════════╤════════════════════╤═════════════════════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪═══════════════════╪════════════════════╪═════════════════════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ SolutionInjection │ solutions=[{}] │ - │ 0 │ 1 │ 0.00 │ 0 ║ ╟────┼────────┼────────┼───────────────────┼────────────────────┼─────────────────────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ - │ DFESubquery │ subQuery=subQuery1 │ - │ 0 │ 1 │ 0.00 │ 4.00 ║ ╟────┼────────┼────────┼───────────────────┼────────────────────┼─────────────────────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ - │ - │ TermResolution │ vars=[?n] │ id2value_opencypher │ 1 │ 1 │ 1.00 │ 2.00 ║ ╚════╧════════╧════════╧═══════════════════╧════════════════════╧═════════════════════╧══════════╧═══════════╧═══════╧═══════════╝ subQuery1 ╔════╤════════╤════════╤═══════════════════════╤══════════════════════════════════════════════════════════════════════════════════════════════════════════════╤══════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪═══════════════════════╪══════════════════════════════════════════════════════════════════════════════════════════════════════════════╪══════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ DFEPipelineScan │ pattern=Node(?n) with property 'code' as ?n_code2 and label 'ALL' │ - │ 0 │ 1 │ 0.00 │ 0.21 ║ ║ │ │ │ │ inlineFilters=[(?n_code2 IN ["ATL"^^xsd:string])] │ │ │ │ │ ║ ║ │ │ │ │ patternEstimate=1 │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ - │ DFEChunkLocalSubQuery │ subQuery=http://aws.amazon.com/neptune/vocab/v01/dfe/past/graph#9d84f97c-c3b0-459a-98d5-955a8726b159/graph_1 │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 3 │ - │ DFEProject │ columns=[?n] │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ - │ - │ DFEDrain │ - │ - │ 1 │ 0 │ 0.00 │ 0.03 ║ ╚════╧════════╧════════╧═══════════════════════╧══════════════════════════════════════════════════════════════════════════════════════════════════════════════╧══════╧══════════╧═══════════╧═══════╧═══════════╝ subQuery=http://aws.amazon.com/neptune/vocab/v01/dfe/past/graph#9d84f97c-c3b0-459a-98d5-955a8726b159/graph_1 ╔════╤════════╤════════╤══════════════════════╤════════════════════════════════════════════════════════════╤══════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪══════════════════════╪════════════════════════════════════════════════════════════╪══════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ DFESolutionInjection │ outSchema=[?n, ?n_code2] │ - │ 0 │ 1 │ 0.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ 3 │ DFETee │ - │ - │ 1 │ 2 │ 2.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 4 │ - │ DFEDistinctColumn │ column=?n │ - │ 1 │ 1 │ 1.00 │ 0.20 ║ ║ │ │ │ │ ordered=false │ │ │ │ │ ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ 5 │ - │ DFEHashIndexBuild │ vars=[?n] │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 4 │ 5 │ - │ DFEPipelineJoin │ pattern=Node(?n) with property 'ALL' and label '?n_label1' │ - │ 1 │ 1 │ 1.00 │ 0.25 ║ ║ │ │ │ │ patternEstimate=3506 │ │ │ │ │ ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 5 │ 6 │ 7 │ DFESync │ - │ - │ 2 │ 2 │ 1.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 6 │ 8 │ - │ DFEForwardValue │ - │ - │ 1 │ 1 │ 1.00 │ 0.01 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 7 │ 8 │ - │ DFEForwardValue │ - │ - │ 1 │ 1 │ 1.00 │ 0.01 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 8 │ 9 │ - │ DFEHashIndexJoin │ - │ - │ 2 │ 1 │ 0.50 │ 0.35 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 9 │ - │ - │ DFEDrain │ - │ - │ 1 │ 0 │ 0.00 │ 0.02 ║ ╚════╧════════╧════════╧══════════════════════╧════════════════════════════════════════════════════════════╧══════╧══════════╧═══════════╧═══════╧═══════════╝

Di tingkat atas, SolutionInjection muncul sebelum yang lainnya, dengan 1 unit keluar. Perhatikan bahwa itu tidak benar-benar menyuntikkan solusi apa pun. Anda dapat melihat bahwa operator berikutnya,DFESubquery, memiliki 0 unit.

Setelah SolutionInjection di tingkat atas adalah DFESubquery dan TermResolution operator. DFESubquerymerangkum bagian-bagian dari rencana eksekusi kueri yang sedang didorong ke mesin DFE (untuk kueri OpenCypher, seluruh rencana kueri dijalankan oleh DFE). Semua operator dalam rencana kueri bersarang di dalam subQuery1 yang direferensikan olehDFESubquery. Satu-satunya pengecualian adalahTermResolution, yang mewujudkan ID internal menjadi objek OpenCypher yang sepenuhnya diserialkan.

Semua operator yang didorong ke mesin DFE memiliki nama yang dimulai dengan DFE awalan. Seperti disebutkan di atas, seluruh rencana kueri OpenCypher dijalankan oleh DFE, sehingga sebagai hasilnya, semua operator kecuali TermResolution operator akhir dimulai dengan. DFE

Di dalamsubQuery1, mungkin ada nol atau lebih DFEChunkLocalSubQuery atau DFELoopSubQuery operator yang merangkum bagian dari rencana eksekusi yang didorong yang dieksekusi dalam mekanisme yang dibatasi memori. DFEChunkLocalSubQuerydi sini berisi satu SolutionInjection yang digunakan sebagai input ke subquery. Untuk menemukan tabel untuk subquery itu dalam output, cari yang subQuery=graph URI ditentukan di Arguments kolom untuk DFELoopSubQuery operator DFEChunkLocalSubQuery or.

DalamsubQuery1, DFEPipelineScan dengan ID 0 memindai database untuk yang ditentukanpattern. Pola memindai entitas dengan properti yang code disimpan sebagai ?n_code2 variabel di semua label (Anda dapat memfilter label tertentu dengan menambahkan airport ken:airport). Ar inlineFilters gumen menunjukkan pemfilteran untuk code properti setara. ATL

Selanjutnya, DFEChunkLocalSubQuery operator bergabung dengan hasil perantara dari subquery yang berisiDFEPipelineJoin. Ini memastikan bahwa sebenarnya ?n adalah node, karena sebelumnya mem DFEPipelineScan indai entitas apa pun dengan code properti.