Podpora a kompatibilita grafů Gremlin ve službě Azure Cosmos DB s funkcemi TinkerPop

PLATÍ pro: rozhraní Gremlin API

Azure Cosmos DB podporuje jazyk pro procházení grafů od společnosti Apache Tinkerpop, který se označuje jako Gremlin. Pomocí jazyka Gremlin můžete vytvářet grafové entity (vrcholy a okraje), upravovat vlastnosti v rámci těchto entit, provádět dotazy a přechody a odstraňovat entity.

Modul Graph Azure Cosmos DB pečlivě dodržuje specifikaci kroků procházení Apache TinkerPop, ale existují rozdíly v implementaci, které jsou specifické pro Azure Cosmos DB. V tomto článku vám poskytneme rychlý návod pro Gremlin a vytvoříme výčet funkcí Gremlin, které podporuje rozhraní Gremlin API.

Kompatibilní klientské knihovny

Následující tabulka ukazuje oblíbené ovladače Gremlin, které můžete použít vůči Azure Cosmos DB:

Stáhnout Zdroj Začínáme Podporovaná verze konektoru
.NET Gremlin.NET na GitHubu Vytvoření grafu pomocí jazyka .NET 3.4.6
Java Gremlin JavaDoc Vytvoření grafu pomocí jazyka Java 3.2.0 nebo novější
Node.js Gremlin-JavaScript na GitHubu Vytvoření grafu pomocí jazyka Node.js 3.3.4+
Python Gremlin-Python na GitHubu Vytvoření grafu pomocí jazyka Python 3.2.7
PHP Gremlin-PHP na GitHubu Vytvoření grafu pomocí jazyka PHP 3.1.0
Go Lang Go Lang Tuto knihovnu jsou vytvořeny externími přispěvateli. Tým Azure Cosmos DB nenabízí žádnou podporu ani neudržování knihovny.
Konzola Gremlin Dokumentace k TinkerPop Vytvoření grafu pomocí konzoly Gremlin 3.2.0 nebo novější

Podporované Graph objektů

TinkerPop je standard, který zahrnuje širokou řadu grafových technologií. Proto má standardní terminologii popisující, které funkce poskytovatel grafu nabízí. Azure Cosmos DB poskytuje trvalou grafovou databázi s možností zápisu a vysokou souběžností, kterou je možné rozdělit na více serverů nebo clusterů.

V následující tabulce najdete přehled funkcí TinkerPop, které Azure Cosmos DB implementuje:

Kategorie Implementace služby Azure Cosmos DB Poznámky
Funkce grafů Poskytuje trvalost a souběžný přístup. Navrženo s podporou transakcí. Počítačové metody je možné implementovat prostřednictvím konektoru Spark.
Funkce proměnných Podporuje datové typy Boolean, Integer, Byte, Double, Float, Integer, Long, String. Podporuje primitivní typy, prostřednictvím datového modelu je kompatibilní s komplexními typy.
Funkce vrcholů Podporuje RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty. Podporuje vytváření, úpravy a odstraňování vrcholů.
Funkce vlastností vrcholů StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Podporuje vytváření, úpravy a odstraňování vlastností vrcholů.
Funkce okrajů AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Podporuje vytváření, úpravy a odstraňování okrajů.
Funkce vlastností okrajů Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Podporuje vytváření, úpravy a odstraňování vlastností okrajů.

Formát převodu Gremlin

Azure Cosmos DB používá při vracení výsledků z operací Gremlin formát JSON. Azure Cosmos DB aktuálně podporuje formát JSON. Například následující fragment kódu ukazuje reprezentaci vrcholu vráceného klientovi z Azure Cosmos DB ve formátu JSON:

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

Vlastnosti používané formátem JSON pro vrcholy jsou popsány níže:

Vlastnost Popis
id ID vrcholu. Musí být jedinečný (v kombinaci s hodnotou _partition , pokud je to možné). Pokud není zadána žádná hodnota, bude automaticky zadán identifikátor GUID.
label Popisek vrcholu. Tato vlastnost se používá k popisu typu entity.
type Slouží k odlišení vrcholů od jiných než grafových dokumentů.
properties Sada uživatelem definovaných vlastností přidružených k vrcholu. Každá vlastnost může mít více hodnot.
_partition Klíč oddílu vrcholu. Používá se pro dělení grafů.
outE Tato vlastnost obsahuje seznam hran z vrcholu. Ukládání informací o sousedství spolu s vrcholem umožňuje rychlé procházení. Hrany jsou seskupeny podle svých popisků.

