Obsługa grafów Języka Gremlin w usłudze Azure Cosmos DB i zgodność z funkcjami tinkerPop

DOTYCZY: Gremlin

Usługa Azure Cosmos DB obsługuje język przechodzenia grafu apache Tinkerpop znany jako Gremlin. Język Gremlin służy do tworzenia jednostek grafu (wierzchołków i krawędzi), modyfikacji właściwości w ramach tych elementów, wykonywania zapytań i przejść oraz usuwania elementów.

Aparat grafów usługi Azure Cosmos DB jest ściśle zgodny ze specyfikacją kroków przechodzenia apache TinkerPop , ale istnieją różnice w implementacji specyficznej dla usługi Azure Cosmos DB. W tym artykule przedstawiono szybki przewodnik po języku Gremlin i wyliczenie funkcji języka Gremlin obsługiwanych przez interfejs API dla języka Gremlin.

Zgodne biblioteki klienta

W poniższej tabeli przedstawiono popularne sterowniki Gremlin, których można użyć do usługi Azure Cosmos DB:

Pobierz Element źródłowy Getting Started Obsługiwana/zalecana wersja łącznika
.NET Gremlin.NET w witrynie GitHub Tworzenie grafu przy użyciu platformy .NET 3.4.13
Java Gremlin JavaDoc Tworzenie grafu przy użyciu środowiska Java 3.4.13
Python Gremlin-Python w witrynie GitHub Tworzenie grafu przy użyciu środowiska Python 3.4.13
Konsola Gremlin Dokumentacja dotycząca witryny TinkerPop Tworzenie grafu przy użyciu Konsoli Gremlin 3.4.13
Node.js Gremlin-JavaScript w witrynie GitHub Tworzenie grafu przy użyciu platformy Node.js 3.4.13
PHP Gremlin-PHP w witrynie GitHub Tworzenie grafu przy użyciu środowiska PHP 3.1.0
Go Lang Go Lang Ta biblioteka jest tworzona przez współautorów zewnętrznych. Zespół usługi Azure Cosmos DB nie oferuje żadnej pomocy technicznej ani nie obsługuje biblioteki.

Uwaga

Wersje sterowników klienta gremlin dla wersji 3.5.*, 3.6.* mają znane problemy ze zgodnością, dlatego zalecamy używanie najnowszych obsługiwanych wersji sterowników 3.4.* wymienionych powyżej. Ta tabela zostanie zaktualizowana po rozwiązaniu problemów ze zgodnością dla nowszych wersji sterowników.

Obsługiwane obiekty grafu

TinkerPop jest standardem, który obejmuje szeroki zakres technologii grafów. Dlatego ma standardową terminologię do opisywania, jakie funkcje są udostępniane przez dostawcę grafu. Usługa Azure Cosmos DB zapewnia trwałą, zapisywalną bazę danych grafów o dużej współbieżności, którą można podzielić na partycje w wielu serwerach lub klastrach.

W poniższej tabeli wymieniono funkcje struktury TinkerPop wdrażane przez usługę Azure Cosmos DB:

Kategoria Wdrożenie usługi Azure Cosmos DB Uwagi
Funkcjonalności grafu Zapewnia funkcjonalności Persistence i ConcurrentAccess. Zaprojektowana obsługa funkcjonalności Transactions Metody komputera mogą być wdrażane przy użyciu łącznika Spark.
Funkcjonalności zmiennych Obsługuje wartości logiczne, liczby całkowite, bajty, podwójne, zmiennoprzecinkowe, długie, ciągi Obsługuje typy pierwotne, a zgodność z typami złożonymi jest osiągana za pomocą modelu danych
Funkcjonalności wierzchołków Obsługuje funkcje RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Obsługuje tworzenie, modyfikowanie i usuwanie wierzchołków
Funkcjonalności właściwości wierzchołków StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Obsługuje tworzenie, modyfikowanie i usuwanie właściwości wierzchołków
Funkcjonalności krawędzi AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Obsługuje tworzenie, modyfikowanie i usuwanie krawędzi
Funkcjonalności właściwości krawędzi Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Obsługuje tworzenie, modyfikowanie i usuwanie właściwości krawędzi

Format przewodu Gremlin

Usługa Azure Cosmos DB używa formatu JSON podczas zwracania wyników z operacji języka Gremlin. Usługa Azure Cosmos DB obecnie obsługuje format JSON. Na przykład poniższy fragment kodu przedstawia reprezentację JSON wierzchołka zwróconego do klienta z usługi 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
        }
      ]
    }
  }

Poniżej opisano właściwości używane w formacie JSON dla wierzchołków:

