openCypher kepatuhan spesifikasi di Amazon Neptunus - Amazon Neptune

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

openCypher kepatuhan spesifikasi di Amazon Neptunus

Rilis openCypher Amazon Neptunus umumnya mendukung klausa, operator, ekspresi, fungsi, dan sintaks yang ditentukan oleh spesifikasi openCypher saat ini, yang merupakan Referensi Bahasa Kueri Cypher Versi 9. Keterbatasan dan perbedaan dalam dukungan openCypher Neptunus disebut di bawah ini.

catatan

Implementasi Neo4j Cypher saat ini berisi fungsionalitas yang tidak terkandung dalam spesifikasi yang disebutkan di atas. openCypher Jika Anda memigrasikan kode Cypher saat ini ke Neptunus, lihat dan untuk informasi lebih lanjut. Kompatibilitas Neptunus dengan Neo4j Menulis ulang pertanyaan Cypher untuk dijalankan di OpenCypher di Neptune

Support untuk openCypher klausul di Neptunus

Neptunus mendukung klausa berikut, kecuali seperti yang disebutkan:

  • MATCH— Didukung, kecuali bahwa shortestPath() and allShortestPaths() saat ini tidak didukung.

  • OPTIONAL MATCH

  • MANDATORY MATCH   — saat ini tidak didukung di Neptunus. Neptunus, bagaimanapun, mendukung nilai ID kustom dalam kueri. MATCH

  • RETURN— Didukung, kecuali bila digunakan dengan nilai non-statis untuk SKIP atauLIMIT. Misalnya, berikut ini saat ini tidak berfungsi:

    MATCH (n) RETURN n LIMIT toInteger(rand()) // Does NOT work!
  • WITH— Didukung, kecuali bila digunakan dengan nilai non-statis untuk SKIP atauLIMIT. Misalnya, berikut ini saat ini tidak berfungsi:

    MATCH (n) WITH n SKIP toInteger(rand()) WITH count() AS count RETURN count > 0 AS nonEmpty // Does NOT work!
  • UNWIND

  • WHERE

  • ORDER BY

  • SKIP

  • LIMIT

  • CREATE— Neptunus memungkinkan Anda membuat nilai ID kustom dalam kueri. CREATE

  • DELETE

  • SET

  • REMOVE

  • MERGE- Neptunus mendukung nilai ID kustom dalam kueri. MERGE

  • CALL[YIELD...]   — saat ini tidak didukung di Neptunus.

  • UNION, UNION ALL— kueri hanya-baca didukung, tetapi kueri mutasi saat ini tidak didukung.

  • USINGUSING didukung dari versi mesin 1.3.2.0. Lihat Petunjuk kueri untuk informasi selengkapnya.

Support untuk openCypher operator di Neptunus

Neptunus mendukung operator berikut, kecuali seperti yang disebutkan:

Operator umum
  • DISTINCT

  • .Operator untuk mengakses properti peta literal bersarang.

Operator matematika
  • Operator + tambahan.

  • -Operator pengurangan.

  • *Operator perkalian.

  • Operator / divisi.

  • Operator divisi % modulo.

  • Operator ^ eksponensial is NOT supported.

Operator perbandingan
  • Operator = tambahan.

  • Operator <> ketidaksetaraan.

  • Operator < less-than didukung kecuali jika salah satu argumennya adalah Path, List, atau Map.

  • Operator > yang lebih besar dari didukung kecuali jika salah satu argumennya adalah Path, List, atau Map.

  • Operator <= less-than-or-equal -to didukung kecuali jika salah satu argumen adalah Path, List, atau Map.

  • Operator >= greater-than-or-equal -to didukung kecuali jika salah satu argumen adalah Path, List, atau Map.

  • IS NULL

  • IS NOT NULL

  • STARTS WITHdidukung jika data yang dicari adalah string.

  • ENDS WITHdidukung jika data yang dicari adalah string.

  • CONTAINSdidukung jika data yang dicari adalah string.

Operator Boolean
  • AND

  • OR

  • XOR

  • NOT

Operator String
  • +Operator penggabungan.

Daftar operator
  • +Operator penggabungan.

  • IN(memeriksa keberadaan item dalam daftar)

