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žijteproperty(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
,number
nebotrue
/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
- Pusťte se do vytváření grafové aplikace pomocí našich sad SDK.
- Přečtěte si další informace o podpoře grafu ve službě Azure Cosmos DB.