Właściwość Opis
id Identyfikator wierzchołka. Musi być unikatowa (w połączeniu _partition z wartością , jeśli ma zastosowanie). Jeśli żadna wartość nie zostanie podana, zostanie ona automatycznie dostarczona z identyfikatorem GUID
label Etykieta wierzchołka. Ta właściwość służy do opisywania typu jednostki.
type Służy do odróżnienia wierzchołków od dokumentów bez grafów
properties Pakiet właściwości zdefiniowanych przez użytkownika skojarzonych z wierzchołkiem. Każda właściwość może mieć wiele wartości.
_partition Klucz partycji wierzchołka. Służy do partycjonowania grafu.
outE Ta właściwość zawiera listę krawędzi wychodzących z wierzchołka. Przechowywanie informacji sąsiedztwa razem z wierzchołkiem umożliwia szybkie wykonanie przejść. Krawędzie są pogrupowane w oparciu o etykiety.

Każda właściwość może przechowywać wiele wartości w tablicy.

Właściwość Opis
value Wartość właściwości.

Krawędź zawiera następujące informacje, aby pomóc w nawigacji do innych części grafu.

Właściwość Opis
id Identyfikator krawędzi. Musi być unikatowa (w połączeniu _partition z wartością , jeśli ma zastosowanie)
label Etykieta krawędzi. Ta właściwość jest opcjonalna i służy do opisu typu relacji.
inV Ta właściwość zawiera listę w wierzchołkach dla krawędzi. Przechowywanie informacji sąsiedztwa razem z krawędzią umożliwia szybkie wykonanie przejść. Wierzchołki są pogrupowane w oparciu o etykiety.
properties Pakiet właściwości zdefiniowanych przez użytkownika skojarzonych z krawędzią.

Kroki w środowisku Gremlin

Teraz przyjrzyjmy się krokom w środowisku Gremlin obsługiwanym przez usługę Azure Cosmos DB. Aby uzyskać pełną dokumentację dotyczącą języka Gremlin, zobacz odwołanie do struktury TinkerPop.

