Teil I

Die fort­schrei­tende Ent­wick­lung in den Berei­chen Big Data, Inter­net of Things, Machine Lear­ning  etc. und der Ein­satz von ent­spre­chen­den Tools in Unter­neh­men sind nicht mehr weg­zu­dis­ku­tie­ren.
Wird unsere Welt in dem Bereich ana­ly­ti­scher Sys­teme – so wie wir sie ken­nen – kom­plett auf den Kopf gestellt? Müs­sen wir zwangs­läu­fig neue Tech­no­lo­gien in die­sen Berei­chen ein­set­zen oder kön­nen die neuen Her­aus­for­de­run­gen mit einem „Tuning“ bestehen­der Sys­teme bewäl­tigt wer­den? Um diese Fra­gen aus Sicht eines Daten­ar­chi­tek­ten zu beant­wor­ten, sol­len die Unter­schiede und Gemein­sam­kei­ten der ‚alten‘ rela­tio­na­len und der ‚neuen‘ NoSQL–Datenbanken näher betrach­tet werden.

Lässt man den Fokus auf den Big Data Bereich, so ist es nicht unbe­dingt nur die Daten­menge als sol­che, die den Unter­neh­men Mehr­wert bringt,  son­dern viel­mehr die genaue, umfas­sende und vor allem schnelle Ana­lyse der Bezie­hun­gen inner­halb der Daten. In den letz­ten Jah­ren haben sich vier unter­schied­li­che Ansätze (Key-Value‑, spal­ten­ori­en­tierte, doku­men­ten­ori­en­tierte und Graph- Daten­ban­ken) in den Berei­chen von NoSQL-DB her­aus­kris­tal­li­siert. Allen voran sind es die Graph- Daten­ban­ken, die es ermög­li­chen, große und dicht ver­netzte Daten effi­zi­ent zu ana­ly­sie­ren. Im Fol­gen­den wird der Unter­schied zwi­schen Neo4J als einem der ver­brei­tets­ten Ver­tre­ter der Graph- Daten­bank­fa­mi­lie und rela­tio­na­len DBMS im ana­ly­ti­schen Bereich eingegangen.

Daten­mo­del­lie­rung

Das Herz­stück jedes ana­ly­ti­schen Sys­tems ist das dar­un­ter­lie­gende Daten­mo­dell. Nur mit Hilfe eines domä­nen­ge­treuen und kon­sis­ten­ten Modells las­sen sich ver­trau­ens­wür­dige Infor­ma­tio­nen und Pro­gno­sen gewin­nen. Die Daten­mo­del­lie­rung ist nichts ande­res als ein Pro­zess der Abs­trak­tion, dabei wer­den erho­bene Busi­ness-Anfor­de­run­gen in tabel­la­ri­sche Spei­che­rungs­struk­tu­ren über­setzt und die Daten in diese Struk­tu­ren bewirt­schaf­tet. Klingt ein­fach, in der Rea­li­tät han­delt es sich um hoch­kom­plexe Vor­gänge inner­halb der rela­tio­na­len Welt:
Zuerst die Erstel­lung eines logi­schen Daten­mo­dells und des­sen abschlie­ßende Über­füh­rung in ein phy­si­sches Daten­mo­dell. Dabei kommt es mehr­fach vor, dass sich das End­ergeb­nis ‚phy­si­sches Daten­mo­dell‘ von dem logi­schen Daten­mo­dell wesent­lich unter­schei­det – erzwun­gen durch die spe­zi­fi­schen Anfor­de­run­gen des jewei­li­gen RDBMS. Der Abs­trak­ti­ons­le­vel zwi­schen den Busi­ness Anfor­de­run­gen und dem phy­si­schen Daten­mo­dell kann dazu füh­ren, dass die Abwei­chun­gen zwi­schen Busi­ness-Anfor­de­run­gen und dem Pro­dukt ‚ana­ly­ti­sches Sys­tem‘ erst sehr spät im Pro­jekt­ver­lauf erkannt wer­den; z.B. wäh­rend des User-Accep­tance-Tests oder sogar erst in der Produktionsphase.

Hier lässt sich auch das wesent­li­che Manko der rela­tio­na­len Daten­bank­mo­delle erken­nen – die man­gelnde Fle­xi­bi­li­tät. Die rela­tio­na­len DBMS sind ursprüng­lich ent­wi­ckelt wor­den zur Ver­wal­tung von For­mu­la­ren und Tabel­len­struk­tu­ren, also von klar struk­tu­rier­ten Daten. In die­sem Bereich sind sie nach wie vor unschlag­bar. Im Manage­ment von Bezie­hun­gen aller­dings – ins­be­son­dere wenn diese ad hoc modi­fi­ziert, hin­zu­ge­fügt oder ent­fernt wer­den sol­len – sind die RDBMS weni­ger effi­zi­ent.
Nach­fol­gend ein stark ver­ein­fach­ter rela­tio­na­ler Daten­mo­dell­aus­schnitt zur Veranschaulichung:

