ınkerpop özellikleriyle Azure Cosmos DB gremlin graph desteği ve uyumluluğu

Uygulama hedefı: Gremlin API

Azure Cosmos DB, gremlinolarak bilinen Apache tinkerpop 'un grafik çapraz 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 özgü farklılıklar vardır. Bu makalede, Gremlin için hızlı bir yol sunuyoruz ve Gremlin API tarafından desteklenen Gremlin özelliklerini listeliyoruz.

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 bağlayıcı sürümü
.NET GitHub’da Gremlin.NET .NET kullanarak Grafik oluşturma 3.4.6
Java Gremlin JavaDoc Java kullanarak Grafik oluşturma 3.2.0+
Node.js GitHub’da Gremlin-JavaScript Node.js kullanarak Grafik oluşturma 3.3.4 +
Python Gremlin-Python on GitHub Python kullanarak Grafik oluşturma 3.2.7
PHP Github'da Gremlin-PHP PHP kullanarak Grafik oluşturma 3.1.0
Git lang Git lang Bu kitaplık, dış katkıda bulunanlar tarafından oluşturulmuştur. Azure Cosmos DB takım herhangi bir destek sunmaz veya kitaplığı korumaz.
Gremlin konsolu TinkerPop belgeleri Gremlin konsolunu kullanarak Grafik oluşturma 3.2.0 +

desteklenen Graph 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 Boolean, Tamsayı, Bayt, Çift, Kayan Sayı, Uzun, Dize 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 destekliyor. örneğin, aşağıdaki kod parçacığında Azure Cosmos DB istemciye döndürülen bir köşesinin JSON temsili gösterilmektedir:

  {
    "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öşelere yönelik 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 birlikte _partition ). Değer sağlanmazsa, otomatik olarak bir GUID ile sağlanacaktır
label Köşenin etiketi. Bu özellik varlık türünü tanımlamakta 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ı. Grafik bölümlendirmeiçin kullanılır.
outE Bu özellik, bir köşenin giden kenarlarının bir 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 birlikte _partition )
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 köşelerin bir 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 has() özelliğin belirli bir dizenin başlangıcıyla eşleşmesi için bir koşul olarak kullanılır TextP koşulları
TextP.endingWith(string) Dize filtreleme işlevi. Bu işlev, has() belirli bir dizenin sonu ile bir özelliği eşleştirmek için bir koşul olarak kullanılır TextP koşulları
TextP.containing(string) Dize filtreleme işlevi. Bu işlev, has() belirli bir dizenin içeriğiyle bir özelliği eşlemek için adım için bir koşul olarak kullanılır TextP koşulları
TextP.notStartingWith(string) Dize filtreleme işlevi. Bu işlev, has() belirli bir dize ile başlamabir özelliği eşlemek için adım için bir koşul olarak kullanılır TextP koşulları
TextP.notEndingWith(string) Dize filtreleme işlevi. Bu işlev, has() belirli bir dizeyle bitmeyen bir özelliği eşleştirmek için bir koşul olarak kullanılır TextP koşulları
TextP.notContaining(string) Dize filtreleme işlevi. Bu işlev, has() belirli bir dize içermeyen bir özelliği eşleştirmek için bir koşul olarak kullanılır TextP koş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ı, tinkerpop gremlin 'in derinliği ilk kez olacak şekilde, ilk çapraz geçişi çalıştırır. bu davranış, Cosmos DB benzer şekilde yatay ölçeklenebilir sistemde daha iyi performans elde eder.

Desteklenmeyen özellikler

  • Gremlin Bytecode graf dolaşma işlemlerine yönelik programlama dilinden bağımsız bir belirtimdir. Cosmos DB Graph henüz desteklemez. GremlinClient.SubmitAsync() kullanın ve geçişi bir metin dizesi olarak geçirin.

  • property(set, 'xyz', 1) kardinalite kümesi bugün desteklenmiyor. Bunun yerine property(list, 'xyz', 1) kullanın. Daha fazla bilgi için bkz. ınkerpop Ile köşe özellikleri.

  • match() Adım Şu anda kullanılamıyor. Bu adım bildirime dayalı sorgulama özellikleri sağlar.

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

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

  • Ilkel olmayan JSON türleri desteklenmez. string, number Veya türlerini kullanın true / false . null değerler desteklenmez.

  • GraphSONv3 seri hale getirici Şu anda desteklenmiyor. GraphSONv2Bağlantı yapılandırmasındaki serileştirici, okuyucu ve yazıcı sınıflarını kullanın. Azure Cosmos DB gremlin apı tarafından döndürülen sonuçlar graphson biçimiyle aynı biçimde değil.

  • Lambda ifadeleri ve işlevleri Şu anda desteklenmemektedir. Bu,, .map{<expression>} .by{<expression>} ve .filter{<expression>} işlevlerini içerir. Daha fazla bilgi edinmek ve Gremlin adımlarını kullanarak bunları yeniden yazmayı öğrenmek için Lambdalar hakkında bir notabakın.

  • Sistemin dağıtılmış doğası nedeniyle işlemler desteklenmiyor. Gremlin hesabında uygun tutarlılık modelini "kendi yazınızla okumak" üzere yapılandırın ve çakışan yazmaları çözümlemek için iyimser eşzamanlılık kullanın.

Bilinen sınırlamalar

  • Orta çapraz geçiş .V() adımlarıyla Gremlin sorguları için dizin kullanımı: Şu anda, .V() bir geçiş geçişinin yalnızca ilk çağrısı, bu dizine iliştirilmiş tüm filtre ve koşullara çözüm sağlamak için dizini kullanır. Sonraki çağrılar dizine danışmayacak, bu da sorgunun gecikmesini ve maliyetini artırabilir.

Varsayılan dizin oluşturma varsayılırsa, adımla başlayan tipik bir okunan Gremlin sorgusu, .V() .has() .where() sorgu maliyetini ve performansını iyileştirmek için veya gibi ilgili filtreleme adımlarında parametreleri kullanacaktır. Örnek:

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

Ancak, .V() Gremlin sorgusuna birden fazla adım eklendiğinde, sorgu verilerinin çözümlenmesi en iyi durumda olmayabilir. Örnek olarak aşağıdaki sorguyu gerçekleştirin:

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

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

Bu sorguya yönelik bir geçici çözüm, ve gibi subtraversal adımlarını kullanmaktır .map() union() . Bu, aşağıda belirtilen şekilde belirlenir:

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