Dukungan dan kompatibilitas grafik Azure Cosmos DB untuk Gremlin dengan fitur TinkerPop

BERLAKU UNTUK: Gremlin

Azure Cosmos DB mendukung bahasa traversal grafik Apache Tinkerpop, yang dikenal sebagai Gremlin. Anda dapat menggunakan bahasa Gremlin untuk membuat entitas grafik (sudut dan tepi), memodifikasi properti dalam entitas tersebut, melakukan kueri dan traversal, dan menghapus entitas.

Mesin Azure Cosmos DB Graph mengikuti dengan cermat spesifikasi langkah traversal Apache TinkerPop tetapi ada perbedaan dalam implementasi yang khusus untuk Azure Cosmos DB. Dalam artikel ini, kami menyediakan panduan cepat Gremlin dan menghitung fitur Gremlin yang didukung oleh API untuk Gremlin.

Pustaka klien yang kompatibel

Tabel berikut menunjukkan driver Gremlin populer yang dapat Anda gunakan melawan Azure Cosmos DB:

Unduh Sumber Memulai Versi konektor yang didukung/Direkomendasikan
.NET Gremlin.NET di GitHub Buat Grafik menggunakan .NET 3.4.13
Java Gremlin JavaDoc Membuat Grafik menggunakan Java 3.4.13
Python Gremlin-Python di GitHub Membuat Grafik menggunakan Python 3.4.13
Konsol Gremlin Dokumen TinkerPop Membuat Grafik menggunakan Konsol Gremlin 3.4.13
Node.js Gremlin-JavaScript di GitHub Membuat Grafik menggunakan Node.js 3.4.13
PHP Gremlin-PHP di GitHub Membuat Grafik menggunakan PHP 3.1.0
Go Lang Go Lang Pustaka ini dibangun oleh kontributor eksternal. Tim Azure Cosmos DB tidak menawarkan dukungan atau memelihara perpustakaan.

Catatan

Versi driver klien Gremlin untuk 3.5.*, 3.6.* memiliki masalah kompatibilitas yang diketahui, jadi sebaiknya gunakan versi driver 3.4.* terbaru yang didukung yang tercantum di atas. Tabel ini akan diperbarui ketika masalah kompatibilitas telah diatasi untuk versi driver yang lebih baru ini.

Objek Microsoft Azure AD Graph yang Didukung

TinkerPop adalah standar yang mencakup berbagai teknologi grafik. Oleh karena itu, ia memiliki terminologi standar untuk menggambarkan fitur apa yang disediakan oleh penyedia grafik. Azure Cosmos DB menyediakan database grafik yang persisten, konkurensi tinggi, dapat ditulis yang dapat dipartisi di beberapa server atau kluster.

Tabel berikut mencantumkan fitur TinkerPop yang diimplementasikan oleh Azure Cosmos DB:

Kategori Implementasu Azure Cosmos DB Catatan
Fitur Microsoft Azure AD Graph Memberikan Kegigihan dan ConcurrentAccess. Dirancang untuk mendukung Transaksi Metode komputer dapat diimplementasikan melalui konektor Spark.
Fitur variabel Mendukung Boolean, Bilangan Bulat, Byte, Double, Float, Long, String Mendukung jenis primitif, kompatibel dengan jenis kompleks melalui model data
Fitur Sudut Mendukung RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Mendukung pembuatan, memodifikasi, dan menghapus sudut
Fitur properti Sudut StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Mendukung pembuatan, memodifikasi, dan menghapus properti sudut
Fitur tepi AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Mendukung pembuatan, memodifikasi, dan menghapus tepi
Fitur properti Azure Stack Edge Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Mendukung pembuatan, memodifikasi, dan menghapus properti tepi

Format kawat Gremlin

