在现代欺诈和各类金融犯罪中,欺诈者通过改变自身身份等达到逃避风控规则的欺诈目的。您可以通过图数据库GDB建立追踪用户行为的图结构,实时分析欺诈行为的离散数据,识别欺诈环,帮助您快速防范和解决欺诈行为。

背景信息

保险理赔欺诈一般根据保险提供商所具备的患者、疾病和索赔等数据,分析与被保人相关的理赔单、疾病等实体的关联关系,识别异常理赔记录,发现欺诈团伙。

1、数据和模型

以保险领域公开数据集为例。更多信息,请参见数据模型参考下载

数据包括保险行业基本元素,可以将数据模型抽象为下图:
  • 点:投保人(policyholder)、保单(incharge)、理赔(claim)、病人(patient)、疾病(disease)。
  • 边:疾病-病人(has_disease)、投保人-理赔(policyholder_of_claim)、保单-理赔(inchagre_of_claim)、病人-理赔(insured_of_claim)、相似理赔(similar_claim)、投保人关联(policyholder_connection)。
  • 属性:姓名(name),是否高危(high_risk)、风险分数(risk_score)、疾病名称(disease_name)、相似度(similarity_score)、关联等级(level)、理赔时间(claim_date)、保额(charge)等。
6.1
示例数据如下:
  • 点文件:
    //policyholder投保人信息。
    ~id,~label,FNAME:string,LNAME:string,RISK_SCORE:int,HIGH_RISK:int
    PH3068,policyholder,ADAM,OCHSENBEIN,88,1
    PH3069,policyholder,MALINDA,MEHSERLE,42,0
    PH3070,policyholder,SANDRA,KUHTA,20,0
    PH3071,policyholder,DORA,TAHU,62,1
    
    //incharge保单信息。
    ~id,~label,FNAME:string,LNAME:string,RISK_SCORE:int,SERVICE_ID:string
    PI18675,incharge,ROSCOE,ROSCOE,0,S10444
    PI18676,incharge,AUDRIE,AUDRIE,24,S12029
    PI18677,incharge,WINTER,WINTER,25,S15709
    PI18678,incharge,LILA,LILA,27,S16484
    PI18679,incharge,NANCIE,NANCIE,31,S12306
    ...
  • 边文件:
    //has_disease疾病-病人。
    ~id,~from,~to,~label
    10529764572383,105297,64572383,has_disease
    10529764572383,105297,64572383,has_disease
    10529764572384,105297,64572384,has_disease
    10529764572389,105297,64572389,has_disease
    10941664572116,109416,64572116,has_disease
    10941664572116,109416,64572116,has_disease
    10941664572117,109416,64572117,has_disease
    
    //policyholder_of_claim投保人-理赔。
    ~id,~from,~to,~label
    C1528PH2963,C1528,PH2963,policyholder_of_claim
    C1529PH1353,C1529,PH1353,policyholder_of_claim
    C1530PH1071,C1530,PH1071,policyholder_of_claim
    C1531PH8102,C1531,PH8102,policyholder_of_claim
    C1532PH4768,C1532,PH4768,policyholder_of_claim
    C1533PH2287,C1533,PH2287,policyholder_of_claim
    C1534PH6948,C1534,PH6948,policyholder_of_claim
    C1535PH621,C1535,PH621,policyholder_of_claim

2、创建实例

创建图数据库实例。具体操作,请参见创建主实例
说明
  • 实例购买成功后,您可以在实例列表页面查看实例相关信息。通常,实例创建成功需要3~5分钟。
  • 创建GDB实例后,您需要创建账号和密码、设置安全组,保证您具有GDB实例的访问权限。具体操作,请参见创建账号设置白名单

3、数据导入

图数据库GDB支持从多种数据源将数据导入至图数据库GDB,您可以使用以下两种方式进行数据导入:

4、连接实例

图数据库GDB支持多种方法连接实例,您可以通过以下五种方式连接实例:
  • 通过GDB控制台直接登录数据管理服务DMS,更加方便快捷地远程访问、在线管理您的GDB数据库。具体操作,请参见通过DMS登录GDB数据库
  • 通过开源组件GDB Console可视化控制台登录图数据库,可视化界面,操作简单,并可根据业务需求对可视化界面进行二次开发。具体操作,请参见通过开源组件GDB Console登录图数据库
  • 通过Gremlin Console连接实例,命令行模式,适合Gremlin内核版本,适合用于查询语句性能优化。具体操作,请参见通过Gremlin Console连接实例
  • 通过Cypher Shell连接实例,命令行模式,适合Cypher内核版本。具体操作,请参见通过Cypher Shell连接实例
  • 通过SDK连接,支持Java、Python、.Net、Go、Node.js五种SDK。具体操作,请参见SDK参考

