Azure Cosmos DB pro podporu a kompatibilitu grafů Gremlin s funkcemi TinkerPop

Important

Hledáte databázové řešení pro scénáře ve velkém měřítku s 99,999% smlouvou o úrovni služeb (SLA), okamžitým automatickým škálováním a automatickým převzetím služeb při selhání napříč několika oblastmi? Zvažte Azure Cosmos DB pro NoSQL.

Chcete implementovat graf online analytického zpracování (OLAP) nebo migrovat existující aplikaci Apache Gremlin? Zvažte Graph v Microsoft Fabricu.

Azure Cosmos DB podporuje Apache Tinkerpop jazyk procházení grafu, 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.

Azure Cosmos DB modul Graphu úzce sleduje specifikaci kroků procházení Apache TinkerPop, ale implementace je specifická pro 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 pro Azure Cosmos DB:

Download Source Začínáme Podporovaná/doporučená verze konektoru
.NET Gremlin.NET na GitHub Kreate Graph pomocí .NET 3.4.13
Java Gremlin JavaDoc Kreate Graph pomocí Java 3.4.13
Python Gremlin-Python na GitHub Kreate Graph pomocí 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 GitHub Vytvoření grafu pomocí jazyka PHP 3.1.0
Go Go Tuto knihovnu vytvářejí externí přispěvatelé. Tým Azure Cosmos DB nenabízí žádnou podporu ani knihovnu neudržuje.

Note

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, vysokou souběžnost a zapisovatelnou grafovou databázi, kterou je možné rozdělit na více serverů nebo clusterů.

Následující tabulka uvádí funkce TinkerPop implementované Azure Cosmos DB:

Kategorie implementace Azure Cosmos DB Poznámky
Funkce grafů Poskytuje trvalost a souběžný přístup. Navrženo k podpoře transakcí. Počítačové metody je možné implementovat prostřednictvím konektoru Spark.
Proměnné vlastnosti 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.
Vlastnosti vrcholů Podporuje RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty. Podporuje vytváření, upravování a odstraňování vrcholů.
Vlastnosti vrcholů StringIds, UserSuppliedIds, AddProperty (Přidat vlastnost), RemoveProperty (Odebrat vlastnost), BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Podporuje vytváření, úpravy a odstraňování vlastností vrcholů.
Funkce okrajů PřidatHrany, OdebratHrany, ŘetězcovéId, UživatelskyPoskytnutéId, PřidatVlastnost, OdebratVlastnost Podporuje vytváření, úpravy a odstraňování okrajů.
Funkce vlastností okrajů Vlastnosti, 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 při vracení výsledků z operací Gremlin používá formát JSON. Azure Cosmos DB aktuálně podporuje formát JSON. Například následující ukázka zobrazuje JSONovou reprezentaci vrcholu vráceného klientovi z 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 popsány níže:

Vlastnictví Description
id Identifikátor vrcholu. Musí být jedinečný (v kombinaci s hodnotou _partition , pokud je k dispozici). Pokud není zadána žádná hodnota, bude automaticky přiřazen identifikátor 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 odchozích hran z vrcholu. Ukládání informací o sousedství spolu s vrcholem umožňuje rychlé procházení. Hrany jsou seskupeny podle svých štítků.

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

Vlastnictví Description
value Hodnota vlastnosti

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

Vlastnictví Description
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 hranou umožňuje rychlé procházení. Vrcholy jsou seskupeny podle svých štítků.
properties Sada uživatelem definovaných vlastností přidružených k okraji.

Kroky v jazyce Gremlin

Teď se podíváme na kroky Gremlin podporované Azure Cosmos DB. Úplnou referenci ke Gremlinu najdete v referenční příručce TinkerPop.