Azure Cosmos DB menggunakan format JSON saat mengembalikan hasil dari operasi Gremlin. Azure Cosmos DB saat ini mendukung format JSON. Misalnya, cuplikan berikut menunjukkan representasi JSON dari sudut yang dikembalikan ke klien dari Azure Cosmos DB:

  {
    "id": "a7111ba7-0ea1-43c9-b6b2-efc5e3aea4c0",
    "label": "person",
    "type": "vertex",
    "outE": {
      "knows": [
        {
          "id": "3ee53a60-c561-4c5e-9a9f-9c7924bc9aef",
          "inV": "04779300-1c8e-489d-9493-50fd1325a658"
        },
        {
          "id": "21984248-ee9e-43a8-a7f6-30642bc14609",
          "inV": "a8e3e741-2ef7-4c01-b7c8-199f8e43e3bc"
        }
      ]
    },
    "properties": {
      "firstName": [
        {
          "value": "Thomas"
        }
      ],
      "lastName": [
        {
          "value": "Andersen"
        }
      ],
      "age": [
        {
          "value": 45
        }
      ]
    }
  }

Properti yang digunakan oleh format JSON untuk sudut dijelaskan di bawah ini:

Properti Deskripsi
id ID untuk sudut. Harus unik (dalam kombinasi dengan nilai _partition jika berlaku). Jika tidak ada nilai yang diberikan, maka akan secara otomatis diberikan bersama GUID
label ID untuk sudut. Properti ini digunakan untuk menjelaskan jenis entitas.
type Digunakan untuk membedakan sudut dari dokumen non-grafik
properties Kantong properti yang ditentukan pengguna yang terkait dengan sudut. Setiap properti dapat memiliki beberapa nilai.
_partition Kunci partisi sudut. Digunakan untuk pemartisian grafik.
outE Properti ini berisi daftar tepi dari sudut. Menyimpan informasi yang berdekatan dengan sudut memungkinkan eksekusi traversal yang cepat. Tepi dikelompokkan berdasarkan labelnya.

Setiap properti dapat menyimpan beberapa nilai dalam array.

Properti Deskripsi
value Nilai properti

Dan tepi berisi informasi berikut untuk membantu navigasi ke bagian lain dari grafik.

Properti Deskripsi
id ID untuk tepi. Harus unik (dalam kombinasi dengan nilai _partition jika berlaku)
label Label untuk vertex. Properti ini bersifat opsional, dan digunakan untuk menggambarkan jenis hubungan.
inV Properti ini berisi daftar sudut untuk tepi. Menyimpan informasi yang berdekatan dengan sudut memungkinkan eksekusi traversal yang cepat. Sudut dikelompokkan berdasarkan labelnya.
properties Kantong properti yang ditentukan pengguna yang terkait dengan sudut.

Langkah-langkah Gremlin

Sekarang mari kita lihat langkah-langkah Gremlin yang didukung oleh Azure Cosmos DB. Untuk referensi lengkap tentang Gremlin, lihat referensi TinkerPop.

