Programiranje

Zakaj bi morali uporabljati bazo podatkov grafov

Jeff Carpenter je tehnični evangelist pri DataStaxu.

V zadnjem času je veliko hrupa glede podatkovnih baz grafov. Medtem ko podatkovne baze grafov, kot so DataStax Enterprise Graph (ki temelji na Titan DB), Neo4 in IBM Graph, obstajajo že nekaj let, nedavne napovedi upravljanih storitev v oblaku, kot sta AWS Neptune in Microsoftov dodatek zmogljivosti grafov v Azure Cosmos DB, kažejo, da grafične baze podatkov so vstopili v mainstream. Kako ob vsem tem zanimanju ugotovite, ali je baza podatkov grafov primerna za vašo aplikacijo?

Kaj je baza podatkov grafov?

Preden gremo naprej, določimo nekaj terminologije. Kaj je baza podatkov grafov? Pomislite na to z vidika podatkovnega modela. Graf podatkovni model je sestavljen iz oglišča ki predstavljajo entitete v domeni in robovi ki predstavljajo razmerja med temi entitetami. Ker imajo lahko tako oglišča kot robovi dodatne imenovane pare ime-vrednost lastnosti, ta podatkovni model je formalno znan kot graf lastnosti. Nekatere podatkovne baze grafov zahtevajo, da določite a shemo za vaš graf - tj. določanje nalepke ali imena za točke, robove in lastnosti pred zapolnitvijo kakršnih koli podatkov - medtem ko druge zbirke podatkov omogočajo delovanje brez fiksne sheme.

Kot ste morda opazili, v podatkovnem modelu grafa ni novih informacij, ki jih ne bi mogli zajeti v tradicionalnem relacijskem podatkovnem modelu. Konec koncev je enostavno opisati razmerja med tabelami s tujimi ključi ali pa opisati lastnosti odnosa s tabelo združevanja. Ključna razlika med temi podatkovnimi modeli je način organizacije in dostopa do njih. Prepoznavanje robov kot "prvovrstnega državljana" skupaj z oglišči v podatkovnem modelu grafa omogoča osnovni mehanizem baze podatkov, da se zelo hitro ponovi v katero koli smer skozi omrežja oglišč in robov, da zadosti poizvedbam aplikacij, postopek znan kot prehod.

Prilagodljivost podatkovnega modela grafov je ključni dejavnik, ki spodbuja nedavni porast priljubljenosti baz podatkov grafov. Iste zahteve glede razpoložljivosti in obsežnega obsega, ki so spodbujale razvoj in sprejemanje različnih ponudb NoSQL v zadnjih desetih letih, še naprej obrodijo sadove v zadnjem trendu grafov.

Kako vedeti, kdaj potrebujete bazo podatkov grafov

Kot pri vsaki priljubljeni tehnologiji lahko tudi pri vsakem problemu uporabimo podatkovne baze grafov. Pomembno je, da se prepričate, da imate primerno uporabo. Na primer, grafi se pogosto uporabljajo za problematične domene, kot so:

  • Socialna omrežja
  • Priporočilo in personalizacija
  • Stranka 360, vključno z ločljivostjo entitete (korelacija uporabniških podatkov iz več virov)
  • Odkrivanje prevar
  • Upravljanje premoženja

