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

PLATÍ PRO: Gremlin

Azure Cosmos DB podporuje jazyk apache Tinkerpop pro procházení grafů, 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 existují rozdíly v implementaci, které jsou specifické pro Službu Azure Cosmos DB. V tomto článku poskytujeme rychlý návod k gremlinu 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
Přejít na jazyk Přejít na jazyk Tuto knihovnu vytvářejí externí přispěvatelé. Tým Azure Cosmos DB nenabízí žádnou podporu ani neudržuje 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čů 3.4.* uvedené výše. Tato tabulka bude aktualizována, jakmile budou vyřešeny problémy s kompatibilitou pro tyto novější verze ovladačů.

Podporované objekty graphu

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 logické hodnoty, celé číslo, bajty, dvojité, plovoucí, dlouhé, řetězcové. 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. Například následující fragment kódu ukazuje reprezentaci vrcholu ve formátu JSON vráceného klientovi ze služby 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
        }
      ]
    }
  }

Vlastnosti používané ve formátu JSON pro vrcholy jsou popsané níže:

Vlastnost Popis
id ID vrcholu. Musí být jedinečný (v kombinaci s hodnotou , _partition pokud je k dispozici). Pokud se nezadá žádná hodnota, bude automaticky zadána s identifikátorem 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 k 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 hranu. 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 Description 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. 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 has() krok, který odpovídá vlastnosti se začátkem daného řetězce. Predikáty textového protokolu
TextP.endingWith(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro has() krok, který odpovídá vlastnosti s koncem daného řetězce. Predikáty textového protokolu
TextP.containing(string) Funkce filtrování řetězců. Tato funkce se používá jako predikát pro has() krok, který odpovídá vlastnosti s obsahem daného řetězce. Predikáty textového protokolu
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á daným řetězcem. Predikáty textového protokolu
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. Predikáty textového protokolu
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. Predikáty textového protokolu
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í

  • Grafový modul Azure Cosmos DB spouští procházení nejprve do šířky , zatímco TinkerPop Gremlin je 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 specifikace programovacího jazyka nezávislá na 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 set není v současné části podporována. 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 možnosti deklarativního dotazování.

  • Objekty jako vlastnosti vrcholů nebo hran se nepodporují. Vlastnosti můžou být pouze primitivní typy nebo pole.

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

  • Jiné než primitivní typy JSON se nepodporují. Použijte stringtypy , numbernebo true/false . 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 .map{<expression>}funkce , , .by{<expression>}a ..filter{<expression>} Další informace a informace o tom, jak je přepsat pomocí kroků Gremlin, najdete v tématu Poznámka k lambdám.

  • Transakce nejsou podporovány z důvodu distribuované povahy systému. Nakonfigurujte v účtu Gremlin odpovídající model konzistence tak, aby si načítal vlastní zápisy, a při řešení konfliktních zápisů použijte optimistickou souběžnost.

Známá omezení

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

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

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

Pokud je však dotaz Gremlin zahrnutý více než jeden .V() krok, nemusí být řešení dat pro dotaz optimální. Vezměme si jako příklad 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ě 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žít dílčí kroky, jako .map() jsou a union(). Příklad najdete 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