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žijteproperty(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
stringtypy , nebonumbertrue/false.nullHodnoty nejsou podporované.Serializátor GraphSONv3 se v současné době nepodporuje. V
GraphSONv2konfiguraci 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
- 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.