Teil II

Nach­dem die wesent­li­chen Unter­schiede zwi­schen den klas­si­schen RDBMS und den Graph-Daten­mo­del­len in dem vor­he­ri­gen Blog beleuch­tet wur­den, stellt sich die Frage nach dem Busi­ness Case-Nutzen.

Wie kann Graph- Tech­no­lo­gie in die bestehende Soft­ware- und Daten­ar­chi­tek­tur ein­ge­fügt wer­den? Denkt man an Graph­da­ten­ban­ken und ins­be­son­dere an Neo4J als einen sei­ner pro­mi­nen­tes­ten Ver­tre­ter, so wer­den einem evtl. die durch das breite mediale Echo pro­mi­nent gewor­de­nen Ent­hül­lun­gen der soge­nann­ten „Panama Papers“ mit brei­ten inter­na­tio­na­len Ver­net­zun­gen präsent.

Der „all­täg­li­che“ Betrug fin­det in der Regel in viel klei­ne­rem unschein­ba­ren Rah­men statt. In Summe gese­hen fügt die­ser den betrof­fe­nen Unter­neh­men aller­dings einen enor­men wirt­schaft­li­chen Scha­den zu. Neben den Bank- und Geld­in­sti­tu­ten sind es ins­be­son­dere Ver­si­che­rungs­un­ter­neh­men, die für Betrü­ger beson­ders attrak­tiv zu sein scheinen.

Wie erken­nen Ver­si­che­rungs­un­ter­neh­men ent­spre­chende Betrugs­ver­su­che, wie kön­nen Indi­zien für einen Ver­si­che­rungs­miss­brauch gesam­melt werden?

In der Ver­si­che­rungs­bran­che gibt es bereits heute aus­ge­klü­gelte Mecha­nis­men, die auf Basis von vor­de­fi­nier­ten Stan­dard­re­geln die Scha­den­fälle in fol­gende Kate­go­rien einteilen:

  • Fraud
  • Not Fraud
  • Unsure.

Die „Unsure“-Verdachtskategoriefälle sind für die wei­te­ren Unter­su­chun­gen von beson­de­rem Inter­esse. Dabei sol­len vor allem die Bezie­hun­gen zwi­schen Geschä­dig­ten, Scha­dens­ver­ur­sa­cher, Scha­den­fall und allen wei­te­ren Akteu­ren wie Zeu­gen, Leis­tungs­er­brin­gern (Ärzte, Kran­ken­häu­ser, Anwälte) etc. beleuch­tet wer­den, um einen mög­li­chen Ver­si­che­rungs­miss­brauchs­ver­dacht aus­zu­räu­men oder zu bestä­ti­gen. Eine Graph­da­ten­bank setzt auf die Unter­su­chung von Bezie­hun­gen inner­halb eines Netz­wer­kes und genau diese ste­hen bei der Ana­lyse des Ver­dachts im Mit­tel­punkt. Im Fol­gen­den wer­den auf Basis eines Busi­ness Case aus der Haft­pflicht­ver­si­che­rungs­sparte  „Ver­dacht auf dop­pelte Scha­dens­mel­dung“ die Kern­aspekte der Neo4j-Abfra­ge­spra­che „Cypher“ vorgestellt.

Busi­ness Case: „Ver­dacht auf dop­pelte Schadensmeldung“

Der betrach­tete Sach­ver­halt setzt sich wie folgt zusam­men: „ Am 01.01.2018 wurde von Herrn Klaus Mus­ter­mann, wohn­haft in Zürich See­feld 1, ein Scha­dens­fall ange­mel­det. Als geschä­dig­ter Gegen­stand wurde ein Fern­se­her, Modell „FDS2010“, ange­ge­ben. Der Scha­dens­fall ereig­nete sich in Zürich, Basel­straße 10.“

Bei der Unter­su­chung von Betrugs­ver­dachts­fäl­len sind die Sach­ver­stän­di­gen an einer mög­lichst gro­ßen Anzahl von Ver­bin­dun­gen bzw. einer Viel­fäl­tig­keit der Ver­net­zung zwi­schen den ein­zel­nen Daten­punk­ten inter­es­siert. Das Graph-Daten­mo­dell ist daher in der Regel an die spe­zi­fi­sche Fra­ge­stel­lung, das Unter­su­chungs­ver­fah­ren, den Busi­ness Pro­zess oder das Modell ange­lehnt. Unter­schied­li­che Her­an­ge­hens­wei­sen bei der Unter­su­chung resul­tie­ren somit in unter­schied­li­chen Daten­mo­del­len. Aus Grün­den der Nach­voll­zieh­bar­keit ent­hält ein stark ver­ein­fach­tes Modell zur Visua­li­sie­rung des obi­gen Sach­ver­hal­tes fol­gende Elemente:

  • Gemel­de­ter Scha­dens­fall, der unter­sucht wird (Claim)
  • Geschä­dig­ter und ver­si­cher­ter Gegen­stand (Sub­ject-mat­ter insured)
  • Ver­si­che­rungs­neh­mer und Scha­dens­ver­ur­sa­cher (Insu­rant)
  • Adresse (Address)
Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild1
Abbil­dung 1 Bei­spiel Graph-Modell Pattern