Vergleich der Graphdatenbank Neo4J mit relationalen Datenbanken Bild1
Abbil­dung 1 RDBM – Kunde, seine Ver­träge und abge­deckte Versicherungsgegenstände

Wenn ein poten­zi­el­ler Ver­si­che­rungs­neh­mer online nach neuen Ver­si­che­rungs­pro­duk­ten sucht, ist es oft der Fall, dass ihm wei­tere Ver­si­che­rungs­pro­dukte ange­bo­ten wer­den. Um dies zu ermög­li­chen, sol­len bei­spiel­weise fol­gende Abfra­gen bear­bei­tet wer­den:
„Wel­che Kun­den haben das Ver­si­che­rungs­pro­dukt XY genom­men?“ oder „Wel­che Kun­den, die das Ver­si­che­rungs­pro­dukt XY bereits besit­zen, haben auch neue Ver­träge für das Ver­si­che­rungs­pro­dukt YZ abge­schlos­sen?“
Zur Beant­wor­tung der Fra­gen müs­sen in einem rela­tio­na­len Daten­mo­dell meh­rere Joins zwi­schen den Tabel­len gemacht wer­den. Je kom­ple­xer und umfang­rei­cher das Modell ist, um so zeit­in­ten­si­ver wer­den die Abfra­gen. Die schlechte Abfra­ge­per­for­mance erzwingt in sol­chen Fäl­len das zeit-und kos­ten­in­ten­sive Re-Design des zugrun­de­lie­gen­den Modells und die anschlie­ßende Datenmigration.

Graph-Daten­ban­ken wie Neo4J stel­len die Bezie­hung in das Zen­trum des Modells. Die Erstel­lung eines Modells für Neo4J ist in sei­nen Anfän­gen ana­log zu dem oben beschrie­be­nen für ein RDBMS. Die Ergeb­nisse der Busi­ness-Anfor­de­rungs­ana­ly­se­phase wer­den zuerst mit lo-fi Tech­ni­ken wie z.B. White­board Sket­chers abge­steckt und eine Domä­nen­über­sicht geschaffen.

An die­ser Stelle enden aber auch bereits die Gemeinsamkeiten.

Anstatt die Anfor­de­run­gen starr in Tabel­len­form inkl. zuge­hö­ri­gen Pri­mary-/For­eign Key-Regeln zu pres­sen, rei­chert man diese an:
Objekte wer­den zu Kno­ten,  die Rol­len zu Labels, Attri­bute zu Pro­per­ties und Rela­tio­nen zu Bezie­hun­gen. Näher betrach­tet besteht ein gra­ph­ori­en­tier­tes Daten­mo­dell für eine Neo4J–Datenbank aus einer Reihe von Kno­ten und Kan­ten. Wobei Kno­ten die Objekte und Kan­ten die Bezie­hun­gen zwi­schen den Objek­ten abbil­den. Bezo­gen auf unser obi­ges Bei­spiel könnte das gra­ph­ori­en­tierte Pen­dant zu dem RDBM-Modell wie folgt aussehen:

Vergleich der Graphdatenbank Neo4J mit relationalen Datenbanken Bild2
Abbil­dung 2 Graph­mo­dell Pat­tern – Kunde, seine Ver­träge und abge­deckte Versicherungsgegenstände

