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 parametruproperty(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
string
typów ,number
lubtrue
/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
- Rozpocznij tworzenie aplikacji grafu przy użyciu zestawów SDK firmy Microsoft
- Dowiedz się więcej na temat obsługi grafów w usłudze Azure Cosmos DB