Die anschlie­ßen­den Bear­bei­tungs­schritte einer Unter­su­chung lau­fen in den meis­ten Fäl­len nach fol­gen­dem Mus­ter ab:

1. Laden der Daten

Im ers­ten Schritt wer­den die Scha­dens­da­ten in die Neo4j-Daten­bank gela­den. Dabei wird das Graph-Modell Pat­tern auf die Daten ange­wandt und die Daten als Kno­ten und die zuge­hö­ri­gen Bezie­hun­gen in der Neo4J-Daten­bank erstellt. Betrach­tet man das obige Graph-Modell Pat­tern unter der Cypher–Brille, so sind fol­gende Struk­tu­ren von Interesse:

Kno­ten (Node)

Die ein­fachste Dekla­ra­tion eines Kno­tens ist () und reprä­sen­tiert einen anony­men Kno­ten ohne irgend­wel­che Eigen­schaf­ten. Ein Kno­ten – Label defi­niert den Kno­ten­typ. Das Label bestimmt die Gren­zen eines Bezie­hungs­kon­strukts, das unter­sucht wird. Auch die Nodes-Indi­zes in Neo4J nut­zen die Labels:
Jeder Index ist ein­deu­tig pro Label und Pro­perty-Kom­bi­na­tion. Die Eigen­schaf­ten (Pro­per­ties) eines Kno­tens bestehen aus key­/va­lue-Paa­ren und kön­nen ana­log zu den Knoten–Labels zum Ein­schrän­ken des Graph-Pat­terns oder zur Spei­che­rung der Zusatz­in­for­ma­tio­nen genutzt werden.

Die Syn­tax zum Kre­ieren eines Insu­rant Kno­tens mit Label und Properties:

Properties: ( :Insurant {id: 100, name: "Klaus Mustermann", gender: „male“})
Bezie­hung (Rela­ti­onship)

Eine Bezie­hung hat immer einen Start- und einen End­kno­ten. Es gibt keine bidi­rek­tio­na­len Bezie­hun­gen, die Bezie­hungs­rich­tung ist immer durch einen Pfeil vor­ge­ge­ben. Ein Bezie­hungs­typ ent­spricht dem Label-Pro­perty-Kon­strukt (die Bezie­hungs­ei­gen­schaf­ten ent­spre­chen den Kno­ten).
Die Syn­tax  zum Kre­ieren einer Bezie­hung: -[:LIVES_AT]->

Graph-Mus­ter (Pat­tern)

Durch die Kom­bi­na­tion von Kno­ten und Bezie­hun­gen ent­ste­hen Mus­ter (Pat­tern)
Die Syn­tax:

(:Insurant {id: 100, name: "Klaus Mustermann", gender: "male"}) -[:LIVES_AT]-> (: Address {address_line_1:"Seestrasse 1", city:"Zuerich", zip:"8000", country:"CH"})

Der sprin­gende Punkt bei der Pat­tern­de­fi­ni­tion ist das Ver­ständ­nis davon, dass ein Kno­ten im Pat­tern einen 0 – N Daten­bank­kno­ten beschreibt und umge­kehrt ein Pat­tern 0 – N Kno­ten und Bezie­hun­gen zwi­schen den Kno­ten beschreibt.

Varia­blen

Die Mög­lich­keit der Zuwei­sung von Varia­blen an Kno­ten, Bezie­hun­gen oder Pat­terns inner­halb eines State­ments erhöht die Wie­der­ver­wend­bar­keit der Abfra­gen in Cypher:
Die Syn­tax: 

lives_at = (:Insurant)-[:LIVES_AT]->(:Address)