In der Pra­xis kommt es oft vor, dass ein Kno­ten unter­schied­li­che Rol­len inner­halb des Graphs ein­neh­men kann – bei­spiels­weise ist eine Per­son Ver­si­che­rungs­neh­mer und Geschä­dig­ter zugleich. Es kommt somit der Bedarf auf, die Kno­ten grup­pie­ren zu kön­nen. Dies ist mit Neo4J seit Ver­sion 2.0 mit Hilfe des Kon­strukts ‚Label‘ für die Kno­ten mög­lich. Ein Kno­ten kann meh­rere Labels besit­zen, die jeweils seine spe­zi­fi­schen Rol­len in dem betrach­ten Domä­nen­be­reich fest­le­gen. Die Struk­tur des Graph­mo­dells wird durch die Bezie­hun­gen (Kan­ten) zwi­schen den Kno­ten defi­niert. Eine Bezie­hungs­kante in Neo4J hat immer eine Rich­tung und einen Namen. Es gibt keine bidi­rek­tio­na­len Bezie­hun­gen, jede Bezie­hungs­kante hat einen Start- und einen End­kno­ten. Kno­ten und Bezie­hungs­kan­ten kön­nen mit Eigen­schaf­ten (Pro­per­ties) ver­se­hen wer­den. Da die Pro­per­ties das Modell mit zusätz­li­chen Meta­da­ten für die Graph- Abfrage-Algo­rith­men erwei­tern, wer­den diese ins­be­son­dere für die Abfra­ge­op­ti­mie­rung her­an­ge­zo­gen. Das End­ergeb­nis ‚Pro­perty-Graph-Modell‘ bil­det somit das logi­sche Domä­nen­mo­dell 1:1 in das phy­si­ka­li­sche, so dass hier die Abs­trak­ti­ons­pro­ble­ma­tik gar nicht auf­taucht, wie wir sie aus der rela­tio­na­len Daten­mo­del­lie­rung ken­nen.
In den Pro­jek­ten ist es daher üblich, zuerst eine User-Story zu erfas­sen und anschlie­ßend zusam­men mit den Domä­nen­ex­per­ten einen Ent­wurf des Domä­nen­mo­dells (Graph Pat­tern) zu erstel­len. Basie­rend auf dem erstell­ten Pat­tern wer­den einige wenige Kno­ten erstellt und mit­ein­an­der ver­bun­den. Danach erfolgt ein Test und die Sicher­stel­lung, dass die in der User-Story beschrie­be­nen Anwen­dungs­fälle in dem Graph-Modell abge­deckt sind.

Daten­ab­fra­gen

Steht das phy­si­ka­li­sche Modell inkl. Daten parat (die Bewirt­schaf­tung der Daten mit Neo4J wird in einem sepa­ra­ten Bei­trag behan­delt), kön­nen die Daten abge­fragt – oder wie man in der Graph –Welt sagt – tra­ver­siert wer­den. Tra­ver­sie­rung bedeu­tet nichts ande­res als das Ver­fol­gen der Bezie­hungs­kan­ten  (auch Pfade genannt), aus­ge­hend von einem Start­kno­ten ohne kom­plexe oder mehr­fach geschach­telte Joins. Die­ser ein­deu­tige Vor­teil einer Graph-Daten­bank gegen­über einem RDBMS resul­tiert dar­aus, dass die Daten direkt mit­ein­an­der ver­knüpft, gespei­chert und abge­fragt wer­den. Die Bezie­hungs­pfade eines Kno­tens wer­den in Neo4J in Form einer Liste direk­ter Ver­weise zu sei­nem Nach­bar­kno­ten abgespeichert.

Dies macht die Bezie­hun­gen in Neo4J zu den ‚first-class citi­zens‘. Die Bezie­hungs­pfade sind dabei nach Typ und Rich­tung struk­tu­riert und kön­nen durch die Pro­per­ties zusätz­li­che beschrei­bende Infor­ma­tio­nen ent­hal­ten. In den Fäl­len, wo eine rela­tio­nale Daten­bank eine Join-Ope­ra­tion erzwingt, nutzt Neo4J die Ver­weis­liste und selek­tiert direkt die ver­bun­de­nen Kno­ten. Jeder Kno­ten agiert somit wie ein ‚loka­ler Index‘, auch index­freie Adja­zenz genannt. Dank die­ser Spei­che­rungs­me­tho­dik eig­net sich Neo4J ins­be­son­dere für die Ver­wal­tung stark ver­netz­ter Daten, z.B. für Rou­ten­be­rech­nun­gen, Online-Ein­käufe und Recommendations.

Ein Vor­teil von Neo4J gegen­über ande­ren Graph-Daten­ban­ken ist die Abfra­ge­spra­che Cypher. Die Abfra­ge­pat­terns in Cypher sind denen eines rela­tio­na­len SQL sehr ähn­lich, so dass hier die Lern­kurve für die Ent­wick­ler mit SQL-Kennt­nis­sen steil ist.
Um die Frage zu beant­wor­ten „Wel­che Kun­den haben die Ver­träge mit dem Pro­dukt „Auto“ abge­schlos­sen?“ müsste man in einer rela­tio­na­len DB-Welt meh­rere Tabel­len mit­ein­an­der joinen. Bezo­gen auf Abbil­dung 1 sähe die Abfrage wie folgt aus:

select knd.kunden_name, vrg.vertrag_id
from kunde knd
inner join kunde_vertrag_rel pvx on knd.kunden_id = pvx.kunden_id
inner join vertrag vrg on vrg.vertrag_id = pvx.vertrag_id
inner join vertrag_versicherungsprodukt_rel vxprodx on vrg.vertrag_id=vrprodx.versicherungsprodukt_id
inner join versicherungsprodukt vprd on vprd.versicherungsprodukt_id = vprodx.versicherungsprodukt_id
where vprd.bezeichnung = 'Auto'