Support untuk openCypher ekspresi di Neptunus

Neptunus mendukung ekspresi berikut, kecuali seperti yang disebutkan:

  • CASE

  • []Ekspresi saat ini tidak didukung di Neptunus untuk mengakses kunci properti yang dihitung secara dinamis dalam node, relasi, atau peta. Misalnya, berikut ini tidak berfungsi:

    MATCH (n) WITH [5, n, {key: 'value'}] AS list RETURN list[1].name

Support untuk openCypher fungsi di Neptunus

Neptunus mendukung fungsi-fungsi berikut, kecuali seperti yang disebutkan:

Fungsi predikat
  • exists()

Fungsi skalar
  • coalesce()

  • endNode()

  • epochmillis()

  • head()

  • id()

  • last()

  • length()

  • randomUUID()

  • properties()

  • removeKeyFromMap

  • size()— metode kelebihan beban saat ini hanya berfungsi untuk ekspresi pola, daftar, dan string

  • startNode()

  • timestamp()

  • toBoolean()

  • toFloat()

  • toInteger()

  • type()

Fungsi agregasi
  • avg()

  • collect()

  • count()

  • max()

  • min()

  • percentileDisc()

  • stDev()

  • percentileCont()

  • stDevP()

  • sum()

Daftar fungsi
  • join()(menggabungkan string dalam daftar menjadi satu string)

  • keys()

  • labels()

  • nodes()

  • range()

  • relationships()

  • reverse()

  • tail()

Fungsi Matematika — Numerik
  • abs()

  • ceil()

  • floor()

  • rand()

  • round()

  • sign()

Fungsi matematika — logaritmik
  • e()

  • exp()

  • log()

  • log10()

  • sqrt()

Fungsi matematika — trigonometri
  • acos()

  • asin()

  • atan()

  • atan2()

  • cos()

  • cot()

  • degrees()

  • pi()

  • radians()

  • sin()

  • tan()

Fungsi string
  • join()(menggabungkan string dalam daftar menjadi satu string)

  • left()

  • lTrim()

  • replace()

  • reverse()

  • right()

  • rTrim()

  • split()

  • substring()

  • toLower()

  • toString()

  • toUpper()

  • trim()

Fungsi yang ditentukan pengguna

User-defined functions saat ini tidak didukung di Neptunus.

Detail implementasi khusus Neptunus openCypher

Bagian berikut menjelaskan cara-cara di mana implementasi openCypher Neptunus mungkin berbeda dari atau melampaui spesifikasi. openCypher

Evaluasi jalur panjang variabel (VLP) di Neptunus

Variable length path (VLP) evaluasi menemukan jalur antara node dalam grafik. Panjang jalur dapat tidak dibatasi dalam kueri. Untuk mencegah siklus, openCypher spesifikasi menentukan bahwa setiap tepi harus dilalui paling banyak sekali per solusi.

SebabVLPs, implementasi Neptunus menyimpang dari spesifikasi openCypher karena hanya mendukung nilai konstan untuk filter kesetaraan properti. Ambil kueri berikut:

MATCH (x)-[:route*1..2 {dist:33, code:x.name}]->(y) return x,y

Karena nilai filter kesetaraan x.name properti bukan konstanta, kueri ini menghasilkan pesan UnsupportedOperationException dengan: Property predicate over variable-length relationships with non-constant expression is not supported in this release.

Dukungan temporal dalam openCypher implementasi Neptunus (database Neptunus 1.3.1.0 dan di bawahnya)

Neptunus saat ini memberikan dukungan terbatas untuk fungsi temporal di. openCypher Ini mendukung tipe DateTime data untuk tipe temporal.

datetime()Fungsi ini dapat digunakan untuk mendapatkan UTC tanggal dan waktu saat ini seperti ini:

RETURN datetime() as res

Nilai tanggal dan waktu dapat diuraikan dari string dalam " format T waktu " tanggal di mana tanggal dan waktu keduanya dinyatakan dalam salah satu formulir yang didukung di bawah ini:

Format tanggal yang didukung
  • yyyy-MM-dd

  • yyyyMMdd

  • yyyy-MM

  • yyyy-DDD

  • yyyyDDD

  • yyyy

