Gremlin için Azure Cosmos DB graf desteği ve TinkerPop özellikleriyle uyumluluk

ŞUNLAR IÇIN GEÇERLIDIR: Gremlin

Azure Cosmos DB, Apache Tinkerpop'unGremlin olarak bilinen graf geçiş dilini destekler. Grafik varlıkları (köşeler ve kenarlar) oluşturmak, bu varlıkların içindeki özellikleri değiştirmek, sorgu ve geçiş işlemleri gerçekleştirmek ve varlıkları silmek için Gremlin dilini kullanabilirsiniz.

Azure Cosmos DB Graph altyapısı Apache TinkerPop geçiş adımları belirtimini yakından izler, ancak uygulamada Azure Cosmos DB'ye özgü farklılıklar vardır. Bu makalede, Gremlin'in hızlı bir adım adım kılavuzunu sağlar ve Gremlin api'sinin desteklediği Gremlin özelliklerini numaralandırırız.

Uyumlu istemci kitaplıkları

Aşağıdaki tabloda Azure Cosmos DB’ye karşı kullanabileceğiniz popüler Gremlin sürücüleri gösterilir:

İndir Kaynak Başlarken Desteklenen/Önerilen bağlayıcı sürümü
.NET GitHub’da Gremlin.NET .NET kullanarak Grafik oluşturma 3.4.13
Java Gremlin JavaDoc Java kullanarak Grafik oluşturma 3.4.13
Python Gremlin-Python on GitHub Python kullanarak Grafik oluşturma 3.4.13
Gremlin konsolu TinkerPop belgeleri Gremlin konsolunu kullanarak Grafik oluşturma 3.4.13
Node.js GitHub’da Gremlin-JavaScript Node.js kullanarak Grafik oluşturma 3.4.13
PHP Github'da Gremlin-PHP PHP kullanarak Grafik oluşturma 3.1.0
Go Lang Go Lang Bu kitaplık dış katkıda bulunanlar tarafından oluşturulur. Azure Cosmos DB ekibi herhangi bir destek sunmaz veya kitaplığın bakımını yapmaz.

Not

3.5.*, 3.6.* için Gremlin istemci sürücüsü sürümlerinin bilinen uyumluluk sorunları vardır, bu nedenle yukarıda listelenen desteklenen en son 3.4.* sürücü sürümlerini kullanmanızı öneririz. Bu yeni sürücü sürümleri için uyumluluk sorunları giderildiğinde bu tablo güncelleştirilecektir.

Desteklenen Grafik Nesneleri

TinkerPop, çeşitli grafik teknolojilerini kapsayan bir standarttır. Bu nedenle bir grafik sağlayıcısı tarafından sağlanan özellikleri tanımlamaya yönelik standart bir terminolojisi vardır. Azure Cosmos DB kalıcı, yüksek eşzamanlılığa sahip, birden çok sunucu ve kümeye ayrılabilen yazılabilir bir grafik veritabanı sağlar.

Aşağıdaki tabloda Azure Cosmos DB tarafından uygulanan TinkerPop özellikleri listelenmektedir:

Kategori Azure Cosmos DB uygulaması Notlar
Grafik özellikleri Kalıcılık ve EşzamanlıErişim sağlar. İşlemleri desteklemek için tasarlanmıştır Bilgisayar yöntemleri, Spark bağlayıcısı tarafından uygulanabilir.
Değişken özellikleri Boole, Integer, Byte, Double, Float, Long, String'i destekler İlkel türleri destekler ve veri modeli aracılığıyla oluşan karmaşık türlerle uyumludur
Köşe özellikleri RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty işlevlerini destekler Köşe oluşturma, değiştirme ve silmeyi destekler
Köşe özellikleri StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues işlevlerini destekler Köşe özelliklerini oluşturma, değiştirme ve silmeyi destekler
Kenar özellikleri AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Kenar oluşturma, değiştirme ve silmeyi destekler
Kenar özellikleri Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Kenar özelliklerini oluşturma, değiştirme ve silmeyi destekler

Gremlin tel biçimi

Azure Cosmos DB, Gremlin işlemlerinden sonuçlar döndürürken JSON biçimini kullanır. Azure Cosmos DB şu anda JSON biçimini desteklemektedir. Örneğin aşağıdaki kod parçacığı, Azure Cosmos DB'den istemciye döndürülen bir köşenin JSON gösterimini gösterir:

  {
    "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
        }
      ]
    }
  }

Köşeler için JSON biçimi tarafından kullanılan özellikler aşağıda açıklanmıştır:

Özellik Açıklama
id Köşenin kimliği. Benzersiz olmalıdır (varsa değeriyle _partition birlikte). Değer sağlanmazsa, otomatik olarak bir GUID sağlanır
label Köşenin etiketi. Bu özellik varlık türünü açıklamak için kullanılır.
type Grafik olmayan belgelerdeki köşeleri ayırt etmek için kullanılır
properties Köşe ile ilişkili, kullanıcı tanımlı özellikler paketi. Her bir özellik birden çok değere sahip olabilir.
_partition Köşenin bölüm anahtarı. Graf bölümleme için kullanılır.
outE Bu özellik, bir köşenin dış kenarlarının listesini içerir. Komşuluk bilgilerini köşeyle birlikte depolamak, geçişlerin hızla yürütülmesini sağlar. Kenarlar etiketlerine göre gruplandırılır.

