Programovanie

Prečo by ste mali používať databázu grafov

Jeff Carpenter je technickým evanjelistom v DataStax.

O databázach grafov sa v poslednej dobe veľa diskutuje. Zatiaľ čo databázy grafov, ako sú DataStax Enterprise Graph (založené na Titan DB), Neo4 a IBM Graph, existujú už niekoľko rokov, nedávne oznámenia spravovaných cloudových služieb ako AWS Neptune a pridanie možnosti grafu spoločnosťou Microsoft do služby Azure Cosmos DB naznačujú, že databázy grafov vstúpili do hlavného prúdu. Ako so všetkým týmto záujmom zistíte, či je databáza grafov vhodná pre vašu aplikáciu?

Čo je to databáza grafov?

Než pôjdeme ďalej, definujme si terminológiu. Čo je to databáza grafov? Popremýšľajte o tom z hľadiska dátového modelu. Dátový model grafu pozostáva z vrcholy ktoré zastupujú entity v doméne a hrany ktoré predstavujú vzťahy medzi týmito entitami. Pretože vrcholy aj hrany môžu mať nazývané ďalšie páry názvu a hodnoty vlastnosti, tento dátový model je formálne známy ako a graf vlastností. Niektoré databázy grafov vyžadujú, aby ste definovali a schéma pre váš graf - t.j. definujúci štítky alebo názvy vašich vrcholov, hrán a vlastností pred vyplnením akýchkoľvek údajov - zatiaľ čo iné databázy vám umožňujú pracovať bez pevnej schémy.

Ako ste si mohli všimnúť, v dátovom modeli grafu nie sú žiadne nové informácie, ktoré by sme nedokázali zachytiť v tradičnom relačnom dátovom modeli. Koniec koncov, je ľahké opísať vzťahy medzi tabuľkami pomocou cudzích kľúčov, alebo môžeme opísať vlastnosti vzťahu pomocou tabuľky spojenia. Kľúčovým rozdielom medzi týmito dátovými modelmi je spôsob organizácie a prístupu k údajom. Rozpoznanie hrán ako „občana prvej triedy“ popri vrcholoch v dátovom modeli grafu umožňuje základnému databázovému stroju veľmi rýchlo iterovať ľubovoľným smerom sieťami vrcholov a hrán, aby uspokojili aplikačné dotazy, proces známy ako traverz.

Flexibilita dátového modelu grafu je kľúčovým faktorom, ktorý riadi nedávny nárast popularity databázy grafov. Rovnaké požiadavky na dostupnosť a obrovský rozsah, ktoré viedli k vývoju a prijatiu rôznych ponúk NoSQL za posledných zhruba 10 rokov, naďalej prinášajú ovocie v nedávnom trende grafov.

Ako zistiť, kedy potrebujete databázu grafov

Avšak ako u každej populárnej technológie, aj tu môže existovať tendencia aplikovať databázy grafov na každý problém. Je dôležité ubezpečiť sa, že máte vhodný prípad použitia. Napríklad grafy sa často používajú na problémové domény, ako napríklad:

  • Sociálne siete
  • Odporúčanie a personalizácia
  • Zákazník 360 vrátane riešenia entít (korelácia údajov používateľov z viacerých zdrojov)
  • Odhaľovanie podvodov
  • Správa majetku

Či už sa váš prípad použitia hodí do niektorej z týchto domén alebo nie, je potrebné zvážiť niekoľko ďalších faktorov, ktoré vám môžu pomôcť určiť, či je databáza grafov pre vás to pravé:

  • Vzťahy medzi mnohými. Martin Kleppmann vo svojej knihe „Designing Data Intensive Applications“ (O’Reilly) naznačuje, že časté vzťahy medzi mnohými vo vašej problémovej doméne sú dobrým indikátorom využitia grafov, pretože relačné databázy majú tendenciu sa v týchto vzťahoch efektívne orientovať.
  • Vysoká hodnota vzťahov. Ďalšia heuristika, ktorú som často počul: ak sú vzťahy medzi vašimi údajovými prvkami rovnako dôležité alebo dôležitejšie ako samotné prvky, mali by ste zvážiť použitie grafu.
  • Nízka latencia vo veľkom meradle. Pridanie ďalšej databázy do vašej aplikácie tiež zvyšuje jej zložitosť. Táto ďalšia zložitosť odôvodňuje schopnosť databáz grafov prechádzať vzťahmi zastúpenými vo veľkých množinách údajov rýchlejšie ako iné typy databáz. Platí to najmä v prípadoch, keď komplexný vzťahový dotaz na spojenie už nefunguje a v dotaze alebo v relačnej štruktúre nie je možné vykonať žiadne ďalšie optimalizačné zisky.

