Podpora a kompatibilita grafů Azure Cosmos DB pro Gremlin s funkcemi TinkerPop

PLATÍ PRO: Skřítek

Azure Cosmos DB podporuje jazyk procházení grafů Apache Tinkerpop, označovaný 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.

Grafový modul Azure Cosmos DB úzce dodržuje specifikaci kroků procházení Apache TinkerPop , ale implementace je specifická pro službu Azure Cosmos DB. V tomto článku poskytujeme rychlý návod pro Gremlin a výčet funkcí Gremlin podporovaných rozhraním API pro Gremlin.

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á/doporučená verze konektoru
.NET Gremlin.NET na GitHubu Vytvoření grafu pomocí jazyka .NET 3.4.13
Java Gremlin JavaDoc Vytvoření grafu pomocí jazyka Java 3.4.13
Python Gremlin-Python na GitHubu Vytvoření grafu pomocí jazyka Python 3.4.13
Konzola Gremlin Dokumentace k TinkerPop Vytvoření grafu pomocí konzoly Gremlin 3.4.13
Node.js Gremlin-JavaScript na GitHubu Vytvoření grafu pomocí jazyka Node.js 3.4.13
PHP Gremlin-PHP na GitHubu Vytvoření grafu pomocí jazyka PHP 3.1.0
Jazyk Go Jazyk Go Tuto knihovnu vytvářejí externí přispěvatelé. Tým Azure Cosmos DB nenabízí žádnou podporu ani neschová knihovnu.

Poznámka:

Verze klientského ovladače Gremlin pro verzi 3.5.*, 3.6.* mají známé problémy s kompatibilitou, proto doporučujeme používat nejnovější podporované verze ovladače 3.4.* uvedené výše. Tato tabulka bude aktualizována, pokud byly problémy s kompatibilitou vyřešeny pro tyto novější verze ovladačů.

Podporované objekty grafu

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 Notes
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 logickou hodnotu, celé číslo, bajt, Double, Float, 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 drátu Gremlin

Azure Cosmos DB používá při vracení výsledků z operací Gremlin formát JSON. Azure Cosmos DB v současné době podporuje formát JSON. Následující fragment kódu například ukazuje reprezentaci vrcholu vráceného klientovi ze služby 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é ve formátu 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 k dispozici). Pokud není zadána žádná hodnota, automaticky se zadá s identifikátorem GUID.
label Popisek vrcholu. Tato vlastnost slouží 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 okrajů 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 k dispozici)
label Popisek okraje. Tato vlastnost je volitelná a slouží k popisu typu vztahu.
inV Tato vlastnost obsahuje seznam vrcholů pro okraj. 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.

step 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í vygenerovaných provedeným krokem Gremlin. executionProfile – krok
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. optional step
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 kroku tak has() , aby odpovídal vlastnosti se začátkem daného řetězce. Predikáty textového kódu
TextP.endingWith(string) Funkce filtrování řetězců Tato funkce se používá jako predikát kroku tak has() , aby odpovídal vlastnosti s koncem daného řetězce. Predikáty textového kódu
TextP.containing(string) Funkce filtrování řetězců Tato funkce se používá jako predikát kroku tak has() , aby odpovídal vlastnosti s obsahem daného řetězce. Predikáty textového kódu
TextP.notStartingWith(string) Funkce filtrování řetězců Tato funkce se používá jako predikát kroku tak has() , aby odpovídal vlastnosti, která nezačíná daným řetězcem. Predikáty textového kódu
TextP.notEndingWith(string) Funkce filtrování řetězců Tato funkce se používá jako predikát kroku tak has() , aby odpovídal vlastnosti, která nekončí daným řetězcem. Predikáty textového kódu
TextP.notContaining(string) Funkce filtrování řetězců Tato funkce se používá jako predikát kroku tak has() , aby odpovídal vlastnosti, která neobsahuje daný řetězec. Predikáty textového kódu
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 Graphu služby Azure Cosmos DB spouští procházení na šířku, zatímco Gremlin je TinkerPop nejprve hloubkový. Toto chování dosahuje lepšího výkonu v horizontálně škálovatelném systému, jako je Azure Cosmos DB.

Nepodporované funkce

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

  • property(set, 'xyz', 1) kardinalita sady se dnes nepodporuje. Místo toho použijte property(list, 'xyz', 1). Další informace najdete v tématu Vlastnosti vrcholů s TinkerPop.

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

  • Objekty jako vlastnosti na vrcholech nebo hranách nejsou podporované. Vlastnosti můžou být pouze primitivní typy nebo pole.

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

  • Nepodporované typy JSON nejsou primitivní. Použijte string, numbernebo true/false typy. null hodnoty nejsou podporovány.

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

  • Výrazy a funkce lambda se v současné době nepodporují. To zahrnuje funkce .map{<expression>}, a .by{<expression>}.filter{<expression>} funkce. Další informace a informace o tom, jak je přepsat pomocí kroků Gremlin, najdete v poznámkě k lambdas.

  • Transakce nejsou podporovány z důvodu distribuované povahy systému. Nakonfigurujte vhodný model konzistence na účtu Gremlin tak, aby "četl vlastní zápisy" a pomocí optimistické souběžnosti vyřešte konfliktní zápisy.

Známá omezení

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

Za předpokladu výchozího indexování by typický dotaz Gremlin, který začíná .V() krokem, používal parametry v připojených krocích filtrování, jako .has() je například optimalizace .where() nákladů a výkonu dotazu. Příklad:

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

Pokud je však do dotazu Gremlin zahrnuto více než jeden .V() krok, nemusí být překlad dat pro dotaz optimální. Jako příklad použijte 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 volané category. V tomto případě použije index pouze první volání g.V().has('category', 'A') k překladu vrcholů na základě hodnot jejich vlastností.

Alternativním řešením pro tento dotaz je použití dílčích kroků, jako .map() je například a union(). Toto je znázorněno níže:

// 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 GremlinexecutionProfile().

Další kroky