--- template: overrides/blogs.html tags: - knowledge graph --- # Neo4J图数据库反欺诈分析实战(三) - 识别犯罪团伙 !!! info 作者:[Vincent](https://github.com/Realvincentyuan),发布于2021-06-06,阅读时间:约6分钟,微信公众号文章链接:[:fontawesome-solid-link:](https://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485261&idx=1&sn=9bbe4e099d7e199d749540797e82e443&chksm=eb90f439dce77d2fb5a8f06707844f0eef22667821f97d9e509563a36cebb2ed1903994056dd&token=1481538225&lang=zh_CN#rd) ## 1 前言 上回在[Neo4J图数据库反欺诈分析实战(二) - 准备数据](https://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485256&idx=1&sn=0d87a1d090f7282f85f3d2395372c8ed&chksm=eb90f43cdce77d2af75e6313e945a83f2309743e7e7e0855c99d9ecece6f3d24f3ad06ae80a4&token=771475859&lang=zh_CN#rd)中,笔者介绍了如何将数据导入Neo4J分析平台,并对客户和交易信息做了一些简单的描述性分析,接下来需要有针对性地去寻找欺诈罪犯,他们的身份信息(如电话、身份证号等)和其余许多账号交织在一起,因而可以通过这些共享的信息找到线索。 ## 2 共享的身份信息 在上一节中,已经定义了客户和实体的关系,如客户拥有电子邮件、电话、SSN等,如果有多个客户使用相同的信息,这些联系即可以确保他们被联系在一起,这在很大程度上帮助我们解构了复杂的关系。但是如果要运行特定的图算法,还需要对这些关系进行一些处理,因为图算法适用的图结构各有不同,有的算法适用于`同构`的图,即图中所有节点的类型相同,只有同一种关系。有的算法适用于`异构`的图,其中含有多种类型的节点和关系。 Neo4J提供的示例使用了[弱连接分量(Weakly Connected Components)](https://neo4j.com/docs/graph-data-science/current/algorithms/wcc/ 'Weakly Connected Components')算法寻找无向图中连接的节点,该算法适用于同构图,因此需要创建一种新的关系 - `SHARED_IDENTIFIERS` 计算每个客户之间共享的实体信息的数量,如客户A和B的电子邮件、电话和SSN相同,则SHARED_IDENTIFIERS的属性count为3。 ```sql // 创建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](https://neo4j.com/labs/apoc/4.2/overview/apoc.periodic/apoc.periodic.iterate/ 'apoc.periodic.iterate')方法分批次进行运算。 ## 3 创建图 运行任何算法前,必须先创建图,可以利用之前创建的`SHARED_IDENTIFIERS`关系构建图、并将其映射到内存中,因此Neo4J建议在构建图、运行算法前进行内存估算,确保计算资源能满足需求: ```sql 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 | 确保内存足够就可以正式创建图: ```sql 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`指令能将值赋给一个新的属性,此处即为客户所在的簇打上了标签,可以看到,代码已经排除了簇里只存在一个客户的情况,因为那些人与其他人没有关联。 ```sql 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、内存估算、创建图及运行图算法,下回讲解为危险人群进行评分,有效识别欺诈罪犯。