Abfra­gen die­ser Art in gro­ßer Menge und im Sekun­den­takt gestellt (wie in der Online-Geschäfts­welt üblich), brin­gen rela­tio­nale DB an ihre Gren­zen. Eine Graph-Daten­bank wie Neo4J ist in ver­gleich­ba­ren Anwen­dungs­fäl­len mit gro­ßen Daten­men­gen dank der index­freien Adja­zenz deut­lich schneller.

Hier die glei­che Abfrage in Cypher:

match(v:Person)-[:hat]-(Vertrag)-[:deckt]-(VrtgGegenstand) where VrtgGegenstand.Bezeichnung = "Auto"
return v, Vertrag.

Das Ergeb­nis wird direkt visualisiert:

Vergleich der Graphdatenbank Neo4J mit relationalen Datenbanken Bild3
Abbil­dung 3 Visua­li­sie­rung der Cypher Abfrage

Befüllt man Neo4J mit den Kno­ten und Bezie­hun­gen gemäß der Pat­tern (Abbil­dung 2), so sieht das Ergeb­nis aus wie in Abbil­dung 3. Die direkte Visua­li­sie­rung der Daten in Neo4J ist ein wich­ti­ges Vehi­kel, wel­ches es ermög­licht, die Bezie­hun­gen zwi­schen den ein­zel­nen Objek­ten ein­fach und schnell zu erken­nen und ent­lang der Pfade zu navi­gie­ren (Abbil­dung 5). Ändern sich die Bezie­hun­gen oder müs­sen die Objekte anders als bis­her ver­knüpft wer­den, so kön­nen in dem bestehen­den Gra­phen die neuen Bezie­hun­gen zwi­schen den Objek­ten erzeugt wer­den ohne die alten vor­her löschen zu müs­sen. So kann man die lei­di­gen Migra­ti­ons­auf­ga­ben umge­hen. Es wird nur ent­lang der inter­es­sie­ren­den Pfade tra­ver­siert, so dass es ermög­licht wird, unter­schied­li­che Hier­ar­chien gleich­zei­tig im Sys­tem zu hal­ten und  abzu­fra­gen, ohne den Gra­phen neu aufzusetzen.

Vergleich der Graphdatenbank Neo4J mit relationalen Datenbanken Bild4
Abbil­dung 4 Aus­schnitt Kno­ten und Bezie­hun­gen Neo4j

Auf die­sen kön­nen unter­schied­li­che Abfra­gen über Cypher rea­li­siert werden:

Wel­che Ver­träge hat Johan Mül­ler abge­schlos­sen? Zur Beant­wor­tung die Abfrage in Cypher:

$match(prs:Person)-[:hat]-(vertrag) where prs.name = "Johan Müller" return prs, vertrag.
Vergleich der Graphdatenbank Neo4J mit relationalen Datenbanken Bild5
Abbil­dung 5 Ein Kunde mit sei­nen Verträgen

Die gra­phi­sche Ober­flä­che ermög­licht es durch das Navi­gie­ren inner­halb des Gra­phen Details zu den ein­zel­nen Nodes zu holen oder zu löschen ohne den Code extra erwei­tern zu müssen.

Vergleich der Graphdatenbank Neo4J mit relationalen Datenbanken Bild6
Abbil­dung 6 Visu­elle Navi­ga­tion inner­halb von Neo4J
Fazit

Ste­hen bei einem Pro­jekt die Ana­lyse von Daten-Bezie­hun­gen im Fokus, so sind ein­deu­tig die gra­ph­ori­en­tier­ten Daten­ban­ken die aller­erste Wahl – ins­be­son­dere Neo4J mit ihrer für diese Zwe­cke opti­mier­ten Speicherungsstruktur.

Bei­spiele für den Ein­satz einer gra­ph­ori­en­tier­ter Daten­bank sind:

  • Das Auf­spü­ren von Ver­knüp­fun­gen zwi­schen ein­zel­nen Objek­ten (Betrugs­fälle in der Ver­si­che­rungs- oder Finanzbranche)
  • Rou­ten­pla­nung und Track­ing in glo­bal agie­ren­den Logistikunternehmen
  • Pro­ak­ti­ves Online-Management.

In den Anwen­dungs­fäl­len, bei denen der Schwer­punkt auf der Aggre­ga­tion hoch struk­tu­rier­ter Daten liegt, sind nach wie vor die rela­tio­na­len Daten­ban­ken unschlagbar.

Zusam­men­fas­send ist zu kon­sta­tie­ren, dass die gra­ph­ori­en­tier­ten Daten­ban­ken eine Erwei­te­rung dar­stel­len – aber (noch) nicht die bestehen­den rela­tio­na­len DBMS kom­plett erset­zen können.