Definovanie schémy grafu a dotazov pomocou Gremlina

Pozrime sa, ako začať používať databázu grafov na skutočnom príklade, systéme odporúčaní, ktorý sme nedávno pridali do KillrVideo. KillrVideo je referenčná aplikácia na zdieľanie a sledovanie videí, ktorú sme vytvorili, aby sme vývojárom pomohli naučiť sa používať DataStax Enterprise, vrátane DataStax Enterprise Graph, databázy grafov postavenej na vysoko škálovateľných dátových technológiách vrátane Apache Cassandra a Apache Spark.

Jazyk používaný na popis a interakciu s grafmi v DataStax Enterprise Graph je Gremlin, ktorý je súčasťou projektu Apache TinkerPop. Gremlin je známy ako jazyk go-to pre opis prechodov grafov vďaka svojej flexibilite, rozšíriteľnosti a podpore deklaratívnych aj imperatívnych dotazov. Gremlin je založený na jazyku Groovy a ovládače sú k dispozícii vo viacerých jazykoch. Najdôležitejšie je, že Gremlin je podporovaný najpopulárnejšími databázami grafov vrátane DataStax Enterprise Graph, Neo4j, AWS Neptune a Azure Cosmos DB.

Navrhli sme odporúčací algoritmus na identifikáciu údajov, ktoré by sme potrebovali ako vstup. Prístup spočíval v generovaní odporúčaní pre daného používateľa na základe videí, ktoré sa podobným používateľom páčili. Naším cieľom bolo generovať odporúčania v reálnom čase, keď používatelia interagujú s aplikáciou KillrVideo, teda ako interakcia OLTP.

Na definovanie schémy sme identifikovali podmnožinu údajov spravovaných programom KillrVideo, ktoré sme potrebovali pre náš graf. Týkalo sa to používateľov, videí, hodnotení a značiek, ako aj vlastností týchto položiek, na ktoré by sme mohli v algoritme odkazovať alebo ktoré by sa mohli zobraziť vo výsledkoch odporúčaní. Potom sme v Gremline vytvorili schému grafu, ktorá vyzerala takto:

// vytvorenie vrcholových štítkov

schema.vertexLabel („užívateľ“). partitionKey („userId“).

vlastnosti („userId“, „email“, „added_date“). ifNotExists (). create ();

schema.vertexLabel („video“). partitionKey („videoId“).

vlastnosti („videoId“, „meno“, „popis“, „pridané_dátum“,

preview_image_location ”). ifNotExists (). create ();

schema.vertexLabel („značka“). partitionKey („meno“).

vlastnosti („name“, „tagged_date“). ifNotExists (). create ();

// vytvorenie okrajových štítkov

schema.edgeLabel („hodnotené“). multiple (). properties („hodnotenie“).

pripojenie („používateľ“, „video“). ifNotExists (). create ();

schema.edgeLabel („uploaded“). single (). properties („added_date“).

pripojenie („používateľ“, „video“). ifNotExists (). create ();

schema.edgeLabel („taggedWith“). single ().

pripojenie („video“, „značka“). ifNotExists (). create ();

Rozhodli sme sa modelovať používateľov, videá a značky ako vrcholy a pomocou okrajov sme určili, ktorí používatelia nahrali ktoré videá, hodnotenie videí používateľov a značky spojené s každým videom. Priradili sme vlastnosti vrcholom a okrajom, na ktoré sa odkazuje v dotazoch alebo ktoré sú zahrnuté vo výsledkoch. Výsledná schéma vyzerá takto v DataStax Studio, vývojárskom nástroji v štýle poznámkového bloku na vývoj a vykonávanie dotazov v CQL a Gremlin.

Na základe tejto schémy sme definovali dotazy, ktoré vyplňujú údaje do grafu, a dotazy, ktoré načítavajú údaje z grafu. Pozrime sa na dopyt v grafe, ktorý generuje odporúčania. Tu je základný postup: Pre daného používateľa identifikujte podobných používateľov, ktorým sa páčili videá, ktoré sa danému používateľovi páčili, vyberte videá, ktoré sa podobným používateľom tiež páčili, vylúčte videá, ktoré daný používateľ už sledoval, zoradte ich podľa obľúbenosti a poskytnite výsledky.