Für den Daten­im­port bie­tet Neo4j unter­schied­li­che Schnitt­stel­len an. Die ein­fachste Methode ist Cypher’s Befehl “LOAD CSV” oder „LOAD JSON“. Dabei wer­den die Daten von der Quelle (z.B. aus Ora­cle, MySQL, Post­greSQL-Tabel­len) in eine CSV-Datei expor­tiert und anschlie­ßend impor­tiert. Eine insurant.csv Datei zur Erstel­lung der Insurant–Knoten bedient sich fol­gen­der Syntax:

// Create Insurant
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:insurant.csv" AS row
CREATE (:Insurant {id: row.PersonID, name: row.PersonName, gender: PersonGender});

Sehr große Daten­men­gen müs­sen bei die­sem Ver­fah­ren in meh­rere Dateien gesplit­tet und dann beim Import via merge – Befehl wie­der­zu­sam­men­ge­fügt werden.

Einen direk­ten Weg ohne File­ex­port und Split­ting bie­tet die Daten­in­te­gra­tion via Tal­end Open Stu­dio for Big Data an.  Die­ses stellt einen Con­nec­tor für die­Neo4j-Daten­bank bereit, wel­cher durch eine ein­fa­che Kon­fi­gu­ra­tion direkt genutzt wer­den kann. Der Nach­teil ist, dass diese Methode die Neo4J-Rest API nutzt und daher lang­sa­mer ist als die Metho­den, die einen nati­ven Java Dri­ver einsetzen.

Neo4J 3.0 bie­tet mit neo4j-import ein Tool für ein effek­ti­ves bulk load von sehr gro­ßen Daten­men­gen und eine initiale Erstel­lung einer Datenbank.

2. Auf­fin­den von Matches/Auffälligkeiten

Nach­dem die Daten gela­den wur­den kön­nen unter­schied­li­che Bezie­hun­gen zwi­schen den ein­zel­nen Scha­dens­fäl­len, Geschä­dig­ten und wei­te­ren Akteu­ren unter­sucht wer­den. Cypher ist eine dekla­ra­tive Spra­che und wurde bei ihrer Ent­wick­lung stark durch die moder­nen Spra­chen wie Python oder SPARQL beein­flusst. Als Ergeb­nis ste­hen einem Ana­lys­ten neben SQL – ähn­li­chen Key­words wie WHERE, ORDER BY zusätz­li­che mäch­tige Kon­strukte wie pat­tern-matching oder list-seman­tic zur Verfügung.

Der Cypher-Befehl MATCH in Kom­bi­na­tion mit RETURN bringt die gesuch­ten Daten­punkte zurück. Mit der WHERE-Klau­sel kön­nen die Such­ergeb­nisse ein­ge­schränkt werden:

MATCH (insurant:Insurant)-[:LIVES_AT]->(adr:Address)
WHERE adr.country = 'CH'
RETURN insurant.name, adr.city, adr.address_line_1
Abbil­dung 2 Ein­ge­schränkte Suchergebnisse

Mit dem Befehl SET kön­nen Labels und Pro­per­ties über­schrie­ben oder ergänzt werden. 

MATCH (insurant:Insurant)
WHERE insurant.name='Klaus Mustermann'
SET insurant.civil_status="single"
SET insurant :Insurant:Claimant
SET insurant.gender=NULL
RETURN insurant;

Als Ergeb­nis wurde dem Kno­ten (:Insu­rant) ein wei­te­res Label (:Clai­mant) hin­zu­ge­fügt, eine neue Pro­perty ‚civil_status‘ erstellt und die Pro­perty ‚gen­der‘ von (:Insu­rant) gelöscht.

Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild3
Abbil­dung 3 Neuer Knoten
Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild4
Abbdi­lung 4 Suchergebnis

Mit DELETE kön­nen die Kno­ten per­ma­nent aus der Graph­da­ten­bank gelöscht wer­den. Sind die Kno­ten über Bezie­hun­gen ver­knüpft, kön­nen sie so lange nicht gelöscht wer­den, bis die Bezie­hun­gen gelöst sind. Dies erfolgt mit­tels des Key­words DETACH. Die gelös­ten Bezie­hun­gen wer­den auto­ma­tisch mitgelöscht. 

MATCH (claimint:Claimant)
WHERE claimant.name='Klaus Mustermann'
DETACH DELETE claimant;
Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild5
Abbil­dung 5 Gelöste Beziehung

In unse­rem Bei­spiel fokus­sie­ren wir uns zuerst auf die Adres­sen der Scha­dens­fälle und der Versicherungsnehmer.

Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild6
Abbdi­lung 6 Visua­li­sie­rung der Knoten