5、使用范例

  • 简单查询
    • 数据统计:
      //统计点的数目。
      gremlin> g.V().count()
      ==>120571
      
      //统计边的数目。
      gremlin> g.E().count()
      ==>215943
      
      //统计每种类型点的数量。
      gremlin> g.V().group().by(label).by(count())
      ==>[policyholder:10006,disease:397,patient:166,claim:100001,incharge:10001]
      
      //统计每种类型边的数量。
      gremlin> g.E().group().by(label).by(count())
      ==>[inchagre_of_claim:100001,insured_of_claim:12,similar_claim:15279,policyholder_connection:347,policyholder_of_claim:99983,has_disease:321]
    • 过滤查询、排序查询:
      //查询理赔单C4377的投保、理赔、被保情况。
      gremlin> g.V('C4377').outE('policyholder_of_claim','inchagre_of_claim','insured_of_claim').path()
      ==>[v[C4377],e[C4377PI26607][C4377-inchagre_of_claim->PI26607]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279]]
      ==>[v[C4377],e[C4377PH3759][C4377-policyholder_of_claim->PH3759]]
      6.2
  • 通用场景
    • K阶邻居:
      //已知保单C4377为欺诈保单,查询和理赔单C4377有相同理赔病人的理赔单,说明该理赔人有涉嫌骗保的嫌疑。
      gremlin> g.V('C4377').repeat(bothE('insured_of_claim').otherV().simplePath()).times(2).path()
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C1016011279][C10160-insured_of_claim->11279],v[C10160]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C2658611279][C26586-insured_of_claim->11279],v[C26586]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C2675411279][C26754-insured_of_claim->11279],v[C26754]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C2896311279][C28963-insured_of_claim->11279],v[C28963]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C367911279][C3679-insured_of_claim->11279],v[C3679]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C6759411279][C67594-insured_of_claim->11279],v[C67594]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C6939511279][C69395-insured_of_claim->11279],v[C69395]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C8727811279][C87278-insured_of_claim->11279],v[C87278]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C8760311279][C87603-insured_of_claim->11279],v[C87603]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C9615511279][C96155-insured_of_claim->11279],v[C96155]]
      ==>[v[C4377],e[C437711279][C4377-insured_of_claim->11279],v[11279],e[C9654511279][C96545-insured_of_claim->11279],v[C96545]]
      6.3
      //查询已知欺诈保单C4377的投保人的社交关系,可以对这些人的理赔情况提前预警。
      gremlin> g.V('C4377').outE('policyholder_of_claim').inV().repeat(bothE('policyholder_connection').otherV().simplePath()).times(3).path()
      ==>[v[C4377],e[C4377PH3759][C4377-policyholder_of_claim->PH3759],v[PH3759],e[PH3759PH512][PH3759-policyholder_connection->PH512],v[PH512],e[PH512PH1569][PH512-policyholder_connection->PH1569],v[PH1569],e[PH1569PH4722][PH1569-policyholder_connection->PH4722],v[PH4722]]
      ==>[v[C4377],e[C4377PH3759][C4377-policyholder_of_claim->PH3759],v[PH3759],e[PH3759PH512][PH3759-policyholder_connection->PH512],v[PH512],e[PH512PH1569][PH512-policyholder_connection->PH1569],v[PH1569],e[PH1569PH4731][PH1569-policyholder_connection->PH4731],v[PH4731]]
      6.5
    • 最短路径:
      //查询投保人PH3759和投保人PH4722的最短路径,分析投保人之间的关联关系。
      gremlin> g.V('PH3759').repeat(bothE().otherV().simplePath())
                  .until(hasId('PH4722').or().loops().is(gt(3L)))  //hasId()部分控制结束ID,gt()部分查询深度。
                      .hasId('PH4722').path().dedup()
      ==>[v[PH3759],e[PH3759PH512][PH3759-policyholder_connection->PH512],v[PH512],e[PH512PH1569][PH512-policyholder_connection->PH1569],v[PH1569],e[PH1569PH4722][PH1569-policyholder_connection->PH4722],v[PH4722]]
      ==>[v[PH3759],e[PH3759PH512][PH3759-policyholder_connection->PH512],v[PH512],e[PH512PH1569][PH512-policyholder_connection->PH1569],v[PH1569],e[PH1569PH4731][PH1569-policyholder_connection->PH4731],v[PH4731],e[PH1565PH4731][PH1565-policyholder_connection->PH4731],v[PH1565],e[PH1565PH4722][PH1565-policyholder_connection->PH4722],v[PH4722]]
      6.6
    • 共同邻居:
      //查询保单C4377和保单C67594的共同邻居,从而找到两个保单的共同投保人。
      gremlin> g.V('C4377').repeat(bothE('policyholder_of_claim').otherV().simplePath()).times(2).hasId('C67594').path().dedup() //hasId()部分控制结束ID。
      ==>[v[C4377],e[C4377PH3759][C4377-policyholder_of_claim->PH3759],v[PH3759],e[C67594PH3759][C67594-policyholder_of_claim->PH3759],v[C67594]]==>[v[2987000],e[3][2987000-t_a1->315.0],v[315.0],e[938][2987172-t_a1->315.0],v[2987172]]
      ==>[v[2987000],e[4][2987000-t_a2->87.0],v[87.0],e[939][2987172-t_a2->87.0],v[2987172]]
      ==>[v[2987000],e[5][2987000-t_p->W],v[W],e[940][2987172-t_p->W],v[2987172]]
      6.7
    • 协同推荐:
      //已知保单C4377为欺诈保单,查找和保单C4377有共同投保人的保单,并按照共同邻居的个数进行排序,从而找到欺诈疑似涉诈保单。
      gremlin> g.V('C4377').both('policyholder_of_claim').aggregate("policyholder_of_claim").both('policyholder_of_claim').has(id, neq('C4377')).as("recomm_claim")
                  .flatMap(__.both().where(within("policyholder_of_claim")).count()).as("comm_cnt").order().by(desc)
                      .select("recomm_claim", "comm_cnt").dedup()
      ==>[recomm_claim:v[C26754],comm_cnt:1]
      ==>[recomm_claim:v[C26586],comm_cnt:1]
      ==>[recomm_claim:v[C10160],comm_cnt:1]
      ==>[recomm_claim:v[C28963],comm_cnt:1]
      ==>[recomm_claim:v[C3679],comm_cnt:1]
      ==>[recomm_claim:v[C67594],comm_cnt:1]
      ==>[recomm_claim:v[C69395],comm_cnt:1]
      ==>[recomm_claim:v[C87278],comm_cnt:1]
      ==>[recomm_claim:v[C87603],comm_cnt:1]
      ==>[recomm_claim:v[C96155],comm_cnt:1]
      ==>[recomm_claim:v[C96545],comm_cnt:1]
    • 与已知涉诈保单相似的保单:
      //查询和相似的保单,根据相似度分数取前10。
      gremlin> g.V('C4377')
                  .sideEffect(out().store('v1n'))
                  .as('v1')
                  .select('v1n').unfold().in().limit(100).simplePath().dedup().as('v2')
                  .project('i', 'u')
                      .by(select('v2').out().where(within('v1n')).count())
                      .by(union(select('v2').out().fold(),select('v1n')).unfold().dedup().count())
                  .project('Transaction', '相似度')
                      .by(select('v2').id())
                      .by(math('i/u'))
                  .order().by(select('相似度'), desc).limit(10)
      ==>[Transaction:C96545,相似度:0.992619926199262]
      ==>[Transaction:C15383,相似度:0.9871086556169429]
      ==>[Transaction:C17300,相似度:0.9871086556169429]
      ==>[Transaction:C30519,相似度:0.9871086556169429]
      ==>[Transaction:C56230,相似度:0.9871086556169429]
      ==>[Transaction:C60174,相似度:0.9871086556169429]
      ==>[Transaction:C6591,相似度:0.9871086556169429]
      ==>[Transaction:C66712,相似度:0.9871086556169429]
      ==>[Transaction:C68975,相似度:0.9871086556169429]
      ==>[Transaction:C7181,相似度:0.9871086556169429]

6、客户效果

某头部保险公司,经测算其关联查询性能是原有保险反欺诈方案的10~100倍。在原先的客户信息系统中,查询一个保单关联的信息(投保、理赔、疾病等信息),是通过两表之间的多次JOIN实现,当属性多、逻辑复杂时需要经过几十次甚至百次数据库交互,网络通信的开销带来极大的性能损耗。通过使用阿里云图数据库GDB的存储方案,可以带来10~100倍的性能提升。