Az Azure Cosmos DB for Gremlin graph támogatása és kompatibilitása a TinkerPop funkcióival
A KÖVETKEZŐKRE VONATKOZIK: Gremlin
Az Azure Cosmos DB támogatja az Apache Tinkerpopgremlin nevű gráfbejárási nyelvét. A Gremlin nyelv segítségével létrehozhat gráfentitásokat (csúcspontokat és éleket), módosíthatja ezen entitások tulajdonságait, végrehajthat lekérdezéseket és bejárásokat, és törölhet entitásokat.
Az Azure Cosmos DB Graph-motor szorosan követi az Apache TinkerPop bejárási lépések specifikációját, de az Implementációban vannak eltérések, amelyek az Azure Cosmos DB-hez kapcsolódnak. Ebben a cikkben röviden bemutatjuk a Gremlint, és számba vesszük a Gremlin API által támogatott Gremlin-funkciókat.
Kompatibilis ügyfélkódtárak
Az alábbi táblázat az Azure Cosmos DB-n használható népszerű Gremlin-illesztőprogramokat foglalja össze:
Letöltés | Forrás | Első lépések | Az összekötő támogatott/ajánlott verziója |
---|---|---|---|
.NET | Gremlin.NET on GitHub | Gráf létrehozása a .NET használatával | 3.4.13 |
Java | Gremlin JavaDoc | Gráf létrehozása a Java használatával | 3.4.13 |
Python | Gremlin-Python a GitHubon | Gráf létrehozása a Python használatával | 3.4.13 |
Gremlin-konzol | TinkerPop dokumentumok | Gráf létrehozása a Gremlin-konzol használatával | 3.4.13 |
Node.js | Gremlin-JavaScript a GitHubon | Gráf létrehozása a Node.js használatával | 3.4.13 |
PHP | Gremlin-PHP a GitHubon | Gráf létrehozása a PHP használatával | 3.1.0 |
Go Lang | Go Lang | Ezt a kódtárat külső közreműködők készítik. Az Azure Cosmos DB csapata nem nyújt támogatást és nem tartja karban a kódtárat. |
Megjegyzés
A Gremlin 3.5.*, 3.6.* verziójú ügyfélillesztői ismert kompatibilitási problémákkal rendelkeznek, ezért javasoljuk, hogy a fent felsorolt legújabb támogatott 3.4.* illesztőprogram-verziókat használja. Ez a táblázat akkor frissül, ha az újabb illesztőprogram-verziók kompatibilitási problémáit elhárították.
Támogatott gráfobjektumok
A TinkerPop egy olyan szabvány, amely számos különböző gráftechnológiára kiterjed. Ebből adódóan szabványos kifejezésekkel írja le, hogy az egyes gráfszolgáltatók milyen funkciókat nyújtanak. Az Azure Cosmos DB egy állandó, magas egyidejűségű, írható gráfadatbázis, amely egyszerre több kiszolgálóra vagy fürtre is particionálható.
Az alábbi táblázat a TinkerPop azon funkcióit sorolja fel, amelyeket az Azure Cosmos DB megvalósít:
Kategória | Azure Cosmos DB-megvalósítás | Jegyzetek |
---|---|---|
Gráffunkciók | Állandóságot és egyidejű hozzáférést biztosít. A tranzakciók támogatására lett tervezve. | A számítógépes módszerek a Spark-összekötőn keresztül valósíthatók meg. |
Változófunkciók | Logikai, egész szám, bájt, dupla, lebegőpontos, hosszú, sztringet támogat | Támogatja az egyszerű típusokat, és kompatibilis az összetett típusokkal adatmodellek révén. |
Csúcspontfunkciók | A következőket támogatja: RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty. | Lehetővé teszi csúcspontok létrehozását, módosítását és törlését. |
Csúcsponttulajdonság-funkciók | StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Lehetővé teszi csúcsponttulajdonságok létrehozását, módosítását és törlését. |
Élfunkciók | AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty | Lehetővé teszi élek létrehozását, módosítását és törlését. |
Éltulajdonság-funkciók | Tulajdonságok, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Lehetővé teszi éltulajdonságok létrehozását, módosítását és törlését. |
Gremlin-drótformátum
Az Azure Cosmos DB JSON formátumot használ a Gremlin-műveletek eredményeinek visszaadásakor. Az Azure Cosmos DB jelenleg támogatja a JSON formátumot. Az alábbi kódrészlet például egy, az Azure Cosmos DB-ből az ügyfélnek visszaadott csúcspont JSON-ábrázolását mutatja be:
{
"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
}
]
}
}
A csúcspontok JSON-formátuma által használt tulajdonságokat az alábbiakban ismertetjük:
Tulajdonság | Leírás |
---|---|
id |
A csúcspont azonosítója. Egyedinek kell lennie (adott esetben a értékével _partition kombinálva). Ha nincs megadva érték, a rendszer automatikusan meg fogja adni egy GUID azonosítót |
label |
A csúcspont címkéje. Ez a tulajdonság az entitás típusának leírására szolgál. |
type |
A használatával megkülönböztethetők a csúcspontok a nem gráfdokumentumoktól. |
properties |
A csúcsponthoz tartozó, felhasználó által megadott tulajdonságok összessége. Minden tulajdonságnak több értéke is lehet. |
_partition |
A csúcspont partíciókulcsa. Gráfparticionáláshoz használatos. |
outE |
Ez a tulajdonság egy csúcspontból származó szélek listáját tartalmazza. A csúcspontok szomszédsági adatainak tárolása lehetővé teszi a bejárások gyors végrehajtását. Az élek a címkéik alapján vannak csoportosítva. |
Az egyes tulajdonságok több értéket is tárolhatnak egy tömbben.
Tulajdonság | Leírás |
---|---|
value |
A tulajdonság értéke. |
Az él pedig a következő információkat tartalmazza, ezzel segítve a gráf többi részéhez való navigációt.
Tulajdonság | Leírás |
---|---|
id |
Az él azonosítója. Egyedinek kell lennie (adott esetben a értékével _partition együtt) |
label |
Az él címkéje. Ezt a tulajdonságot nem kötelező megadni, és a kapcsolat típusának leírására használható. |
inV |
Ez a tulajdonság egy él csúcspontjainak listáját tartalmazza. Az élek szomszédsági adatainak tárolása lehetővé teszi a bejárások gyors végrehajtását. A csúcspontok a címkéik alapján vannak csoportosítva. |
properties |
Az élhez tartozó, felhasználó által megadott tulajdonságok összessége. |
Gremlin-lépések
Most pedig tekintsük át az Azure Cosmos DB által támogatott Gremlin-lépéseket. A Gremlin teljes körű ismertetését a TinkerPop referenciaanyaga tartalmazza.
lépés | Leírás | TinkerPop 3.2-dokumentáció |
---|---|---|
addE |
Hozzáad egy élt két csúcspont között. | addE lépés |
addV |
Hozzáad egy csúcspontot a gráfhoz. | addV lépés |
and |
Biztosítja, hogy minden bejárás visszaadjon egy értéket. | and lépés |
as |
Egy lépésmodulátor, amely egy változót rendel a lépés kimenetéhez. | as lépés |
by |
A group és az order lépéssel használt lépésmodulátor. |
by lépés |
coalesce |
Visszaadja az első olyan bejárást, amely értéket ad vissza. | coalesce lépés |
constant |
Egy állandó értéket ad vissza. A coalesce lépéssel használható. |
constant lépés |
count |
Visszaadja a darabszámot a bejárásból. | count lépés |
dedup |
Visszaadja az értékeket, eltávolítva az ismétlődéseket. | dedup lépés |
drop |
Elveti az értékeket (csúcspont/él). | drop lépés |
executionProfile |
A végrehajtott Gremlin-lépés által létrehozott összes művelet leírását hozza létre | executionProfile lépés |
fold |
Korlátként funkcionál, amely kiszámítja az eredmények összesítését. | fold lépés |
group |
Csoportosítja az értékeket a megadott címkék alapján. | group lépés |
has |
Tulajdonságok, csúcspontok és élek szűrésére szolgál. A következő változatokat támogatja: hasLabel , hasId , hasNot és has . |
has lépés |
inject |
Értékeket szúr be egy streambe. | inject lépés |
is |
Szűrés végrehajtására használható egy logikai kifejezés használatával. | is lépés |
limit |
A bejárásban található elemek számának korlátozására szolgál. | limit lépés |
local |
Helyileg becsomagolja egy bejárás egy szakaszát, egy segédlekérdezéshez hasonlóan. | local lépés |
not |
Egy szűrő eltávolítására szolgál. | not lépés |
optional |
A megadott bejárás eredményét adja vissza, ha az ad eredményt, ha nem, akkor a hívó elemet adja vissza. | nem kötelező lépés |
or |
Biztosítja, hogy legalább az egyik bejárás visszaadjon egy értéket. | or lépés |
order |
A megadott rendezési sorrendben adja vissza az eredményeket. | order lépés |
path |
Visszaadja a bejárás teljes útvonalát. | path lépés |
project |
Leképezésként jeleníti meg a tulajdonságokat. | project lépés |
properties |
Visszaadja a megadott címkék tulajdonságait. | properties lépés |
range |
A megadott értéktartományra szűr. | range lépés |
repeat |
Megismétli a lépést a megadott számú alkalommal. Ismétlődések beállítására szolgál. | repeat lépés |
sample |
Mintát vesz a bejárás eredményeiből. | sample lépés |
select |
Megjeleníti a bejárás eredményeit. | select lépés |
store |
Nem blokkoló összesítéseket hajt végre a bejárásból. | store lépés |
TextP.startingWith(string) |
Sztringszűrési függvény. Ez a függvény predikátumként használatos a has() lépéshez, hogy megfeleljen egy tulajdonságnak egy adott sztring elejével |
TextP-predikátumok |
TextP.endingWith(string) |
Sztringszűrési függvény. Ez a függvény a lépés predikátumaként has() használatos egy adott sztring végződésű tulajdonsághoz való igazodáshoz |
TextP-predikátumok |
TextP.containing(string) |
Sztringszűrési függvény. Ez a függvény predikátumként használatos a has() lépéshez, hogy megfeleljen egy tulajdonságnak egy adott sztring tartalmával |
TextP-predikátumok |
TextP.notStartingWith(string) |
Sztringszűrési függvény. Ez a függvény predikátumként használatos a has() lépéshez, hogy megfeleljen egy olyan tulajdonságnak, amely nem egy adott sztringgel kezdődik |
TextP-predikátumok |
TextP.notEndingWith(string) |
Sztringszűrési függvény. Ez a függvény a lépés predikátumaként has() használatos egy adott sztringgel nem végződő tulajdonsághoz való igazodáshoz |
TextP-predikátumok |
TextP.notContaining(string) |
Sztringszűrési függvény. Ez a függvény a lépés predikátumaként has() használható egy adott sztringet nem tartalmazó tulajdonsághoz való igazodáshoz |
TextP-predikátumok |
tree |
Egy fában összesíti a csúcspontból induló útvonalakat. | tree lépés |
unfold |
Visszaalakít egy iterátort egy lépésként. | unfold lépés |
union |
Egyesíti több bejárás eredményeit. | union lépés |
V |
A csúcspontok és élek közötti bejárásokhoz szükséges lépéseket foglalja magában: V , E , out , in , both , outE , inE , bothE , outV , inV , bothV és otherV . |
vertex lépések |
where |
A bejárás eredményeinek szűrésére szolgál. A következő operátorokat támogatja: eq , neq , lt , lte , gt , gte , between . |
where lépés |
Az Azure Cosmos DB által biztosított, írásra optimalizált motor alapértelmezés szerint támogatja a csúcspontokon és éleken belüli összes tulajdonság automatikus indexelését. Ezért a szűrővel rendelkező lekérdezéseket, a tartománylekérdezéseket, a rendezéseket és a tulajdonságösszesítések mindegyikét a rendszer közvetlenül az indexből dolgozza fel a hatékony kiszolgálás érdekében. Az indexelésnek az Azure Cosmos DB-ben való működésével kapcsolatban a sémafüggetlen indexelésről szóló tanulmányunkban tekinthet meg további információt.
Viselkedésbeli különbségek
- Az Azure Cosmos DB Graph-motor a szélességi első bejárást futtatja, míg a TinkerPop Gremlin a mélységi első. Ez a viselkedés jobb teljesítményt nyújt a horizontálisan skálázható rendszerekben, például az Azure Cosmos DB-ben.
Nem támogatott szolgáltatások
A Gremlin Bytecode a gráfbejárások programozási nyelvfüggetlen specifikációja. Az Azure Cosmos DB Graph még nem támogatja. Használja a következőt:
GremlinClient.SubmitAsync()
, és adja meg a bejárást szöveges sztringként.property(set, 'xyz', 1)
A set számosság jelenleg nem támogatott. Aproperty(list, 'xyz', 1)
használható helyette. További információ: Csúcstulajdonságok a TinkerPop használatával.A
match()
lépés jelenleg nem érhető el. Ez a lépés deklaratív lekérdezési képességeket biztosít.A csúcspontokon vagy éleken tulajdonságokként használt objektumok nem támogatottak. A tulajdonságok csak egyszerű típusok vagy tömbök lehetnek.
Rendezés tömbtulajdonságok
order().by(<array property>)
szerint nem támogatott. A rendezést csak az egyszerű típusok támogatják.A nem primitív JSON-típusok nem támogatottak. Használjon
string
,number
vagytrue
/false
típusokat.null
értékek nem támogatottak.A GraphSONv3 szerializáló jelenleg nem támogatott. A kapcsolat konfigurációjában használjon
GraphSONv2
Szerializáló, Olvasó és Író osztályt. Az Azure Cosmos DB for Gremlin által visszaadott eredmények formátuma nem egyezik meg a GraphSON-formátummal.A Lambda-kifejezések és -függvények jelenleg nem támogatottak. Ide tartoznak a
.map{<expression>}
, a.by{<expression>}
és a.filter{<expression>}
függvények. További információkért és a Gremlin-lépések használatával történő átírásukról az A Note on Lambdas című témakörben olvashat.A tranzakciók a rendszer elosztott jellege miatt nem támogatottak. Konfigurálja a megfelelő konzisztenciamodellt a Gremlin-fiókon a "saját írások olvasásához", és optimista egyidejűséggel oldja meg az ütköző írásokat.
Ismert korlátozások
- Gremlin-lekérdezések indexkihasználtsága a bejárási
.V()
lépések közepén: Jelenleg csak a bejárás első.V()
hívása használja az indexet a hozzá csatolt szűrők vagy predikátumok feloldásához. A későbbi hívások nem fognak az indexbe betekinteni, ami növelheti a lekérdezés késését és költségeit.
Az alapértelmezett indexelést feltételezve a lépéssel .V()
kezdődő tipikus olvasási Gremlin-lekérdezés paramétereket használna a csatolt szűrési lépésekben, például .has()
a .where()
lekérdezés költségeinek és teljesítményének optimalizálásához. Például:
g.V().has('category', 'A')
Ha azonban egynél .V()
több lépés szerepel a Gremlin-lekérdezésben, előfordulhat, hogy a lekérdezés adatainak feloldása nem optimális. Példaként tekintse meg a következő lekérdezést:
g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')
Ez a lekérdezés két csúcspontcsoportot ad vissza a nevű category
tulajdonságuk alapján. Ebben az esetben csak az első hívás g.V().has('category', 'A')
fogja használni az indexet a csúcspontok feloldásához a tulajdonságaik értékei alapján.
Ennek a lekérdezésnek a megkerülő megoldása az és a résztraverzális lépések .map()
union()
használata. Ezt az alábbiakban szemléltetjük:
// 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'))
A lekérdezések teljesítményét a Gremlin executionProfile()
lépéssel tekintheti át.
Következő lépések
- Bevezetés egy gráfalkalmazás létrehozásába az SDK-k használatával
- További információk a gráfok támogatásáról az Azure Cosmos DB-ben