Každá vlastnost může ukládat více hodnot v rámci pole.

Vlastnost Popis
value Hodnota vlastnosti

Hrana obsahuje následující informace, které usnadňují navigaci do ostatních částí grafu.

Vlastnost Popis
id ID okraje. Musí být jedinečný (v kombinaci s hodnotou _partition , pokud je to možné)
label Popisek okraje. Tato vlastnost je volitelná a slouží k popisu typu vztahu.
inV Tato vlastnost obsahuje seznam vrcholů pro hranici. Ukládání informací o sousedství spolu s okraj umožňuje rychlé procházení. Vrcholy jsou seskupeny podle svých popisků.
properties Sada uživatelem definovaných vlastností přidružených k okraji.

Kroky v jazyce Gremlin

Nyní se podívejme na kroky v jazyce Gremlin, které Azure Cosmos DB podporuje. Úplné referenční informace o jazyce Gremlin najdete v referenčních materiálech ke standardu TinkerPop.

Krok Popis Dokumentace TinkerPop 3.2
addE Přidá okraj mezi dva vrcholy. addE step
addV Přidá do grafu vrchol. addV step
and Zajišťuje, že všechna procházení vrátí hodnotu. and step
as Modulátor kroku pro přiřazení proměnné k výstupu kroku. as step
by Modulátor kroku používaný s krokem group a order. by step
coalesce Vrátí první procházení, které vrátí výsledek. coalesce step
constant Vrátí konstantní hodnotu. Používá se s krokem coalesce. constant step
count Vrátí počet procházení. count step
dedup Vrátí hodnoty s odebranými duplicitními objekty. dedup step
drop Zahodí hodnoty (vrchol/hrana). drop step
executionProfile Vytvoří popis všech operací generovaných spuštěným Gremlin krokem. Krok executionProfile
fold Slouží jako bariéra, která vypočítá agregaci výsledků. fold step
group Seskupí hodnoty na základě zadaných popisků. group step
has Slouží k filtrování vlastností, vrcholů a okrajů. Podporuje varianty hasLabel, hasId, hasNot a has. has step
inject Vloží hodnoty do streamu. inject step
is Slouží k filtrování pomocí logického výrazu. is step
limit Slouží k omezení počtu položek v procházení. limit step
local Místně zabalí oddíl procházení podobně jako u vnořeného dotazu. local step
not Slouží k vytvoření negace filtru. not step
optional Vrátí výsledek zadaného procházení, pokud vrací výsledek, jinak vrátí volající element. volitelný krok
or Zajišťuje, že alespoň jedno procházení vrátí hodnotu. or step
order Vrátí výsledky v zadaném pořadí řazení. order step
path Vrátí úplnou cestu procházení. path step
project Zobrazí vlastnosti jako mapu. project step
properties Vrátí vlastnosti zadaných popisků. properties step
range Vyfiltruje zadaný rozsah hodnot. range step
repeat Opakuje krok po zadaný počet opakování. Slouží k vytváření cyklů. repeat step
sample Slouží k zobrazení ukázkových výsledků z procházení. sample step
select Slouží k zobrazení výsledků z procházení. select step
store Slouží k zobrazení neblokujících agregací z procházení. store step
TextP.startingWith(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro krok, has() který odpovídá vlastnosti začínající na začátku daného řetězce. TextP predikáty
TextP.endingWith(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro krok, has() který odpovídá vlastnosti s koncem daného řetězce. TextP predikáty
TextP.containing(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro krok, has() který odpovídá vlastnosti s obsahem daného řetězce. TextP predikáty
TextP.notStartingWith(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro has() krok, který odpovídá vlastnosti, která nezačíná zadaným řetězcem. TextP predikáty
TextP.notEndingWith(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro has() krok, který odpovídá vlastnosti, která nekončí daným řetězcem. TextP predikáty
TextP.notContaining(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro has() krok, který odpovídá vlastnosti, která neobsahuje daný řetězec. TextP predikáty
tree Agreguje cesty z vrcholu do stromu. tree step
unfold Rozbalí iterátor jako krok. unfold step
union Sloučí výsledky z více procházení. union step
V Zahrnuje kroky nutné pro procházení mezi vrcholy a okraji: V, E, out, in, both, outE, inE, bothE, outV, inV, bothV a otherV. vertex steps
where Slouží k filtrování výsledků z procházení. Podporuje operátory eq, neq, lt, lte, gt, gte a between. where step

Modul optimalizovaný pro zápis, který Azure Cosmos DB poskytuje, podporuje ve výchozím nastavení automatické indexování všech vlastností v rámci vrcholů a okrajů. Proto se dotazy s filtry, rozsahové dotazy, řazení nebo agregace u všech vlastností zpracovávají z indexu a efektivně předávají. Další informace o tom, jak funguje indexování ve službě Azure Cosmos DB, najdete v našem dokumentu, který se věnuje indexování bez schémat.

Rozdíly v chování

  • Modul Graph Azure Cosmos Graph DB běží v šíři procházení, zatímco TinkerPop Gremlin je do hloubky. Toto chování dosahuje lepšího výkonu v horizontálně škálovatelném systému, jako je Cosmos DB.

Nepodporované funkce

  • Gremlin Bytecode je na konkrétním programovacím jazyku nezávislá specifikace pro procházení grafů. Cosmos Db Graph zatím nepodporuje. Použijte funkci GremlinClient.SubmitAsync() a předejte procházení jako textový řetězec.

  • property(set, 'xyz', 1) Kardinalitu set se v současné době nepodporuje. Místo toho použijte property(list, 'xyz', 1). Další informace najdete v tématu Vlastnosti vrcholů pomocí TinkerPop.

  • Tento match() krok momentálně není k dispozici. Tento krok poskytuje možnosti deklarativního dotazování.

  • Objekty jako vlastnosti vrcholů nebo hran nejsou podporovány. Vlastnosti můžou být pouze primitivní typy nebo pole.

  • Řazení podle vlastností pole order().by(<array property>) se nepodporuje. Podporuje se řazení pouze podle primitivních typů.

  • Primitivní typy JSON se nepodporují. Použijte string typy , nebo number true / false . null Hodnoty nejsou podporované.

  • Serializátor GraphSONv3 se v současné době nepodporuje. V GraphSONv2 konfiguraci připojení použijte třídy Serializer, Reader a Writer. Výsledky vrácené rozhraním Gremlin API služby Azure Cosmos DB nemají stejný formát jako formát GraphSON.

  • Výrazy a funkce lambda nejsou aktuálně podporovány. To zahrnuje .map{<expression>} , a funkce .by{<expression>} .filter{<expression>} . Další informace a informace o tom, jak je přepsat pomocí kroků Gremlin, najdete v poznámkách k výrazům Lambda.

  • Transakce nejsou podporované kvůli distribuované povaze systému. Nakonfigurujte v účtu Gremlin vhodný model konzistence pro čtení vlastních zápisů a k řešení konfliktních zápisů použijte optimistickou souběžnost.

Známá omezení

  • Využití indexů pro dotazy Gremlin .V() v krocích uprostřed procházení: V současné době pouze první volání procházení využije index k překladu libovolných filtrů nebo predikátů, které jsou k němu .V() připojené. Následná volání se nebudou poradit s indexem, což může zvýšit latenci a náklady na dotaz.

Za předpokladu, že je výchozí indexování, typický dotaz Gremlin pro čtení, který začíná krokem, použije parametry v připojených krocích filtrování, jako je nebo , k optimalizaci nákladů a výkonu .V() .has() .where() dotazu. Příklad:

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

Pokud však dotaz Gremlin obsahuje více než jeden krok, řešení dat pro dotaz nemusí .V() být optimální. Jako příklad si vezměte následující dotaz:

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

Tento dotaz vrátí dvě skupiny vrcholů na základě jejich vlastnosti s názvem category . V tomto případě pouze první volání použije index k vyřešení vrcholů na základě hodnot g.V().has('category', 'A') jejich vlastností.

Alternativním řešením pro tento dotaz je použití dílčích kroků, jako jsou a .map() union() . Příklad je následující:

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

Výkon dotazů můžete zkontrolovat pomocí kroku Gremlin. executionProfile()

Další kroky