Skip to content

Neo4J图数据库反欺诈分析实战(三) - 识别犯罪团伙

Info

作者:Vincent,发布于2022-03-06,阅读时间:约4分钟,微信公众号文章链接:

1 前言

上回在Neo4J图数据库反欺诈分析实战(二) - 准备数据中,笔者介绍了如何将数据导入Neo4J分析平台,并对客户和交易信息做了一些简单的描述性分析,接下来需要有针对性地去寻找欺诈罪犯,他们的身份信息(如电话、身份证号等)和其余许多账号交织在一起,因而可以通过这些共享的信息找到线索。

2 共享的身份信息

在上一节中,已经定义了客户和实体的关系,如客户拥有电子邮件、电话、SSN等,如果有多个客户使用相同的信息,这些联系即可以确保他们被联系在一起,这在很大程度上帮助我们解构了复杂的关系。但是如果要运行特定的图算法,还需要对这些关系进行一些处理,因为图算法适用的图结构各有不同,有的算法适用于同构的图,即图中所有节点的类型相同,只有同一种关系。有的算法适用于异构的图,其中含有多种类型的节点和关系。

Neo4J提供的示例使用了弱连接分量(Weakly Connected Components)算法寻找无向图中连接的节点,该算法适用于同构图,因此需要创建一种新的关系 - SHARED_IDENTIFIERS 计算每个客户之间共享的实体信息的数量,如客户A和B的电子邮件、电话和SSN相同,则SHARED_IDENTIFIERS的属性count为3。

// 创建SHARED_IDENTIFIERS关系
MATCH (c1:Client)-[:HAS_EMAIL|:HAS_PHONE|:HAS_SSN]->(info)
<-[:HAS_EMAIL|:HAS_PHONE|:HAS_SSN]-(c2:Client)
WHERE c1.id<>c2.id
WITH c1, c2, count(*) as cnt
MERGE (c1) - [:SHARED_IDENTIFIERS {count: cnt}] - (c2);

命令中WITH关键字能够将查询语句串联在一起,方便上一步的变量在下一步继续使用。而MERGE关键字的用途非常广泛,概括来说,它可以使一种模式存在在图中,如果该模式不存在,即新创建该模式,此处用于创建一种关系。请注意,示例中数据量较小,仅有30万个节点,如果节点数量庞大,建议使用Neo4J提供的APOC方法分批次进行运算。

3 创建图

运行任何算法前,必须先创建图,可以利用之前创建的SHARED_IDENTIFIERS关系构建图、并将其映射到内存中,因此Neo4J建议在构建图、运行算法前进行内存估算,确保计算资源能满足需求:

CALL gds.graph.create.cypher.estimate(
'MATCH (c:Client) RETURN id(c) AS id',
'MATCH (c1:Client)-[r:SHARED_IDENTIFIERS]-(c2:Client)
WHERE c1.id<>c2.id
RETURN id(c1) AS source,id(c2) AS target,r.count AS weight')
YIELD requiredMemory,nodeCount,relationshipCount;

输出为:

requiredMemory nodeCount relationshipCount
"8804 KiB" 2433 1517

确保内存足够就可以正式创建图:

CALL gds.graph.create('WCC', 'Client',
    {
        SHARED_IDENTIFIERS:{
            type: 'SHARED_IDENTIFIERS',
            properties: {
                count: {
                    property: 'count'
                }
            }
        }
    }
) YIELD graphName,nodeCount,relationshipCount,createMillis;

如运行正常,即可使用CALL gds.graph.list();命令查看所创建的图。

4 执行WCC算法聚类

同样的,执行算法前也建议估算内存资源,但在此不再赘述,运行WCC使用如下命令。SET指令能将值赋给一个新的属性,此处即为客户所在的簇打上了标签,可以看到,代码已经排除了簇里只存在一个客户的情况,因为那些人与其他人没有关联。

CALL gds.wcc.stream('WCC')
YIELD componentId,nodeId
WITH componentId AS cluster,gds.util.asNode(nodeId) AS client
WITH cluster, collect(client.id) AS clients --collect合并一个序列
WITH *,size(clients) AS clusterSize
WHERE clusterSize>1
UNWIND clients AS client --UNWIND展开一个序列
MATCH(c:Client)
WHERE c.id=client
SET c.firstPartyFraudGroup=cluster;

WCC算法帮助识别了需要关注的人群,接下来的算法就可以基于聚类结果继续计算。

5 总结

该部分完成了对人群关系的重新整合、并识别了具有相似特征的群体,方便后续分析。同时介绍了常用的技术要点,如WITH、MERGE、SET、APOC、内存估算、创建图及运行图算法,下回讲解为危险人群进行评分,有效识别欺诈罪犯。


Viewed times

Comments