def numRatingsToSample = 1 000

def localUserRatingsToSample = 10

def minPositiveRating = 4

def userID = ...

g.V (). has („user“, „userId“, userID) .as („^ currentUser“)

// získa všetky videá, ktoré používateľ sledoval, a uloží ich

.map (out (‘hodnocené’). dedup (). fold ()). ako („^ sledovanéVideá“)

// návrat k aktuálnemu používateľovi

.select („^ currentUser“)

// identifikácia videí, ktoré používateľ vysoko hodnotil

.outE („hodnotené“). má („hodnotenie“, gte (minPositiveRating)). inV ()

// čo iní používatelia hodnotili tieto videá vysoko?

.inE („hodnotené“). má („hodnotenie“, gte (minPositiveRating))

// obmedziť počet výsledkov, aby to fungovalo ako dotaz OLTP

.sample (numRatingsToSample)

// zoradenie podľa hodnotenia zvýhodní používateľov, ktorí dané videá ohodnotili najvyššie

.by („hodnotenie“). outV ()

// vylúčiť aktuálneho používateľa

.where (neq („^ currentUser“))

Na chvíľu sa pozastavíme, aby sme vyrazili dych. Zatiaľ sme v tomto prechode identifikovali podobných používateľov. Druhá časť prehľadávania vezme týchto podobných používateľov, zachytí obmedzený počet videí, ktoré sa podobným používateľom páčili, odstráni videá, ktoré si už používateľ pozrel, a vygeneruje množinu výsledkov zoradených podľa obľúbenosti.

  // vyberte obmedzený počet vysoko hodnotených videí od každého podobného používateľa

.local (outE („hodnotené“). has („hodnotenie“, gte (minPositiveRating)). limit (localUserRatingsToSample)). vrece (priradiť) .by („hodnotenie“). inV ()

// vylúčiť videá, ktoré si používateľ už pozrel

.not (kde (v rámci („^ sledovaných videí“))))

// identifikácia najpopulárnejších videí podľa súčtu všetkých hodnotení

.group (). by (). by (sack (). sum ())

// teraz, keď máme veľkú mapu [videa: skóre], si ju objednajte

.order (local) .by (values, decr) .limit (local, 100). select (keys) .unfold ()

// výstup odporúčaných videí vrátane používateľa, ktorý každé video nahral

.project („video“, „user“)

.by ()

.by (__. in („uploaded“))

Aj keď tento prechod vyzerá komplikovane, nezabudnite, že je to celá obchodná logika odporúčacieho algoritmu. Nebudeme sa tu podrobne venovať každému kroku tohto prechodu, ale jazyková referencia je skvelým zdrojom a sú k dispozícii vysoko kvalitné školiace kurzy.

Odporúčam interaktívne vyvíjať priechody cez reprezentatívnu množinu údajov pomocou nástroja ako DataStax Studio alebo konzoly Gremlin od Apache TinkerPop. Takto môžete rýchlo iterovať a spresniť svoje prechádzanie. DataStax Studio je webové prostredie, ktoré poskytuje niekoľko spôsobov vizualizácie výsledkov prechodu ako sietí uzlov a hrán, ako je znázornené na obrázku nižšie. Medzi ďalšie podporované zobrazenia patria tabuľky, grafy a grafy, ako aj sledovanie výkonu.

DataStax

Začlenenie databázy grafov do vašej architektúry

Po vytvorení schémy grafu a dotazov je čas integrovať graf do svojej aplikácie. Takto sme integrovali DataStax Enterprise Graph do KillrVideo. Viacvrstvová architektúra KillrVideo pozostáva z webovej aplikácie, ktorá je umiestnená na vrchole sady mikroslužieb, ktoré spravujú používateľov, videá (vrátane značiek) a hodnotenie. Tieto služby využívajú databázu DataStax Enterprise Graph (postavenú na Apache Cassandra) na ukladanie údajov a prístup k nim pomocou CQL.

Náš modul odporúčaní sme implementovali ako súčasť služby Navrhované videá, ako je uvedené nižšie. Táto služba generuje zoznam odporúčaní s daným ID používateľa. Aby sme implementovali odporúčací modul, preložili sme Gremlinov prechod popísaný vyššie do kódu Java.