Format waktu yang didukung
  • HH:mm:ssZ

  • HHmmssZ

  • HH:mm:ssZ

  • HH:mmZ

  • HHmmZ

  • HHZ

  • HHmmss

  • HH:mm:ss

  • HH:mm

  • HHmm

  • HH

Sebagai contoh:

RETURN datetime('2022-01-01T00:01') // or another example: RETURN datetime('2022T0001')

Perhatikan bahwa semua nilai tanggal/waktu di Neptunus disimpan dan openCypher diambil sebagai nilai. UTC

openCypher Neptunus menggunakan statement jam, yang berarti bahwa waktu yang sama digunakan sepanjang durasi kueri. Kueri yang berbeda dalam transaksi yang sama dapat menggunakan waktu instan yang berbeda.

Neptunus tidak mendukung penggunaan fungsi dalam panggilan ke. datetime() Misalnya, berikut ini tidak akan berfungsi:

CREATE (:n {date:datetime(tostring(2021))}) // ---> NOT ALLOWED!

Neptunus memang mendukung fungsi epochmillis() yang mengubah a to. datetime epochmillis Sebagai contoh:

MATCH (n) RETURN epochMillis(n.someDateTime) 1698972364782

Neptunus saat ini tidak mendukung fungsi dan operasi lain DateTime pada objek, seperti penambahan dan pengurangan.

Dukungan sementara dalam openCypher implementasi Neptunus (Neptunus Analytics dan Neptunus Database 1.3.2.0 dan di atasnya)

Fungsionalitas datetime berikut OpenCypher berlaku untuk Neptune Analytics. Atau, Anda dapat menggunakan parameter labmode DatetimeMillisecond=enabled untuk mengaktifkan fungsionalitas datetime berikut pada rilis mesin Neptunus versi 1.3.2.0 dan yang lebih baru. Untuk detail selengkapnya tentang penggunaan fungsi ini di labmode, lihatDukungan datetime yang diperpanjang.

  • Support untuk milidetik. Datetime literal akan selalu dikembalikan dengan milidetik, bahkan jika milidetik adalah 0. (Perilaku sebelumnya adalah memotong milidetik.)

    CREATE (:event {time: datetime('2024-04-01T23:59:59Z')}) # Returning the date returns with 000 suffixed representing milliseconds MATCH(n:event) RETURN n.time as datetime { "results" : [ { "n" : { "~id" : "0fe88f7f-a9d9-470a-bbf2-fd6dd5bf1a7d", "~entityType" : "node", "~labels" : [ "event" ], "~properties" : { "time" : "2024-04-01T23:59:59.000Z" } } } ] }
  • Support untuk memanggil fungsi datetime () melalui properti yang disimpan atau hasil perantara. Misalnya, kueri berikut tidak dimungkinkan sebelum fitur ini.

    Datetime () atas properti:

    // Create node with property 'time' stored as string CREATE (:event {time: '2024-04-01T23:59:59Z'}) // Match and return this property as datetime MATCH(n:event) RETURN datetime(n.time) as datetime

    Datetime () atas hasil menengah:

    // Parse datetime from parameter UNWIND $list as myDate RETURN datetime(myDate) as d
  • Sekarang juga dimungkinkan untuk menyimpan kinerja datetime yang dibuat dalam kasus yang disebutkan di atas.

    Menyimpan datetime dari properti string dari satu properti ke properti lainnya:

    // Create node with property 'time' stored as string CREATE (:event {time: '2024-04-01T23:59:59Z', name: 'crash'}) // Match and update the same property to datetime type MATCH(n:event {name: 'crash'}) SET n.time = datetime(n.time) // Match and update another node's property MATCH(e:event {name: 'crash'}) MATCH(n:server {name: e.servername}) SET n.time = datetime(e.time)

    Batch membuat node dari parameter dengan properti datetime:

    // Batch create from parameter UNWIND $list as events CREATE (n:crash) {time: datetime(events.time)} // Parameter value { "x":[ {"time":"2024-01-01T23:59:29", "name":"crash1"}, {"time":"2023-01-01T00:00:00Z", "name":"crash2"} ] }
  • Support untuk subset yang lebih besar dari ISO86 01 format datetime. Lihat di bawah ini.

