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 programu Graph usługi Azure Cosmos DB uważnie śledzi 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 klienckie

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

Pobierz Źródło Wprowadzenie 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ść logiczną, całkowitą, bajtową, podwójną, zmiennoprzecinkową, długą, ciągową 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ę wierzchołka JSON zwróconą 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
        }
      ]
    }
  }

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

Właściwości 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 grafów.
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ści 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ści 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ę wierzchołków 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.

step 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 wygenerowanych 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 krok optional
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 kroku has() w celu dopasowania właściwości z początku danego ciągu Predykaty textP
TextP.endingWith(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat kroku has() 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 kroku has() , aby dopasować właściwość do zawartości danego ciągu Predykaty textP
TextP.notStartingWith(string) Funkcja filtrowania ciągów. Ta funkcja jest używana jako predykat kroku has() 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 dla has() kroku, aby dopasować właściwość, 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 dla has() 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 programu Graph w usłudze Azure Cosmos DB uruchamia przechodzenie według zakresu, podczas gdy tinkerPop Gremlin jest najpierw szczegółowy. 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 specyfikacja przechodzenia przez graf niezależna od języka programowania. Usługa Azure Cosmos DB Graph nie obsługuje go jeszcze. Użyj metody GremlinClient.SubmitAsync() do przekazania przechodzenia jako ciągu tekstowego.

  • property(set, 'xyz', 1) ustawienie kardynalności nie jest obecnie obsługiwane. Użycie w zamian parametru property(list, 'xyz', 1). Aby dowiedzieć się więcej, zobacz Właściwości wierzchołka za pomocą narzędzia TinkerPop.

  • Krok match() 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ści order().by(<array property>) tablicy nie jest obsługiwane. 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. Użyj GraphSONv2 klas Serializer, Reader i Writer w konfiguracji połączenia. Wyniki zwrócone przez usługę Azure Cosmos DB dla języka Gremlin nie mają tego samego formatu co format GraphSON.

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

  • 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 w celu rozwiązania konfliktowych zapisów.

Znane ograniczenia

  • Wykorzystanie indeksu dla zapytań Języka Gremlin z krokami przechodzenia środkowego.V(): obecnie tylko pierwsze .V() wywołanie przechodzenia będzie używać indeksu do rozpoznawania wszelkich dołączonych filtrów lub predykatów. Kolejne wywołania nie skonsultują 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, rozwiązanie danych dla zapytania może nie być optymalne. Weź pod uwagę 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(). Wynika to z poniższego przykładu:

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