krok Opis Dokumentacja dotycząca struktury TinkerPop 3.2
addE Dodaje krawędź między dwoma wierzchołkami krok addE
addV Dodaje wierzchołek do grafu krok addV
and Gwarantuje, że wszystkie przejścia zwracają wartość krok and
as Modulator kroku do przypisania zmiennej do wyniku kroku krok as
by Modulator kroku używany z elementami group i order krok by
coalesce Zwraca pierwsze przejście, które zwraca wynik krok coalesce
constant Zwraca wartość stałą. Używany z krokiem coalesce krok constant
count Zwraca liczbę z przejścia krok count
dedup Zwraca wartości z usuniętymi duplikatami krok dedup
drop Upuszcza wartości (wierzchołek/krawędź) krok drop
executionProfile Tworzy opis wszystkich operacji generowanych przez wykonany krok języka Gremlin executionProfile — krok
fold Działa jak bariera, która oblicza agregację wyników krok fold
group Grupuje wartości w oparciu o określone etykiety krok group
has Służy do filtrowania właściwości, wierzchołków i krawędzi. Obsługuje warianty hasLabel, hasId, hasNot i has. krok step
inject Wstawia wartości do strumienia krok inject
is Służy do wykonywania filtru przy użyciu wyrażenia logicznego krok is
limit Pozwala ograniczyć liczbę elementów podczas przechodzenia krok limit
local Krok local opakowuje sekcję przejścia, podobnie jak podzapytanie krok local
not Służy do tworzenia negacji filtru krok not
optional Zwraca wynik określonego przejścia, jeśli wstrzymuje wynik lub zwraca wywołujący element opcjonalny krok
or Gwarantuje, że co najmniej jedno przejście zwróci wartość krok or
order Zwraca wyniki w określonej kolejności sortowania krok order
path Zwraca pełną ścieżkę przejścia krok path
project Projektuje właściwości jako mapę krok project
properties Zwraca właściwości dla określonych etykiet krok properties
range Filtruje do określonego zakresu wartości krok range
repeat Powtarza krok określoną liczbę razy. Używany do zapętlenia krok repeat
sample Służy do próbkowania wyników z przejścia krok sample
select Służy do projektowania wyników z przejścia krok select
store Używany do nieblokujących agregacji z przejścia krok store
TextP.startingWith(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat has() dla kroku w celu dopasowania właściwości do początku danego ciągu Predykaty textP
TextP.endingWith(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat has() dla kroku w celu dopasowania właściwości do końca danego ciągu Predykaty textP
TextP.containing(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat has() dla kroku w celu dopasowania właściwości do zawartości danego ciągu Predykaty textP
TextP.notStartingWith(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat has() dla kroku w celu dopasowania właściwości, która nie zaczyna się od danego ciągu Predykaty textP
TextP.notEndingWith(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat has() dla kroku w celu dopasowania właściwości, która nie kończy się na danym ciągu Predykaty textP
TextP.notContaining(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat has() dla kroku w celu dopasowania właściwości, która nie zawiera danego ciągu Predykaty textP
tree Agreguje ścieżki z wierzchołka do drzewa krok tree
unfold Odwija iterator w ramach kroku krok unfold
union Scalanie wyników z wielu przejść krok union
V Zawiera kroki niezbędne do przejść między wierzchołkami i krawędziami V, E, out, in, both, outE, inE, bothE, outV, inV, bothV, oraz otherV do kroki vertex
where Służy do filtrowania wyników z przejścia. Obsługuje operatory eq, neq, lt, lte, gt, gte i between krok where

Aparat zoptymalizowany pod kątem zapisu oferowany w usłudze Azure Cosmos DB obsługuje domyślnie automatyczne indeksowanie wszystkich właściwości w wierzchołkach i krawędziach. W związku z tym zapytania z filtrami, zapytania zakresu, sortowanie lub agregacje na dowolnej właściwości są przetwarzane z indeksu i skutecznie obsługiwane. Więcej informacji na temat działania indeksowania w usłudze Azure Cosmos DB znajduje się w dokumencie dotyczącym indeksowania niezależnie od schematu.

Różnice w zachowaniu

  • Aparat grafów usługi Azure Cosmos DB uruchamia przechodzenie w pierwszej kolejności, podczas gdy narzędzie TinkerPop Gremlin jest najpierw szczegółowe. To zachowanie zapewnia lepszą wydajność w skalowalnym poziomie systemie, takim jak Usługa Azure Cosmos DB.

Nieobsługiwane funkcje

  • Kod bajtowy języka Gremlin to niezależna od języka programowania specyfikacja przechodzenia grafu. Graf usługi Azure Cosmos DB nie obsługuje go jeszcze. Użyj metody GremlinClient.SubmitAsync() do przekazania przechodzenia jako ciągu tekstowego.

  • property(set, 'xyz', 1) obecnie nie jest obsługiwana kardynalność zestawu. Zamiast tego użyj polecenia cmdlet property(list, 'xyz', 1). Aby dowiedzieć się więcej, zobacz Właściwości wierzchołka za pomocą narzędzia TinkerPop.

  • Krokmatch() nie jest obecnie dostępny. Ten krok zapewnia funkcje deklaratywnego wykonywania zapytań.

  • Obiekty jako właściwości wierzchołków lub krawędzi nie są obsługiwane. Właściwości mogą być tylko typami pierwotnymi lub tablicami.

  • Sortowanie według właściwościorder().by(<array property>) tablicy nie jest obsługiwany. Sortowanie jest obsługiwane tylko według typów pierwotnych.

  • Typy JSON inne niż pierwotne nie są obsługiwane. Użyj stringtypów , numberlub true/false . null wartości nie są obsługiwane.

  • Serializator GraphSONv3 nie jest obecnie obsługiwany. W konfiguracji połączenia należy używać GraphSONv2 klas serializatora, czytelnika i składnika zapisywania. Wyniki zwrócone przez usługę Azure Cosmos DB dla języka Gremlin nie mają tego samego formatu co format GraphSON.

  • Wyrażenia lambda i funkcje nie są obecnie obsługiwane. Obejmuje .map{<expression>}to funkcje , .by{<expression>}i .filter{<expression>} . Aby dowiedzieć się więcej i dowiedzieć się, jak je ponownie napisać przy użyciu kroków języka Gremlin, zobacz A Note on Lambdas (Uwaga dotycząca wyrażeń lambda).

  • Transakcje nie są obsługiwane ze względu na rozproszony charakter systemu. Skonfiguruj odpowiedni model spójności na koncie gremlin, aby "odczytywać własne zapisy" i używać optymistycznej współbieżności do rozwiązywania konfliktów zapisów.

Znane ograniczenia

  • Wykorzystanie indeksu dla zapytań Języka Gremlin z krokami przechodzenia .V() w połowie: obecnie tylko pierwsze .V() wywołanie przechodzenia będzie używać indeksu do rozpoznawania wszelkich filtrów lub predykatów dołączonych do niego. Kolejne wywołania nie będą konsultować się z indeksem, co może zwiększyć opóźnienie i koszt zapytania.

Przy założeniu, że indeksowanie domyślne, typowe zapytanie Języka Gremlin rozpoczynające się od .V() kroku będzie używać parametrów w dołączonych krokach filtrowania, takich jak .has() lub .where() w celu optymalizacji kosztów i wydajności zapytania. Na przykład:

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

Jeśli jednak w zapytaniu Gremlin znajduje się więcej niż jeden .V() krok, rozdzielczość danych dla zapytania może nie być optymalna. Weźmy następujące zapytanie jako przykład:

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

To zapytanie zwróci dwie grupy wierzchołków na podstawie ich właściwości o nazwie category. W takim przypadku tylko pierwsze wywołanie g.V().has('category', 'A') użyje indeksu, aby rozpoznać wierzchołki na podstawie wartości ich właściwości.

Obejściem tego zapytania jest użycie kroków podrzędnych, takich jak .map() i union(). Poniżej przedstawiono przykład:

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

Wydajność zapytań można przejrzeć przy użyciu kroku języka GremlinexecutionProfile().

Następne kroki