Format yang didukung

Format nilai datetime adalah [Tanggal] T [Waktu] [Zona Waktu], di mana T adalah pemisah. Jika zona waktu eksplisit tidak disediakan, UTC (Z) diasumsikan sebagai default.

Zona waktu

Format zona waktu yang didukung adalah:

  • +/- HH: mm

  • +/-HHmm

  • +/- HH

Kehadiran zona waktu dalam string datetime adalah opsional. Jika offset zona waktu adalah 0, Z dapat digunakan sebagai pengganti postfix zona waktu di atas untuk menunjukkan waktu. UTC Rentang zona waktu yang didukung adalah dari - 14:00 hingga + 14:00.

Tanggal

Jika tidak ada zona waktu, atau zona waktu adalah UTC (Z), format tanggal yang didukung adalah sebagai berikut:

catatan

DDDmengacu pada tanggal ordinal, yang mewakili hari dalam setahun dari 001 hingga 365 (366 dalam tahun kabisat). Misalnya, 2024-002 mewakili 2 Januari 2024.

  • yyyy-MM-dd

  • yyyyMMdd

  • yyyy-MM

  • yyyyMM

  • yyyy-DDD

  • yyyyDDD

  • yyyy

Jika zona waktu selain Z dipilih, format tanggal yang didukung dibatasi sebagai berikut:

  • yyyy-MM-dd

  • yyyy-DDD

  • yyyyDDD

Rentang yang didukung untuk tanggal adalah dari 1400-01-01 hingga 9999-12-31.

Waktu

Jika tidak ada timezaone hadir, atau zona waktu adalah UTC (Z), format waktu yang didukung adalah:

  • HH:mm:ss.SSS

  • HH:mm:ss

  • HHmmss.SSS

  • HHmmss

  • HH:mm

  • HHmm

  • HH

Jika zona waktu selain Z dipilih, format waktu yang didukung dibatasi sebagai berikut:

  • HH:mm:ss

  • HH:mm:ss.SSS

Perbedaan semantik bahasa openCypher Neptunus

Neptunus mewakili simpul dan IDs hubungan sebagai string daripada bilangan bulat. ID sama dengan ID yang diberikan melalui pemuat data. Jika ada namespace untuk kolom, namespace ditambah ID. Akibatnya, id fungsi mengembalikan string bukan integer.

Jenis INTEGER data terbatas pada 64 bit. Saat mengonversi nilai floating point atau string yang lebih besar menjadi bilangan bulat menggunakan TOINTEGER fungsi, nilai negatif terpotong LLONG_MIN dan nilai positif dipotong menjadi. LLONG_MAX

Sebagai contoh:

RETURN TOINTEGER(2^100) > 9223372036854775807 RETURN TOINTEGER(-1 * 2^100) > -9223372036854775808

Fungsi khusus Neptunus join()

Neptunus mengimplementasikan fungsi join() yang tidak ada dalam spesifikasi. openCypher Ini menciptakan string literal dari daftar literal string dan pembatas string. Dibutuhkan dua argumen:

  • Argumen pertama adalah daftar literal string.

  • Argumen kedua adalah string pembatas, yang dapat terdiri dari nol, satu, atau lebih dari satu karakter.

Contoh:

join(["abc", "def", "ghi"], ", ") // Returns "abc, def, ghi"

Fungsi khusus Neptunus removeKeyFromMap()

Neptunus mengimplementasikan fungsi removeKeyFromMap() yang tidak ada dalam spesifikasi. openCypher Ini menghapus kunci tertentu dari peta dan mengembalikan peta baru yang dihasilkan.

Fungsi ini membutuhkan dua argumen:

  • Argumen pertama adalah peta untuk menghapus kunci.

  • Argumen kedua adalah kunci untuk menghapus dari peta.

removeKeyFromMap()Fungsi ini sangat berguna dalam situasi di mana Anda ingin menetapkan nilai untuk node atau hubungan dengan membuka daftar peta. Sebagai contoh:

