An increase in "crash for cash" cases is driving up the total cost of insurance fraud. In particular, so-called crash for cash scams, in which fraudsters deliberately cause motor accidents in order to make false whiplash claims, have contributed to the increase.

The problem with schemes like whiplash for cash is that it targets the insurance companies' weaknesses. Faced with thousands of claims they have a hard time finding suspicious behavior in the data they process. Luckily, like with stolen credit cards or loan fraud, whiplash for cash criminals can be identified with graph technologies.

Scenario

In a typical hard fraud scenario, rings of fraudsters work together to stage fake accidents and claim soft tissue injuries. These fake accidents never really happen. They are “paper collisions”, complete with fake drivers, fake passengers, fake pedestrians and even fake witnesses.

Such rings normally include a number of roles :

  • Providers
  • Collusions typically involve participation from professionals in several categories: Doctor or Lawyers

  • Drivers
  • Passengers
  • Witnesses

Fraudsters often create and manage rings by "recycling" participants so as to stage many accidents. Thus one accident may have a particular person playing the role of the driver. In another accident the same person may be a passenger or a pedestrian, and in another a witness. Clever usage of roles can generate a large number of costly fake accidents, even with a small number of participants.

Solution

We can model the data the insurance company has about its accidents as a graph and then find fraud rings with graph queries.

Graph Structure

The graph data model below represents how the data is linked, and illustrates how one can find rings by simply walking the graph.

graph structure

Steps to Implement

Step 1

Sample data:

Creating graph data from CLI

CREATE (Person:UdoHalstein {"first_name":"Udo", "last_name":"Halstein"})

CREATE (Person:RobrechtMiloslav {"first_name":"Robrecht", "last_name":"Miloslav"})

CREATE (Person:MonroeMaksymilian {"first_name":"Monroe", "last_name":"Maksymilian"})

CREATE (Person:SkylerGavril {"first_name":"Skyler","last_name":"Gavril"})

CREATE (Person:EuantheRossana {"first_name":"Euanthe","last_name":"Rossana"})

CREATE (Person:JasmineRhea {"first_name":"Jasmine","last_name":"Rhea"})

CREATE (Person:SousannaPinar {"first_name":"Sousanna","last_name":"Pinar"})

CREATE (Person:ChelleJessie {"first_name":"Chelle", "last_name":"Jessie"})

CREATE (Car:Ford_Focus {"constructor":"Ford", "model":"Focus"})

CREATE (Car:Toyota_Corolla {"constructor":"Toyota", "model":"Corolla"})

CREATE (Car:Kia_Rio {"constructor":"Kia", "model":"Rio"})

CREATE (Car:Hyundai_Elantra {"constructor":"Hyundai", "model":"Elantra"})

CREATE (Car:Ford_Fiesta {"constructor":"Ford", "model":"Fiesta"})

CREATE (Car:Renault_Clio {"constructor":"Renault", "model":"Clio"})

CREATE (Accident:123 {"date":"19/05/2014","location":"New Jersey"})

CREATE (Accident:234 {"date":"23/05/2014","location":"Florida"})

CREATE (Accident:345 {"date":"27/05/2014","location":"Florida"})

CREATE (Car:Ford_Focus)-[IS_INVOLVED {"claim_total":"4817"}]->(Accident:123)

CREATE (Car:Toyota_Corolla)-[IS_INVOLVED {"claim_total":"4693"}]->(Accident:123)

CREATE (Car:Kia_Rio)-[IS_INVOLVED {"claim_total":"4157"}]->(Accident:234)

CREATE (Car:Hyundai_Elantra)-[IS_INVOLVED {"claim_total":"4001"}]->(Accident:234)

CREATE (Car:Ford_Focus)-[IS_INVOLVED {"claim_total":"4513"}]->(Accident:345)

CREATE (Car:Renault_Clio)-[IS_INVOLVED {"claim_total":"4307"}]->(Accident:345)

CREATE (Person:UdoHalstein)-[DRIVER {"claim_total":"19068","info":"Driver"}]->(Car:Ford_Focus)

CREATE (Person:UdoHalstein)-[PASSENGER {"claim_total":"19447","info":"Passenger"}]->(Car:Kia_Rio)

CREATE (Person:UdoHalstein)-[PASSENGER {"claim_total":"19346","info":"Passenger"}]->(Car:Ford_Fiesta)

CREATE (Person:RobrechtMiloslav)-[DRIVER {"claim_total":"19359","info":"Driver"}]->(Car:Toyota_Corolla)

