Megosztás a következőn keresztül:


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:

Tulajdonság Leírás
id A csúcspont azonosítója. Egyedinek kell lennie (adott esetben az értékével _partition kombinálva). Ha nincs megadva érték, az automatikusan meg lesz adva egy GUID azonosítóval
label A csúcspont címkéje. Ez a tulajdonság az entitástípus 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úcsponton kívüli é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 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. 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ú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, numbervagy true/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 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 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