langkah Deskripsi Dokumentasi TinkerPop 3.2
addE Menambahkan tepi di antara dua sudut langkah addE
addV Menambahkan sudut ke grafik langkah addV
and Memastikan bahwa semua traversal mengembalikan nilai dan langkah
as Modulator langkah untuk menetapkan variabel ke output langkah sebagai langkah
by Modulator langkah yang digunakan dengan group dan order dengan langkah
coalesce Mengembalikan traversal pertama yang mengembalikan hasil menggabungkan langkah
constant Mengembalikan nilai konstanta. Digunakan dengan coalesce langkah konstanta
count Mengembalikan hitungan dari traversal hitung langkah
dedup Mengembalikan nilai dengan duplikat dihapus langkah dedup
drop Menghilangkan nilai (sudut/tepi) menghilangkan langkah
executionProfile Membuat deskripsi semua operasi yang dihasilkan oleh langkah Gremlin yang dijalankan langkah executionProfile
fold Bertindak sebagai penghalang yang menghitung agregat hasil langkah lipat
group Meng-grupkan nilai berdasarkan label yang ditentukan grup step
has Digunakan untuk memfilter properti, sudut, dan tepi. Mendukung varian hasLabel, hasId, hasNot, dan has. memiliki langkah
inject Menyuntikkan nilai ke dalam aliran langkah menyuntikkan
is Digunakan untuk melakukan filter menggunakan ekspresi boolean adalah langkah
limit Digunakan untuk membatasi jumlah item dalam traversal langkah batas
local Lokal membungkus bagian dari traversal, mirip dengan subkueri langkah lokal
not Digunakan untuk menghasilkan negasi filter bukan langkah
optional Mengembalikan hasil traversal yang ditentukan jika menghasilkan hasil lain yang mengembalikan elemen panggilan langkah opsional
or Memastikan setidaknya salah satu traversal mengembalikan nilai atau langkah
order Mengembalikan hasil dalam susunan urutan yang ditentukan urutan langkah
path Mengembalikan jalur lengkap traversal jalur langkah
project Memproyeksikan properti sebagai Peta proyeksi langkah
properties Mengembalikan properti untuk label yang ditentukan langkah properti
range Memfilter rentang nilai yang ditentukan rentang step
repeat Mengulangi langkah untuk jumlah waktu yang ditentukan. Digunakan untuk perulangan ulangi langkah
sample Digunakan untuk membuat sampel hasil dari traversal sampel langkah
select Digunakan untuk membuat sampel hasil dari traversal pilih langkah
store Digunakan untuk mengagregasi non-pemblokiran dari traversal simpan langkah
TextP.startingWith(string) Fungsi pemfilteran string. Fungsi ini digunakan sebagai predikat untuk langkah has() mencocokkan properti dengan awal string yang diberikan Predikat TextP
TextP.endingWith(string) Fungsi pemfilteran string. Fungsi ini digunakan sebagai predikat untuk langkah has() mencocokkan properti dengan awal string yang diberikan Predikat TextP
TextP.containing(string) Fungsi pemfilteran string. Fungsi ini digunakan sebagai predikat untuk langkah has() mencocokkan properti dengan awal string yang diberikan Predikat TextP
TextP.notStartingWith(string) Fungsi pemfilteran string. Fungsi ini digunakan sebagai predikat untuk langkah has() mencocokkan properti yang tidak dimulai dengan string yang diberikan Predikat TextP
TextP.notEndingWith(string) Fungsi pemfilteran string. Fungsi ini digunakan sebagai predikat untuk langkah has() mencocokkan properti dengan diakhiri dengan string yang diberikan Predikat TextP
TextP.notContaining(string) Fungsi pemfilteran string. Fungsi ini digunakan sebagai predikat untuk langkah has() mencocokkan properti dengan diakhiri dengan string yang diberikan Predikat TextP
tree Jalur agregat dari sudut ke pohon langkah pohon
unfold Membuka gulungan iterator sebagai langkah membuka lipatan langkah
union Menggabungkan hasil dari beberapa traversal gabungan langkah
V Termasuk langkah-langkah yang diperlukan untuk traversal antara sudut dan tepi V, E, out, in, both, outE, inE, bothE, outV, inV, bothV, dan otherV untuk langkah-langkah sudut
where Digunakan untuk membuat sampel hasil dari traversal. Mendukung operator eq, neq, lt, lte, gt, gte, dan between tempat langkah

Mesin yang dioptimalkan untuk ditulis yang disediakan oleh Azure Cosmos DB mendukung pengindeksan otomatis semua properti dalam sudut dan tepi secara default. Oleh karena itu, kueri dengan filter, kueri rentang, pengurutan, atau agregat pada properti apa pun diproses dari indeks, dan ditayangkan secara efisien. Untuk informasi selengkapnya tentang cara kerja pengindeksan di Azure Cosmos DB, lihat makalah kami tentang pengindeksan skema-agnostik.

Perbedaan perilaku

  • Mesin Graph Azure Cosmos DB menjalankan traversal yang mengutamakan luas sementara TinkerPop Gremlin mengutamakan kedalaman. Perilaku ini mencapai performa yang lebih baik dalam sistem yang dapat diskalakan secara horizontal seperti Azure Cosmos DB.

