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. A property(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ágokorder().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, numbervagy true/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ű categorytulajdonsá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