Dass zwei Ver­si­che­rungs­neh­mer mit unter­schied­li­chen Fami­li­en­na­men an der glei­chen Adresse regis­triert sind, ist nicht außer­ge­wöhn­lich. Schließ­lich kann es sich bspw. um eine Wohn­ge­mein­schaft han­deln. Inter­es­san­ter wird es, wenn man deren ange­mel­dete Scha­dens­fälle genauer ana­ly­siert. Als Ein­gangs­tor zum Tra­ver­sie­ren wird nun die Scha­dens­adresse eingegeben.

MATCH (a:Address{address_line_1:"Baselstrasse 10", city:"Zuerich"})<-[:PLACED_AT]-(m:Subject_matter_insured)-[:INVOLVED_IN]->(c:Claim <-[:ADVISED]-(i:Insurant) return a, m, c, i

Diese Abfrage bringt neben dem Scha­dens­dos­sier „Claim 2018“ von Herr Mus­ter­mann die wei­te­ren von der Basel­straße 10 in Zürich gemel­de­ten Scha­dens­fälle – inkl. der Kno­ten des geschä­dig­ten Gegen­stands, des Ver­si­che­rungs­neh­mers und das Scha­dens­dos­sier „Claim 2017“.

Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild7
Abbil­dung 7 Visua­li­sie­rung der ver­fei­ner­ten Abfrage
3. Kom­bi­nie­ren der Matches

Im drit­ten Schritt wer­den die vor­he­ri­gen Ergeb­nisse genauer unter­sucht. Der Vor­teil von Neo4J ist dabei, dass alle in dem betrof­fe­nen Zusam­men­hang inter­es­sie­ren­den Infor­ma­tio­nen extrem ein­fach und schnell bereit­ge­stellt wer­den. So kön­nen die erfass­ten Infor­ma­tio­nen zu dem geschä­dig­ten Gegen­stand gemel­de­ter Fälle abge­gli­chen wer­den. In unse­rem Bei­spiel liegt höchst­wahr­schein­lich eine Dop­pelt­scha­dens­mel­dung vor, schein­bar wurde der glei­che Gegen­stand an der­sel­ben Adresse beschädigt.

Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild8
Abbil­dung 8 Such­ergeb­nis

Archi­tek­to­ni­sche Möglichkeiten

Der beschrie­bene Busi­ness Case zeigt auf, dass Neo4J in ers­ter Linie das explo­ra­tive Vor­ge­hen bei den Daten­ana­ly­sen unter­stützt. Die nach­fol­gende Gra­fik stellt einen mög­li­chen Ein­satz von Neo4J in der Soft­ware-Archi­tek­tur eines Unter­neh­mens dar.

Anwendungsfalle-Neo4J-–-Versicherungsbetrug-Bild9
Abbil­dung 9 Beispielarchitektur

Die Daten für Neo4J kön­nen dabei aus bereits eta­blier­ten DBMS wie z.B. MySQL, Ora­cle, Post­greSQL und Hadoop je nach Fra­ge­stel­lung in ein jewei­li­ges Graph­mo­dell über­führt wer­den oder die Kno­ten und Bezie­hun­gen über einen Web­craw­ler (z.B. JAVA JSoup oder Python) direkt in Neo4J erstellt wer­den. Die Daten­ver­ar­bei­tung kann dabei sowohl in Echt­zeit als auch im Batch-Modus erfolgen.

Die Koexis­tenz­fä­hig­keit der rela­tio­na­len DBMS und einer Graph­da­ten­bank bringt Vor­teile, die fol­gende Ein­satz­sze­na­rien ermöglichen:

1. Daten­ex­port aus rela­tio­na­len DBMS oder NoSQL-Load ins Neo4J, Ad-hoc-Ana­ly­sen mit „Weg­werf­mo­del­len“

2. Dort, wo die rela­tio­na­len DBMS auf­grund der Daten­menge, Per­for­mance, Daten­ver­net­zungs­dichte an ihre Gren­zen sto­ßen, kann Neo4J ein Modell für die Unter­neh­mens­ap­pli­ka­tio­nen bereitstellen

3. Die in der Graph­da­ten­bank ermit­tel­ten Erkennt­nisse kön­nen wie­der für wei­tere BI-Zwe­cke in die rela­tio­nale DBMS, Hadoop etc. zurückfließen.

Durch die Neo4J-Inte­gra­tion in die Soft­ware-Archi­tek­tur wird das archi­tek­to­ni­sche Gesamt­werk eines Unter­neh­mens ein Stück fle­xi­bler und für bestehende und zukünf­tige Anfor­de­run­gen leistungsfähiger.