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 Tinkerpop gráfbejárási nyelvét, a Gremlint. 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éseinek specifikációját, de az Azure Cosmos DB-hez tartozó implementációban vannak különbségek. 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 | Támogatott/Ajánlott összekötő-verzió |
---|---|---|---|
.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 tá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. |
Feljegyzé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 kompatibilitási problémák léptek fel az újabb illesztőprogram-verziók esetében.
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, kettős, lebegőpontos, hosszú, sztring | 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 vezeték formátuma
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:
{
"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:
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 az értékével _partition kombinálva) |
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 generált ö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. | optional 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 predikátumként szolgál a has() lépéshez, hogy megfeleljen egy tulajdonságnak egy adott sztring végének |
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 adott sztringgel nem kezdődő tulajdonságnak |
TextP-predikátumok |
TextP.notEndingWith(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 adott sztringgel nem végződő tulajdonságnak |
TextP-predikátumok |
TextP.notContaining(string) |
Sztringszűrési függvény. Ez a függvény predikátumként szolgál a has() lépéshez egy adott sztringet nem tartalmazó tulajdonság egyeztetéséhez |
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 méretezhető rendszerekben, például az Azure Cosmos DB-ben.
Nem támogatott szolgáltatások
A Gremlin Bytecode egy programnyelvfüggetlen specifikáció gráfbejárásokhoz. 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 számosság beállítása ma 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úcsokon vagy éleken tulajdonságokként használt objektumok nem támogatottak. A tulajdonságok csak egyszerű típusok vagy tömbök lehetnek.
A tömbtulajdonságok
order().by(<array property>)
szerinti rendezés 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. Szerializáló, olvasó és író osztályokat használhat
GraphSONv2
a kapcsolatkonfigurációban. A Gremlinhez készült Azure Cosmos DB által visszaadott eredmények formátuma nem azonos a GraphSON formátummal.A Lambda-kifejezések és -függvények jelenleg nem támogatottak. Ez magában foglalja a
.map{<expression>}
, a.by{<expression>}
, és a.filter{<expression>}
függvényeket. További információkért és a Gremlin-lépések használatával történő újraírásukról a Lambdasról szóló megjegyzésben olvashat.A tranzakciók a rendszer elosztott jellege miatt nem támogatottak. Konfigurálja a megfelelő konzisztenciamodellt a Gremlin-fiókban a "saját írások olvasásához", és optimista egyidejűséggel oldja fel az ütköző írásokat.
Ismert korlátozások
- Indexkihasználtság a Gremlin-lekérdezésekhez a bejárási
.V()
lépések közepén: Jelenleg csak a bejárás első.V()
hívása fogja használni az indexet a hozzá csatolt szűrők vagy predikátumok feloldásához. A későbbi hívások nem fogják megtekinteni az indexet, ami növelheti a lekérdezés késését és költségét.
Az alapértelmezett indexelést feltételezve a lépéssel kezdődő tipikus olvasási .V()
Gremlin-lekérdezés paramétereket használ a csatolt szűrési lépésekben, például .has()
.where()
a lekérdezés költségeinek és teljesítményének optimalizálásához. Példa:
g.V().has('category', 'A')
Ha azonban több .V()
lépés is szerepel a Gremlin-lekérdezésben, előfordulhat, hogy a lekérdezés adatainak felbontá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 az úgynevezett 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 olyan részösszegző lépések használata, mint az .map()
és union()
. Ez az alábbiakban látható:
// 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