CREATE (Person:RobrechtMiloslav)-[PASSENGER {"claim_total":"19658","info":"Passenger"}]->(Car:Hyundai_Elantra)

CREATE (Person:RobrechtMiloslav)-[PASSENGER {"claim_total":"19282","info":"Passenger"}]->(Car:Renault_Clio)

CREATE (Person:MonroeMaksymilian)-[DRIVER {"claim_total":"19425","info":"Driver"}]->(Car:Kia_Rio)

CREATE (Person:MonroeMaksymilian)-[PASSENGER {"claim_total":"19535","info":"Passenger"}]->(Car:Ford_Focus)

CREATE (Person:MonroeMaksymilian)-[PASSENGER {"claim_total":"19779","info":"Passenger"}]->(Car:Renault_Clio)

CREATE (Person:SkylerGavril)-[DRIVER {"claim_total":"19010","info":"Driver"}]->(Car:Hyundai_Elantra)

CREATE (Person:SkylerGavril)-[PASSENGER {"claim_total":"19423","info":"Passenger"}]->(Car:Ford_Fiesta)

CREATE (Person:SkylerGavril)-[PASSENGER {"claim_total":"19971","info":"Passenger"}]->(Car:Toyota_Corolla)

CREATE (Person:EuantheRossana)-[DRIVER {"claim_total":"19940","info":"Driver"}]->(Car:Ford_Fiesta)

CREATE (Person:EuantheRossana)-[PASSENGER {"claim_total":"19474","info":"Passenger"}]->(Car:Hyundai_Elantra)

CREATE (Person:EuantheRossana)-[PASSENGER {"claim_total":"19762","info":"Passenger"}]->(Car:Ford_Focus)

CREATE (Person:JasmineRhea)-[DRIVER {"claim_total":"19558","info":"Driver"}]->(Car:Renault_Clio)

CREATE (Person:JasmineRhea)-[PASSENGER {"claim_total":"19224","info":"Passenger"}]->(Car:Toyota_Corolla)

CREATE (Person:JasmineRhea)-[PASSENGER {"claim_total":"19520","info":"Passenger"}]->(Car:Kia_Rio)

CREATE (Person:SousannaPinar)-[IS_DOCTOR {"info":"Doctor"}]->(Person:UdoHalstein)

CREATE (Person:SousannaPinar)-[IS_DOCTOR {"info":"Doctor"}]->(Person:MonroeMaksymilian)

CREATE (Person:SousannaPinar)-[IS_DOCTOR {"info":"Doctor"}]->(Person:EuantheRossana)

CREATE (Person:ChelleJessie)-[IS_LAWYER {"info":"Lawyer"}]->((Person:RobrechtMiloslav)

CREATE (Person:ChelleJessie)-[IS_LAWYER {"info":"Lawyer"}]->((Person:MonroeMaksymilian)

CREATE (Person:ChelleJessie)-[IS_LAWYER {"info":"Lawyer"}]->((Person:SkylerGavril)

CREATE (Person:ChelleJessie)-[IS_LAWYER {"info":"Lawyer"}]->((Person:EuantheRossana)

Step 2

Performing Graph Queries

Let's start with a simple example

Checking number of accidents a person is involved in

S1=>(@p Person:*)-[@r *]->(@c Car:*);RETURN p.name AS Person, COUNT(*) AS AccidentInvolvedIn

Checking passengers involved in an accident

S1=>(@p Person:*)-[@r PASSENGER]->(@c Car:*)-[@f IS_INVOLVED]->(@a Accident:*);RETURN p.name AS PersonName, c.name AS CarModel, a.location AS Location, r.info AS label, a.name AS AccidentID

Checking drivers involved in an accident

S1=>(@p Person:*)-[@r DRIVER]->(@c Car:*)-[@f IS_INVOLVED]->(@a Accident:*);RETURN p.name AS PersonName, c.name AS CarModel, a.location AS Location, r.info AS label,a.name AS AccidentID

Checking for all the people who were both driver and passenger

S2=>[S1=>(@p Person:*)-[@d DRIVER]->(@c Car:*)]-[@g PASSENGER]->(@f Car:*);RETURN p.name AS Pname, d.info AS driver, g.info AS Passenger, COUNT(p.name) AS CNT

As in the bank fraud example above, graph database queries can be added to the insurance company's standard checks, at appropriate points in time such as when the claim is filed to flag suspected fraud rings in real time.