Her bir özellik, bir dizi içinde birden çok değer depolayabilir.

Özellik Açıklama
value Özelliğin değeri

Kenar, grafiğin diğer bölümlerine gezintiyi kolaylaştırmak için aşağıdaki bilgiyi içerir.

Özellik Açıklama
id Kenarın kimliği. Benzersiz olmalıdır (varsa değeriyle _partition birlikte)
label Kenarın etiketi. Bu özellik isteğe bağlıdır ve ilişki türünü tanımlamak için kullanılır.
inV Bu özellik, bir kenar için in köşelerinin listesini içerir. Komşuluk bilgilerini kenarla birlikte depolamak, geçişlerin hızla yürütülmesini sağlar. Köşeler etiketlerine göre gruplandırılır.
properties Kenar ile ilişkili, kullanıcı tanımlı özellikler paketi.

Gremlin adımları

Şimdi de Azure Cosmos DB tarafından desteklenen Gremlin adımlarına bakalım. Gremlin hakkında eksiksiz bir başvuru için bkz. TinkerPop başvurusu.

adım Açıklama TinkerPop 3.2 Belgeleri
addE İki köşe arasına kenar ekler addE step
addV Grafiğe bir köşe ekler addV step
and Tüm geçişlerin bir değer döndürmesini sağlar and step
as Bir adımın çıktısına değişken atanmasını sağlayan adım modülatörü as step
by group ve order ile kullanılan bir adım modülatörü by step
coalesce Sonuç döndüren ilk geçişi döndürür coalesce step
constant Sabit bir değer döndürür. coalesce ile kullanılır constant step
count Geçiş sayımını döndürür count step
dedup Yinelenenlerin kaldırıldığı değerleri döndürür dedup step
drop Değerleri (köşe/kenar) bırakır drop step
executionProfile Yürütülen Gremlin adımı tarafından oluşturulan tüm işlemlerin açıklamasını oluşturur executionProfile adımı
fold Sonuçların toplamını hesaplayan bir engel gibi davranır fold step
group Belirtilen etiketleri temel alarak değerleri gruplandırır group step
has Özellikleri, köşeleri ve kenarları filtrelemek için kullanılır. hasLabel, hasId, hasNot ve has değişkenlerini destekler. has step
inject Değerleri bir akışa ekler inject step
is Boole ifadesi kullanarak bir filtre uygulamak için kullanılır is step
limit Geçişteki öğelerin sayısını sınırlamak için kullanılır limit step
local Alt sorgu gibi, geçişin bir bölümünü yerel olarak sarmalar local step
not Filtre olumsuzlamayı üretmek için kullanılır not step
optional Bir sonuç elde ettiği takdirde, belirtilen geçişin sonucunu döndürür; aksi takdirde çağıran öğeyi döndürür isteğe bağlı adım
or En azından bir geçişin değer döndürmesini sağlar or step
order Sonuçları, belirtilen sıralama düzeninde döndürür order step
path Geçişin tam yolunu döndürür path step
project Özellikleri bir Harita gibi projelendirir project step
properties Belirtilen etiketlerin özelliklerini döndürür properties step
range Belirtilen değer aralığını filtreler range step
repeat Adımı belirtilen sayıda tekrarlar. Döngü için kullanılır repeat step
sample Sonuçları geçişten örneklendirmek için kullanılır sample step
select Sonuçları geçişten projelendirmek için kullanılır select step
store Geçişteki engelleyici olmayan toplamalar için kullanılır store step
TextP.startingWith(string) Dize filtreleme işlevi. Bu işlev, bir özelliği belirli bir dizenin has() başlangıcıyla eşleştirme adımının koşulu olarak kullanılır TextP önkoşulları
TextP.endingWith(string) Dize filtreleme işlevi. Bu işlev, bir özelliği belirli bir dizenin has() sonuyla eşleştirme adımının koşulu olarak kullanılır TextP önkoşulları
TextP.containing(string) Dize filtreleme işlevi. Bu işlev, bir özelliği belirli bir dizenin has() içeriğiyle eşleştirme adımının koşulu olarak kullanılır TextP önkoşulları
TextP.notStartingWith(string) Dize filtreleme işlevi. Bu işlev, belirli bir dizeyle başlamayan bir özellikle eşleşmesi için has() adımın koşulu olarak kullanılır TextP önkoşulları
TextP.notEndingWith(string) Dize filtreleme işlevi. Bu işlev, belirli bir dizeyle bitmeyen has() bir özelliği eşleştirmek için adımın koşulu olarak kullanılır TextP önkoşulları
TextP.notContaining(string) Dize filtreleme işlevi. Bu işlev, belirli bir dize içermeyen bir özellikle eşleşmesi için has() adımın koşulu olarak kullanılır TextP önkoşulları
tree Bir köşeden ağaca yolları toplar tree step
unfold Adım olarak bir yineleyici açar unfold step
union Birden çok geçişin sonuçlarını birleştirir union step
V Köşe ve kenarlar arasında geçiş için gerekli olan adımları içerir: V, E, out, in, both, outE, inE, bothE, outV, inV, bothV ve otherV vertex steps
where Geçişten alınan sonuçları filtrelemek için kullanılır. eq, neq, lt, lte, gt, gte ve between işleçlerini destekler where step

