Graafitietokannat: Tehokkuutta monimutkaisen tiedon mallintamiseen
Useissa organisaatioissa on esiintynyt tarpeita sellaisen tiedon varastointiin, joka ei aina vastaa tunnetuimpien tietokantaratkaisuiden tarjoamia mahdollisuuksia. Usein ohjelmistokehityksessä on tapana toteuttaa graafiratkaisuja suoraan jollakin ohjelmointikielellä ilman graafitietokantaa. Varsinaisten graafitietokantojen tarjoamat mahdollisuudet ja teoreettinen tausta kannattaa kuitenkin ottaa huomioon jo ohjelmistoprojektien suunnitteluvaiheessa.
Graafitietokanta on tietokantatyyppi, jossa tiedot tallennetaan solmuina ja niiden välisinä yhteyksinä (relaatioina). Tämä tekee graafitietokannoista erityisen tehokkaita tilanteissa, joissa tietojen väliset suhteet ovat monimutkaisia tai niitä tarvitaan analysoitaviksi, kuten sosiaalisissa verkostoissa tai toimitusketjuissa. Graafitietokannat mahdollistavat joustavan tavan mallintaa ja hakea dataa sekä sen yhteyksiä, mikä tuo uusia mahdollisuuksia moniin eri sovellusalueisiin verrattuna perinteisiin taulukoihin perustuviin tietokantoihin.
– Graph Databases, O’Reilly
Tietokantojen kehitys on ollut alati jatkuva prosessi ja tuonut runsaasti muutoksia sitten 1960-luvun taulukoihin perustuvien relaatiokantojen. Tietokantojen kehitykseen ovat vaikuttaneet sekä ohjelmistotuotannon prosessien että toimintakentän muutokset. Taustalla on kuitenkin aina vaikuttanut sekä laitteiston kehitys (muisti, suorituskyky) että käsiteltävän datan määrä. Käytännön vaatimusten kautta graafitietokannat ovat täydentäneet 2000-luvun alun NoSQL-tietokantojen kuvaustapojen puutteita. Etenkin dokumenttivarastoinen NoSQL tarjosi kevyen dokumenttimallin tehdä tietokantarakenteeseen liittyviä muutoksia ja samalla mahdollisti mallin joustavuuden.
NoSQL ja graafitietokannat jakavat kehittyneistä ominaisuuksista sekä datan itsensä kuvauksen muokattavuuden helppouden että eri datojen välisten yhteyksien kuvaamisen joustavuuden. Graafitietokantaratkaisut vievät tämän joustavuuden askelen pidemmälle, sillä niissä mukaan tulee lisäksi myös mahdollisuus määritellä tietoa solmujen välisiin yhteyksiin liittyen.
Graafitietokannan käyttökohteita
Graafitietokantoja voidaan käyttää lukemattomissa erilaisissa verkostollisen toiminnan analysointiin ja luomiseen tarvittavissa toimenpiteissä. Graafitietokantoja voidaan käyttää esim. verkostoanalyyseissä, turvallisuusuhkien kartoituksessa, toimitusketjujen optimoinnissa, koneoppimisessa ja pelimaailmojen kuvailuissa. Graafitietokannan hakukieltä ei ole standardoitu, mutta GQL, Cypher, SPARQL ja Gremlin ovat niihin liittyvien tuotteiden tunnetuimpia esimerkkejä.
Alla muutamia hypoteettisia graafitietokantojen käyttöesimerkkejä Cypher-kielelle (neo4j, OpenCypher ym.)
1. Asiakaslojaalisuuden relaation määritykset:
Tässä esimerkissä luodaan asiakashenkilösolmut Liisa, Pekka ja Matti. Liisa ja Pekka yhdistetään osallistumisyhteyden kautta kultatasoiseen lojaalisuusohjelmaan, Matti hopeatasoon.
2. Asiakaslojaalisuuden selvitys:
Tässä esimerkissä haetaan asiakashenkilöiden nimet ja ryhmitellään ne lojaalisuusohjelman nimen mukaan.
3. Toimitusketjun selvitys:
Tässä esimerkissä on määritelty kaksi yhteyttä. Ensimmäisessä toimittaja yhdistetään tuotteen toimitusyhteyden kautta tuotteeseen. Toisessa toimittaja yhdistetään paikkayhteyden kautta maahan. Tuloksena saadaan lista tietyistä laitteista, jotka sijaitsevat Kiinassa.
4. Samojen kiinnostuksenkohteiden haku verkostosta; haetaan Liisan ja Pekan osalta sama kiinnostuksenkohde:
Tässä esimerkissä on määritelty yksi yhteys, johon liitetään kaksi henkilöä. Hakuehdolla rajataan hakutulos Liisaan ja Pekkaan. Tuloksena saadaan kiinnostuksenkohde.
5. Yksityiskohtainen reittianalyysi keskusvarastolta tiettyyn vähittäiskauppaan, mukana arvioidut jakeluajat ja seuraavat jakeluaikataulut:
Tässä esimerkissä on määritelty yhteys varastolta vähittäiskauppaan (alku-loppu). Yhteyteen määritelty ”*” tarkoittaa minkä tahansa pituista reittiä. Haussa käytetään rajaavana ehtona nimeä ”Keskusvarasto” (alku) ja ”Kauppa 123” (loppu).
Haku käyttää välitulosta (solmu) löytämään seuraavaa toimitusta koskevan lisätiedon. Reitin kokonaisaika lasketaan siten, että ainoastaan alle 24 tuntia sisältävät reitit otetaan huomioon. Tuloksena saadaan kokonaisajan mukaan lajiteltu lista jakelureitistä, kokonaisajasta ja sisäkkäinen esitys solmusta sekä seuraavasta toimituksesta.
Lisätietoa Cypher-kielen hakujen muodostuksesta voit lukea TÄÄLTÄ.
Tuetut graafityypit
Graafiteoria on käytännön toteutus matematiikan graafiteoriasta (verkkoteoria). Keskeiset käsitteet ovat solmut (nodes) ja niitä yhdistävät linkit (”kaaret”, vertices). Cypher-kielessä käytetään nuolisyntaksia ”(A)-[:B]->(C)” kuvailemaan relaatiota, jossa B on relaation nimi, A on lähderelaatio ja C kohderelaatio. A ja C määritellään muodossa ”muuttujannimi:Solmunnimi”. Nuolimerkintä ”->” kuvailee relaation suuntaa. Aiemmin kuvailtu ”MATCH” tuottaa siis ainoastaan hakutuloksia, joissa haun relaation suunta/suunnat ja solmujen määritykset täsmäävät.
Tuettuja graafityyppejä voivat olla lähes mitkä tahansa: sykliset, asykliset, ominaisuusgraafit, RDF-graafit, hypergraafit ja multigraafit. Asyklisten graafien yleinen esimerkki on DAG (Directed Acyclic Graph) hyödyntävä paketinhallintajärjestelmä (esim. NuGet, npm, Maven), jossa koko graafin rakenne määrittelee yhden suunnan. Toisessa ääripäässä on hypergraafi, joka voi olla sekä syklinen ja lisäksi sillä voidaan linkittää useita erilaisia solmuja keskenään. Hypergraafeilla voidaan kuvailla esim. maailmankaikkeuden rakennetta tai tehdä aivojen yhteyksien kartta (connectome). Myös relaatiotietokannan rakenne ja sisältö voidaan kuvailla graafina.
Cypher-hauissa voidaan määritellä myös funktioita. Tunnetuimmat näistä ovat keskeisyyksien (centralities) löytäminen, PageRank (Google), yhteisöjen (communities) ja samankaltaisuuksien hakeminen ja lyhyimmän reitin löytäminen. Näiden funktioiden lisäksi on tarjolla myös erilaisia tuotteen omia toimintoja.
Tulevaisuus
Tulevaisuudessa tullaan myös näkemään graafiominaisuuksien yhä parempi integraatio perinteisiin SQL-ratkaisuihin. Ainakin osittaisen graafituen tarjoavat jo seuraavat SQL-ratkaisut: SQL Server, PostgreSQL, Oracle Database ja SAP HANA. On kuitenkin hyvä huomata, että siinä missä perinteisiin SQL-ratkaisuihin voidaan lisätä NoSQL-toimintoja (joustavat mallit, json, osiointi), ei vastaavaa voida tehdä graafitietokannoilla tiedon rakenteen erilaisuuden vuoksi. Perinteisen SQL-ratkaisun päälle tehty graafituki skaalautuukin usein huonosti datamäärän kasvaessa. Jatkossa tullaan näkemään yhteisstandardeja kuten ISO/IEC SQL ja GQL (39075) sekä niitä tukevat yhtenäistetyt tuet (vrt. Oracle PGQL mutta standardi).
Cypher-kielen kaltaiset ratkaisut tarjoavat jo itsessään tehokkaan työkalun hakutoimintoihin. Parhaimmillaan Cypher ja erilaiset graafit toimivat kuitenkin osana mikropalveluarkkitehtuuria, esim. koneoppimisessa. Koneoppimisarkkitehtuurissa Python, TensorFlow ja PyTorch toimivat koneoppimismallin alustana ja mikropalveluissa (Flask, FastAPI) oleva graafidata sen mikropalveluina. Myös koneoppimismalli itsessään voidaan helposti toteuttaa mikropalveluna. Graafi- ja vektoritietokannat tulevat muodostamaan hyvän pohjan tulevaisuuden koneoppimisen tarpeisiin.
Tämän blogikirjoituksen on kirjoittanut asiantuntijamme Olli Silfvast.