Fitur tidak didukung

  • Gremlin Bytecode adalah spesifikasi agnostik bahasa pemrograman untuk traversal grafik. Azure Cosmos DB Graph belum mendukungnya. Gunakan GremlinClient.SubmitAsync() dan berikan traversal sebagai string teks.

  • property(set, 'xyz', 1) kardinalitas yang ditetapkan tidak didukung hari ini. Gunakan property(list, 'xyz', 1) sebagai gantinya. Untuk mempelajari selengkapnya, lihat Properti sudut dengan TinkerPop.

  • Langkah match() saat ini tidak tersedia. Langkah ini menyediakan kapabilitas kueri deklaratif.

  • Objek sebagai properti pada sudut atau tepi tidak didukung. Properti hanya bisa menjadi jenis primitif.

  • Mengurutkan berdasarkan properti arrayorder().by(<array property>) tidak didukung. Pengurutan hanya didukung oleh jenis primitif.

  • Jenis JSON non-primitif tidak didukung. Gunakan jenis string, number atau true/false. Nilai-nilai null tidak didukung.

  • Pebuat seriallisasi GraphSONv3 saat ini tidak didukung. Gunakan kelas GraphSONv2 Serializer, Pembaca, dan Penulis dalam konfigurasi koneksi. Hasil yang dikembalikan oleh Azure Cosmos DB untuk Gremlin tidak memiliki format yang sama dengan format GraphSON.

  • Ekspresi dan fungsi Lambda saat ini tidak didukung. Ini termasuk fungsi .map{<expression>}, .by{<expression>}, dan .filter{<expression>}. Untuk mempelajari lebih lanjut, dan mempelajari cara menulis ulang menggunakan langkah-langkah Gremlin, lihat Catatan di Lambdas.

  • Transaksi tidak didukung karena sifat sistem yang didistribusikan. Konfigurasikan model konsistensi yang sesuai pada akun Gremlin untuk "membaca tulisan Anda sendiri" dan menggunakan konkurensi optimis untuk menyelesaikan penulisan yang bertentangan.

Batasan yang diketahui

  • Pemanfaatan indeks untuk kueri Gremlin dengan .V() langkah-langkah pertengahan traversal: Saat ini, hanya .V() panggilan pertama dari traversal yang akan menggunakan indeks untuk menyelesaikan filter atau predikat apa pun yang terlampir padanya. Panggilan berikutnya tidak akan berkonsultasi dengan indeks, yang mungkin meningkatkan latensi dan biaya kueri.

Dengan asumsi pengindeksan default, kueri Gremlin baca khas yang .V() dimulai dengan langkah akan menggunakan parameter dalam langkah pemfilteran terlampirnya, seperti .has() atau .where() untuk mengoptimalkan biaya dan performa kueri. Contohnya:

g.V().has('category', 'A')

Namun, ketika lebih dari satu langkah .V() disertakan dalam kueri Gremlin, resolusi data untuk kueri mungkin tidak optimal. Ambil kueri berikut sebagai contoh:

g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')

Kueri ini akan mengembalikan dua grup sudut berdasarkan properti mereka yang disebut category. Dalam hal ini, hanya panggilan pertama, g.V().has('category', 'A') akan menggunakan indeks untuk menyelesaikan sudut berdasarkan nilai properti mereka.

Solusi untuk kueri ini adalah menggunakan langkah-langkah subtraversal seperti .map() dan union(). Ini dicontohkan di bawah ini:

// Query workaround using .map()
g.V().has('category', 'A').as('a').map(__.V().has('category', 'B')).as('b').select('a','b')

// Query workaround using .union()
g.V().has('category', 'A').fold().union(unfold(), __.V().has('category', 'B'))

Anda dapat mengulas performa kueri dengan menggunakan langkah executionProfile()Gremlin.

Langkah berikutnya