UNWIND [{`~id`: 'id1', name: 'john'}, {`~id`: 'id2', name: 'jim'}] as val CREATE (n {`~id`: val.`~id`}) SET n = removeKeyFromMap(val, '~id')

Nilai ID kustom untuk properti node dan hubungan

Mulai rilis mesin 1.2.0.2, Neptunus telah memperluas openCypher spesifikasi sehingga Anda sekarang dapat menentukan id nilai untuk node dan hubungan di,, dan klausa. CREATE MERGE MATCH Ini memungkinkan Anda menetapkan string yang ramah pengguna alih-alih yang dihasilkan sistem untuk mengidentifikasi node dan hubunganUUIDs.

Awas

Ekstensi ke openCypher spesifikasi ini tidak kompatibel ke belakang, karena sekarang ~id dianggap sebagai nama properti yang dicadangkan. Jika Anda sudah menggunakan ~id sebagai properti dalam data dan kueri, Anda harus memigrasikan properti yang ada ke kunci properti baru dan menghapus yang lama. Lihat Apa yang harus dilakukan jika Anda saat ini menggunakan ~id sebagai properti.

Berikut adalah contoh yang menunjukkan cara membuat node dan hubungan yang memiliki kustomIDS:

CREATE (n {`~id`: 'fromNode', name: 'john'}) -[:knows {`~id`: 'john-knows->jim', since: 2020}] ->(m {`~id`: 'toNode', name: 'jim'})

Jika Anda mencoba membuat ID khusus yang sudah digunakan, Neptunus akan membuat kesalahan. DuplicateDataException

Berikut adalah contoh penggunaan ID kustom dalam MATCH klausa:

MATCH (n {`~id`: 'id1'}) RETURN n

Berikut adalah contoh penggunaan kustom IDs dalam MERGE klausa:

MATCH (n {name: 'john'}), (m {name: 'jim'}) MERGE (n)-[r {`~id`: 'john->jim'}]->(m) RETURN r

Apa yang harus dilakukan jika Anda saat ini menggunakan ~id sebagai properti

Dengan rilis mesin 1.2.0.2, ~id kunci dalam openCypher klausa sekarang diperlakukan sebagai id pengganti sebagai properti. Ini berarti bahwa jika Anda memiliki properti bernama~id, mengaksesnya menjadi tidak mungkin.

Jika Anda menggunakan ~id properti, yang harus Anda lakukan sebelum memutakhirkan ke rilis mesin 1.2.0.2 atau di atasnya adalah terlebih dahulu memigrasikan ~id properti yang ada ke kunci properti baru, lalu menghapus properti tersebut~id. Misalnya, kueri di bawah ini:

  • Membuat properti baru bernama 'newId' untuk semua node,

  • menyalin nilai properti '~id' ke properti 'newId',

  • dan menghapus properti '~id' dari data

MATCH (n) WHERE exists(n.`~id`) SET n.newId = n.`~id` REMOVE n.`~id`

Hal yang sama perlu dilakukan untuk setiap hubungan dalam data yang memiliki ~id properti.

Anda juga harus mengubah kueri apa pun yang Anda gunakan sebagai referensi ~id properti. Misalnya, kueri ini:

MATCH (n) WHERE n.`~id` = 'some-value' RETURN n

... akan berubah menjadi ini:

MATCH (n) WHERE n.newId = 'some-value' RETURN n

Perbedaan lain antara openCypher Neptunus dan Cypher

  • Neptunus hanya TCP mendukung koneksi untuk protokol Bolt. WebSocketskoneksi untuk Bolt tidak didukung.

  • openCypher Neptunus menghapus spasi seperti yang didefinisikan oleh Unicode di, dan fungsi. trim() ltrim() rtrim()

  • Di openCypher Neptunustostring(, ) ganda tidak secara otomatis beralih ke notasi E untuk nilai ganda yang besar.

  • Meskipun openCypher CREATE tidak membuat properti multi-nilai, mereka dapat ada dalam data yang dibuat menggunakan Gremlin. Jika openCypher Neptunus menemukan properti multi-nilai, salah satu nilai dipilih secara sewenang-wenang, menciptakan hasil non-deterministik.