krokovat Description Dokumentace TinkerPop 3.2
addE Přidá hranu mezi dva vrcholy. přidat krok
addV Přidá do grafu vrchol. addV step
and Zajišťuje, že všechna procházení vrátí hodnotu. a krok
as Modulátor kroku pro přiřazení proměnné k výstupu kroku. jako krok
by Modulátor kroku používaný s krokem group a order. krok za krokem
coalesce Vrátí první procházení, které poskytne výsledek. krok slučování
constant Vrátí konstantní hodnotu. Používá se s coalesce. konstantní krok
count Vrátí počet procházení. krok počítání
dedup Vrátí hodnoty s odebranými duplicitními objekty. Krok odstranění duplicitních dat
drop Zahodí hodnoty (vrchol/hrana). odsazení kroku
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ů. skládací krok
group Seskupí hodnoty na základě zadaných popisků. krok skupiny
has Slouží k filtrování vlastností, vrcholů a okrajů. Podporuje varianty hasLabel, hasId, hasNot a has. má krok
inject Vloží hodnoty do streamu. krok injekce
is Slouží k filtrování pomocí logického výrazu. je krok
limit Slouží k omezení počtu položek v procházení. krok limitu
local Lokálně obaluje oddíl procházení podobně jako u vnořeného dotazu. místní krok
not Slouží k vytvoření negace filtru. nepostupovat
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. nebo krok
order Vrátí výsledky v zadaném pořadí řazení. krok objednávky
path Vrátí úplnou cestu procházení. krok cesty
project Zobrazí vlastnosti jako mapu. krok projektu
properties Vrátí vlastnosti zadaných štítků. krok vlastností
range Vyfiltruje zadaný rozsah hodnot. krok rozsahu
repeat Opakuje krok po zadaný počet opakování. Slouží k vytváření cyklů. opakujte krok
sample Slouží k zobrazení ukázkových výsledků z procházení. ukázkový krok
select Slouží k zobrazení výsledků z procházení. výběr kroku
store Slouží k zobrazení neblokujících agregací z procházení. krok ukládání
TextP.startingWith(string) Funkce filtrování řetězců Tato funkce se používá jako predikát pro krok has(), aby odpovídala vlastnosti se začátkem daného řetězce. TextP predikáty
TextP.endingWith(string) Funkce filtrování řetězců Tato funkce se používá jako predikát kroku has(), aby porovnávala vlastnost 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(), aby odpovídala 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 krok has(), aby odpovídala vlastnosti, která nezačíná daným řetězcem. TextP predikáty
TextP.notEndingWith(string) Funkce filtrování řetězců Tato funkce se používá jako predikát kroku has(), aby shodovala se s vlastností, 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 kroku has() pro přiřazení vlastnosti, která neobsahuje daný řetězec. TextP predikáty
tree Agreguje cesty z vrcholu do stromu. krok ve stromové struktuře
unfold Rozbalit iterátor po krocích. rozbalit krok
union Sloučí výsledky z více procházení. sjednocovací krok
V Zahrnuje kroky nutné pro procházení mezi vrcholy a okraji: V, E, out, in, both, outE, inE, bothE, outV, inV, bothV a otherV. vrcholové kroky
where Slouží k filtrování výsledků z procházení. Podporuje operátory eq, neq, lt, lte, gt, gte a between. kde krok

Modul optimalizovaný pro zápis poskytovaný Azure Cosmos DB ve výchozím nastavení podporuje automatické indexování všech vlastností v rámci vrcholů a hran. 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í v Azure Cosmos DB, najdete v našem dokumentu o schéma-agnostickém indexování.

Rozdíly v chování

  • Azure Cosmos DB stroj Graphu běží šířkové prohledávání, zatímco TinkerPop Gremlin je hloubkové prohledávání. 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í pole datorder().by(<array property>) není podporováno. Podporuje se řazení pouze podle primitivních typů.

  • Nepodporované jsou neprimární typy JSON. 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é 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>}, .by{<expression>} a .filter{<expression>}. Chcete-li se dozvědět více a zjistit, jak je přepsat pomocí kroků ve stylu Gremlin, podívejte se na poznámku k lambdám.

  • 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ě index využije pouze první .V() volání procházení k vyřešení všech filtrů nebo predikátů připojených k tomuto volání. Následná volání nebudou využívat index, 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á krokem .V(), používal parametry ve svých připojených krocích filtrování, jako jsou .has() nebo .where(), aby optimalizoval náklady a výkon dotazu. Například:

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

Pokud je však do dotazu Gremlin zahrnuto více než jeden .V() krok, nemusí být vyřešení 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 nazvané category. V tomto případě pouze první volání g.V().has('category', 'A') využije index k určení vrcholů na základě hodnot jejich vlastností.

Alternativním řešením pro tento dotaz je použití dílčích subtraverzních kroků, jako je například .map() 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 Gremlin executionProfile() .