DataStax

Táto architektúra zdôrazňuje častú výzvu v architektúrach mikroslužieb - potrebu interakcie s údajmi vlastnenými viacerými službami. Ako je uvedené vyššie, graf použitý na generovanie odporúčaní sa spolieha na údaje zo služieb Správa používateľov, Video katalóg a Hodnotenia.

Zachovali sme vlastníctvo údajov našich existujúcich služieb pomocou asynchrónneho zasielania správ. Služby Správa používateľov, Video katalóg a Hodnotenia zverejňujú udalosti týkajúce sa zmien údajov. Služba Navrhované videá sa prihlasuje na odber týchto udalostí a vykonáva príslušné aktualizácie grafu. Tieto kompromisy, ktoré sme tu vykonali, sú typické pre aplikácie, ktoré používajú prístup založený na viacerých modeloch, tému, ktorú som skúmal v predchádzajúcom článku.

Implementácia Gremlinových prechodov v Jave

Ovládač Java DataStax poskytuje priateľské a plynulé rozhranie API na implementáciu prechodov Gremlin pomocou DataStax Enterprise Graph. Vďaka API bolo triviálne migrovať dotazy založené na Groovy, ktoré sme vytvorili v DataStax Studio, do kódu Java.

Potom sme boli schopní urobiť náš kód Java ešte čitateľnejším a udržiavateľnejším pomocou funkcie Gremlin známej ako DSL, jazyky špecifické pre doménu. DSL je rozšírenie spoločnosti Gremlin do konkrétnej domény. Pre KillrVideo sme vytvorili DSL, aby sme rozšírili implementáciu Gremlin Traversal o pojmy, ktoré sú relevantné pre doménu videa. The KillrVideoTraversalDsl trieda definuje operácie dotazu ako napríklad user (), ktorý vyhľadá vrchol v grafe s poskytnutým UUID, a recommendByUserRating (), ktorá generuje odporúčania pre poskytovaného používateľa na základe parametrov, ako sú minimálne hodnotenie a požadovaný počet odporúčaní.

Používanie DSL zjednodušilo implementáciu služby Navrhované videá na niečo ako ukážka uvedená nižšie, čím sa vytvorí a GraphStatement ktoré potom vykonáme pomocou ovládača Java DataStax Java:

GraphStatement gStatement = DseGraph.statementFromTraversal (killr.users (userIdString)

.recommendByUserRating (100, 4, 500, 10)

);

Použitie DSL nám umožnilo skryť časť zložitosti našich interakcií grafov v opakovane použiteľných funkciách, ktoré je potom možné podľa potreby kombinovať a vytvárať tak zložitejšie priechody. To nám umožní implementovať ďalšie nástroje odporúčaní, ktoré vychádzajú z vrcholu vybraného používateľa poskytnutého serverom používateľ () a umožniť aplikácii prepínať medzi rôznymi implementáciami.

Príklad fungujúceho grafu

Výsledky našej integrácie DataStax Enterprise Graph do KillrVideo si môžete pozrieť v sekcii „Odporúčané pre vás“ webovej aplikácie, ktorá je uvedená nižšie. Vyskúšajte to sami na //www.killrvideo.com vytvorením účtu a hodnotením niekoľkých videí.

DataStax

Dúfam, že vám tento článok poskytne niekoľko skvelých nápadov, ako môže mať databáza grafov zmysel pre vašu aplikáciu a ako začať s programami Gremlin a DataStax Enterprise Graph.

Jeff Carpenter je technickým evanjelistom v spoločnosti DataStax, kde využíva svoje zázemie v systémovej architektúre, mikroslužbách a Apache Cassandra, aby pomohol vývojárom a prevádzkovým inžinierom postaviť distribuované systémy, ktoré sú škálovateľné, spoľahlivé a bezpečné. Jeff je autorom knihy Cassandra: The Definitive Guide, 2. vydanie.

Nové technologické fórum poskytuje miesto na preskúmanie a diskusiu o vznikajúcich podnikových technológiách v nebývalej hĺbke a šírke. Výber je subjektívny, založený na našom výbere technológií, ktoré považujeme za dôležité a pre čitateľov najväčší záujem. neprijíma marketingové záruky na zverejnenie a vyhradzuje si právo upravovať všetok prispievaný obsah. Všetky otázky posielajte na adresu[email protected].

$config[zx-auto] not found$config[zx-overlay] not found