Ne glede na to, ali se vaš primer uporabe prilega eni od teh domen ali ne, morate upoštevati še nekaj drugih dejavnikov, ki lahko pomagajo ugotoviti, ali je baza podatkov grafov prava za vas:

  • Odnosi veliko do veliko. Martin Kleppmann v svoji knjigi "Oblikovanje podatkovno intenzivnih aplikacij" (O'Reilly) nakazuje, da so pogosti odnosi med številnimi in številnimi v domeni problemov dober pokazatelj za uporabo grafa, saj se relacijske baze podatkov pogosto trudijo za učinkovito krmarjenje po teh odnosih.
  • Visoka vrednost odnosov. Še ena hevristika, ki sem jo pogosto slišal: če so odnosi med vašimi podatkovnimi elementi enako pomembni ali pomembnejši kot sami elementi, razmislite o uporabi grafa.
  • Nizka zakasnitev v velikem obsegu. Dodajanje druge zbirke podatkov v vašo aplikacijo doda tudi zapletenost vaši aplikaciji. Sposobnost grafičnih baz podatkov hitreje krmariti po odnosih, zastopanih v velikih naborih podatkov, kot druge vrste baz podatkov upravičuje to dodatno zapletenost. To še posebej velja v primerih, ko kompleksna relacijska poizvedba o združevanju ne deluje več in ni dodatnih zaslužkov za optimizacijo poizvedbe ali relacijske strukture.

Določanje sheme grafov in poizvedb z Gremlinom

Oglejmo si, kako začeti uporabljati bazo grafov na resničnem primeru, sistemu priporočil, ki smo ga nedavno dodali v KillrVideo. KillrVideo je referenčna aplikacija za skupno rabo in gledanje videoposnetkov, ki smo jo razvili razvijalcem, da se naučijo uporabljati DataStax Enterprise, vključno z DataStax Enterprise Graph, bazo podatkov grafov, zgrajeno na vrhu zelo razširljivih podatkovnih tehnologij, vključno z Apache Cassandra in Apache Spark.

Jezik, ki se uporablja za opisovanje in interakcijo z grafi v programu DataStax Enterprise Graph, je Gremlin, ki je del projekta Apache TinkerPop. Gremlin je zaradi prilagodljivosti, razširljivosti in podpore tako za deklarativne kot nujne poizvedbe znan kot jezik za opisovanje prehodov grafov. Gremlin temelji na jeziku Groovy, gonilniki pa so na voljo v več jezikih. Najpomembneje pa je, da Gremlin podpirajo najbolj priljubljene podatkovne zbirke grafov, vključno z DataStax Enterprise Graph, Neo4j, AWS Neptune in Azure Cosmos DB.

Oblikovali smo algoritem priporočil za identifikacijo podatkov, ki bi jih potrebovali kot vhodne podatke. Pristop je bil ustvariti priporočila za določenega uporabnika na podlagi videoposnetkov, ki so bili všeč podobnim uporabnikom. Naš cilj je bil ustvariti priporočila v realnem času, ko uporabniki komunicirajo z aplikacijo KillrVideo, torej kot interakcija OLTP.

Za opredelitev sheme smo identificirali podmnožico podatkov, ki jih upravlja KillrVideo, ki smo jih potrebovali za naš graf. To je vključevalo uporabnike, videoposnetke, ocene in oznake ter lastnosti teh elementov, na katere se lahko sklicamo v algoritmu ali predstavimo v rezultatih priporočil. Nato smo v Gremlinu ustvarili shemo grafov, ki je izgledala takole:

// ustvarimo oznake oglišč

schema.vertexLabel (“uporabnik”). partitionKey (‘userId’).

lastnosti (“userId”, “email”, “added_date”). ifNotExists (). create ();

schema.vertexLabel (“video”). partitionKey (‘videoId’).

lastnosti (“videoId”, “name”, “description”, “added_date”,

predogled_slike_lokacije "). ifNotExists (). create ();

schema.vertexLabel ("tag"). partitionKey ("ime").

lastnosti (“ime”, “tagged_date”). ifNotExists (). create ();

// ustvarimo robne nalepke

schema.edgeLabel ("ocenjeno"). multiple (). lastnosti ("ocena").

povezava (“uporabnik”, “video”). ifNotExists (). create ();

schema.edgeLabel (“naloženo”). single (). lastnosti (“added_date”).

povezava (“uporabnik”, “video”). ifNotExists (). create ();

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

povezava (“video”, “tag”). ifNotExists (). create ();

Odločili smo se za modeliranje uporabnikov, videoposnetkov in oznak kot točk in z robovi ugotovili, kateri uporabniki so naložili katere videoposnetke, uporabniške ocene videoposnetkov in oznake, povezane z vsakim videoposnetkom. Točkam in robovom smo dodelili lastnosti, na katere se sklicujejo poizvedbe ali so vključeni v rezultate. Nastala shema je videti tako v DataStax Studio, orodju za razvijanje v obliki prenosnika za razvijanje in izvajanje poizvedb v CQL in Gremlin.

Na podlagi te sheme smo definirali poizvedbe, ki podatke vnesejo v graf, in poizvedbe, ki pridobivajo podatke iz grafa. Oglejmo si graf poizvedbo, ki ustvarja priporočila. Tu je osnovni potek: Za določenega uporabnika določite podobne uporabnike, ki jim je bil všeč videoposnetek, ki jih je imel določen uporabnik, izberite videoposnetke, ki so jim bili všeč tudi podobni uporabniki, izključite videoposnetke, ki jih je že gledal, naročite te videoposnetke po priljubljenosti in podajte rezultate.

def numRatingsToSample = 1000

def localUserRatingsToSample = 10

def minPositiveRating = 4

def userID = ...

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

// pridobite vse videoposnetke, ki si jih je uporabnik ogledal, in jih shranite

.map (out (‘rated’). dedup (). fold ()). as (“^ gledanoVideos”)

// vrnitev na trenutnega uporabnika

.select (“^ currentUser”)

// prepoznamo videoposnetke, ki jih je uporabnik visoko ocenil

.outE („ocenjeno“). ima („ocena“, gte (minPositiveRating)). inV ()

// kateri drugi uporabniki so te videoposnetke visoko ocenili?

.inE ("ocenjeno"). ima ("ocena", gte (minPositiveRating))

// omejimo število rezultatov, tako da bo to delovalo kot poizvedba OLTP

.sample (numRatingsToSample)

// razvrsti po oceni tako, da daje prednost uporabnikom, ki so te videoposnetke ocenili z najvišjo oceno

.by (‘ocena’). outV ()

// odpravi trenutnega uporabnika

.kod (neq (“^ currentUser”))

Za trenutek se ustavimo, da pridemo do sape. Doslej smo v tej poti našli podobne uporabnike. Drugi del obhoda zajema podobne uporabnike, zajame omejeno število videoposnetkov, ki so bili všeč podobnim uporabnikom, odstrani videoposnetke, ki jih je uporabnik že gledal, in ustvari nabor rezultatov, razvrščen po priljubljenosti.

  // izberemo omejeno število visoko ocenjenih videoposnetkov pri vsakem podobnem uporabniku

.local (outE (‘rated’). has (‘rating’, gte (minPositiveRating)). limit (localUserRatingsToSample)). sack (assign) .by (‘rating’). inV ()

// izključimo videoposnetke, ki jih je uporabnik že gledal

.not (kjer (znotraj (“^ gledalVideo posnetki”)))

// prepoznamo najbolj priljubljene videoposnetke glede na vsoto vseh ocen

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

// zdaj, ko imamo velik zemljevid [video: score], ga naročite

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

// predvajamo priporočene videoposnetke, vključno z uporabnikom, ki je naložil vsak videoposnetek

.project (‘video’, ‘user’)

.by ()

.by (__. v (‘naloženo’))

Čeprav je ta prehod zapleten, ne pozabite, da gre za celotno poslovno logiko algoritma priporočila. Tu ne bomo podrobno posegali po vsakem koraku tega prehoda, vendar je jezikovna referenca odličen vir in na voljo so visokokakovostni tečaji usposabljanja.

Priporočam interaktivno razvijanje prečkanja prek reprezentativnega nabora podatkov z uporabo orodja, kot je DataStax Studio ali konzola Gremlin iz Apache TinkerPop. To vam omogoča hitro ponavljanje in izboljšanje prečkanja. DataStax Studio je spletno okolje, ki ponuja več načinov za vizualizacijo rezultatov prečkanja kot omrežij vozlišč in robov, kot je prikazano na spodnji sliki. Drugi podprti pogledi vključujejo tabele, grafikone in grafe ter sledenje zmogljivosti.

DataStax

Vključitev baze podatkov grafov v svojo arhitekturo

Ko oblikujete shemo grafov in poizvedbe, je čas, da graf vključite v svojo aplikacijo. Evo, kako smo integrirali DataStax Enterprise Graph v KillrVideo. Večstopenjska arhitektura KillrVideo je sestavljena iz spletne aplikacije, ki je nameščena na vrhu mikroservisov za upravljanje uporabnikov, videoposnetkov (vključno z oznakami) in ocen. Te storitve uporabljajo podatkovno bazo DataStax Enterprise Graph (zgrajeno na Apache Cassandri) za shranjevanje podatkov in dostop do podatkov s pomočjo CQL.

Naš mehanizem priporočil smo uvedli kot del storitve predlaganih videoposnetkov, kot je prikazano spodaj. Ta storitev ustvari seznam priporočil z ID-jem uporabnika. Za izvajanje mehanizma priporočil smo zgoraj opisano prečkanje Gremlin prevedli v kodo Java.

DataStax

Ta arhitektura izpostavlja pogost izziv v arhitekturah mikro storitev - potrebo po interakciji s podatki v lasti več storitev. Kot je prikazano zgoraj, graf, uporabljen za ustvarjanje priporočil, temelji na podatkih iz storitev za upravljanje uporabnikov, video katalog in ocene.

Lastništvo podatkov o obstoječih storitvah smo ohranili z uporabo sinhronih sporočil. Storitve za upravljanje uporabnikov, video katalog in ocene objavljajo dogodke o spremembah podatkov. Predlagana storitev za videoposnetke se naroči na te dogodke in grafično posodobi. Kompromisi, ki smo jih tukaj naredili, so značilni za aplikacije, ki uporabljajo pristop z več modeli, temo, ki sem jo raziskal v prejšnjem članku.

Izvajanje prehodov Gremlin v Javi

DataStax Java Driver ponuja prijazen, tekoč API za izvajanje Gremlinovih prehodov z DataStax Enterprise Graph. Zaradi API-ja je bilo poizvedbe za selitev poizvedb, ki temeljijo na Groovyju, ki smo jih ustvarili v DataStax Studio, v kodo Java.

Nato smo lahko našo kodo Java naredili še bolj berljivo in vzdrževalno z uporabo funkcije Gremlin, znane kot DSL, jeziki, specifični za domeno. DSL je razširitev Gremlina v določeno domeno. Za KillrVideo smo ustvarili DSL, da razširimo izvedbo prečkanja Gremlin s pogoji, ki ustrezajo video domeni. The KillrVideoTraversalDsl razred definira poizvedbene operacije, kot je user (), ki najde točko v grafu z navedenim UUID in priporočiteByUserRating (), ki generira priporočila za zagotovljenega uporabnika na podlagi parametrov, kot sta minimalna ocena in zahtevano število priporočil.

Uporaba DSL-a je poenostavila izvajanje storitve predlaganih videoposnetkov na nekaj podobnega spodnjemu vzorcu, ki ustvari datoteko GraphStatement ki jih nato izvedemo z gonilnikom Java DataStax:

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

.recommendByUserRating (100, 4, 500, 10)

);

Uporaba DSL-a nam je omogočila, da smo v funkcijah za večkratno uporabo skrili nekaj zahtevnosti interakcij z grafi, ki jih lahko nato po potrebi kombiniramo za oblikovanje bolj zapletenih prehodov. To nam bo omogočilo izvajanje dodatnih mehanizmov priporočil, ki se začnejo iz izbrane uporabniške točke, ki jo ponuja uporabnik () metoda in omogoča aplikaciji zamenjavo med različnimi izvedbami.

Primer delujočega grafa

Rezultate naše integracije DataStax Enterprise Graph v KillrVideo si lahko ogledate v spodnjem razdelku »Priporočeno za vas« v spletni aplikaciji. Preizkusite sami na //www.killrvideo.com, tako da ustvarite račun in ocenite nekaj videoposnetkov.

DataStax

Upam, da vam ta članek ponuja nekaj odličnih idej o tem, kako je baza podatkov grafov smiselna za vašo aplikacijo in kako začeti uporabljati Gremlin in DataStax Enterprise Graph.

Jeff Carpenter je tehnični evangelist pri DataStaxu, kjer izkorišča svoje znanje v sistemski arhitekturi, mikro storitvah in Apache Cassandri, da pomaga razvijalcem in operacijskim inženirjem zgraditi porazdeljene sisteme, ki so razširljivi, zanesljivi in ​​varni. Jeff je avtor knjige Cassandra: The Definitive Guide, 2. izdaja.

Forum New Tech ponuja prizorišče za raziskovanje in razpravo o nastajajoči podjetniški tehnologiji v globini in širini brez primere. Izbor je subjektiven in temelji na našem izboru tehnologij, za katere menimo, da so pomembne in najbolj zanimajo bralce. ne sprejema tržnih zavarovanj za objavo in si pridržuje pravico do urejanja celotne prispevane vsebine. Vsa vprašanja pošljite na[email protected].

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