Azure Cosmos DB tarafından sağlanan, yazma için iyileştirilmiş altyapı, köşe ve kenarlar içindeki tüm özelliklerin dizinlerinin otomatik olarak oluşturulmasını varsayılan olarak destekler. Bu nedenle herhangi bir özellik üzerindeki sorgulu filtreler, aralık sorguları, sıralama veya toplamalar dizinden işlenir ve etkin bir biçimde sunulur. Azure Cosmos DB’de dizin oluşturmanın işleyişi hakkında daha fazla bilgi için schema-agnostic dizin oluşturma makalemizi okuyun.

Davranış farklılıkları

  • Azure Cosmos DB Graph altyapısı genişlik öncelikli dolaşma çalıştırırken, TinkerPop Gremlin derinlik önceliklidir. Bu davranış, Azure Cosmos DB gibi yatay olarak ölçeklenebilir sistemde daha iyi performans sağlar.

Desteklenmeyen özellikler

  • Gremlin Bytecode , graf geçişleri için programlama dilinden bağımsız bir belirtimdir. Azure Cosmos DB Graph henüz desteklememektedir. GremlinClient.SubmitAsync() kullanın ve geçişi bir metin dizesi olarak geçirin.

  • property(set, 'xyz', 1) set kardinalitesi bugün desteklenmiyor. Bunun yerine property(list, 'xyz', 1) kullanın. Daha fazla bilgi edinmek için bkz. TinkerPop ile köşe özellikleri.

  • Bumatch() adım şu anda kullanılamıyor. Bu adım bildirim temelli sorgulama özellikleri sağlar.

  • Köşelerde veya kenarlarda özellik olarak nesneler desteklenmez. Özellikler yalnızca temel türler veya diziler olabilir.

  • Dizi özelliklerineorder().by(<array property>) göre sıralama desteklenmez. Yalnızca temel türlere göre sıralama desteklenir.

  • İlkel olmayan JSON türleri desteklenmez. , numberveya true/false türlerini kullanın.string null değerleri desteklenmez.

  • GraphSONv3 seri hale getiricisi şu anda desteklenmiyor. Bağlantı yapılandırmasında Seri Hale Getirici, Okuyucu ve Yazıcı sınıflarını kullanın GraphSONv2 . Gremlin için Azure Cosmos DB tarafından döndürülen sonuçlar GraphSON biçimiyle aynı biçime sahip değildir.

  • Lambda ifadeleri ve işlevleri şu anda desteklenmemektedir. Bu, , .by{<expression>}ve .filter{<expression>} işlevlerini içerir.map{<expression>}. Daha fazla bilgi edinmek ve Gremlin adımlarını kullanarak bunları yeniden yazmayı öğrenmek için bkz. Lambdas'ta Not.

  • Sistemin dağıtılmış yapısı nedeniyle işlemler desteklenmez. Gremlin hesabında "kendi yazmalarınızı okumak" için uygun tutarlılık modelini yapılandırın ve çakışan yazmaları çözmek için iyimser eşzamanlılık kullanın.

Bilinen sınırlamalar

  • Orta çapraz geçiş .V() adımlarını içeren Gremlin sorguları için dizin kullanımı: Şu anda, yalnızca ilk .V() geçiş çağrısı, dizine eklenen filtreleri veya önkoşulları çözümlemek için dizini kullanır. Sonraki çağrılar dizine danışmaz ve bu da sorgunun gecikmesini ve maliyetini artırabilir.

Varsayılan dizin oluşturma varsayıldığında, adımla .V() başlayan tipik bir okuma Gremlin sorgusu, ekli filtreleme adımlarında veya .where() gibi .has() parametreleri kullanarak sorgunun maliyetini ve performansını iyileştirir. Örneğin:

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

Ancak, Gremlin sorgusuna birden .V() fazla adım eklendiğinde, sorgunun veri çözümlemesi en uygun olmayabilir. Örnek olarak aşağıdaki sorguyu alın:

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

Bu sorgu, adlı categoryözelliklerine göre iki köşe grubu döndürür. Bu durumda, yalnızca ilk çağrı, g.V().has('category', 'A') özelliklerinin değerlerine göre köşeleri çözümlemek için dizinini kullanır.

Bu sorgu için geçici bir çözüm olarak ve union()gibi .map() çıkarma adımlarını kullanabilirsiniz. Bu, aşağıda örneklenmiştir:

// 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'))

Gremlin executionProfile() adımını kullanarak sorguların performansını gözden geçirebilirsiniz.

Sonraki adımlar