--- 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=2247485256&idx=1&sn=0d87a1d090f7282f85f3d2395372c8ed&chksm=eb90f43cdce77d2af75e6313e945a83f2309743e7e7e0855c99d9ecece6f3d24f3ad06ae80a4&token=771475859&lang=zh_CN#rd) ## 1 前言 在[Neo4J图数据库反欺诈分析实战(一) - 搭建分析环境](https://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485213&idx=1&sn=ed9051c887847bcf35ef6e21af6005f4&chksm=eb90f469dce77d7fa1325810d537e183c65eef7067f20219eee02d6f3667d14554832103986d&token=771475859&lang=zh_CN#rd)这篇文章里,介绍了Neo4J分析平台和一些基础的图数据库的操作,本文正式开始对反欺诈这一主题进行探索。首要任务是明确目标、获取数据和整理数据。Neo4J提供的示例中关注欺诈罪犯使用相同的实体信息控制大量账号进行欺诈交易,所以目标即是找出这些账号之间的联系、揪出犯罪团伙。但是,该示例并没有介绍数据的来源和数据的整理工作,而这一部分其实在真正工作中非常关键,因此本文将着重讲解数据准备的部分。 ## 2 获取数据 Neo4J提供了[多种方式](https://neo4j.com/developer/data-import/ '导入数据到Neo4J')连接数据仓库: - 手动定义数据 - 导入CSV文件 - 使用API导入数据 - 从关系型数据库里导入数据 - 使用应用程序驱动连接导入数据(支持多种编程语言如.Net、Java、JavaScript、Go和Python等) 其中本人最为中意使用Python驱动导入数据,因为通常来说,可以先通过使用Python获取关系型数据库里的原始数据、做好处理后使用Neo4J的接口即可连接多个平台完成数据的传输工作。面对超大型数据集,使用PySpark还可以将计算性能进一步提高,Neo4J也提供了[PySpark的接口](https://neo4j.com/docs/spark/current/python/ 'Neo4J PySpark接口'),读写速度都非常快,以下是PySpark示例代码,请注意使用前需要下载对应[PySpark版本的Neo4J连接器Jar文件](https://github.com/neo4j-contrib/neo4j-spark-connector/releases 'Neo4j Connector for Apache Spark')。
Neo4J连接信息
```Python # 读Neo4J的数据 # 将账号密码替换成自己设置的即可 df = spark.read.format("org.neo4j.spark.DataSource")\ .option("url", "bolt+s://63d2d43273493b399454b26961152ed9.neo4jsandbox.com:7687")\ .option("authentication.type", "basic")\ .option("authentication.basic.username", "neo4j")\ .option("authentication.basic.password", "password")\ .option("labels", "Person")\ .load() display(df) # 写数据到Neo4J df2 = spark.createDataFrame( [(1, "John"),(2, "Thomas")], ["id", "name"] ) df2.write.format("org.neo4j.spark.DataSource")\ .option("url", "bolt+s://63d2d43273493b399454b26961152ed9.neo4jsandbox.com:7687")\ .option("authentication.type", "basic")\ .option("authentication.basic.username", "neo4j")\ .option("authentication.basic.password", "password")\ .option("labels", ":Person")\ .option("node.keys", "id")\ .mode("Overwrite")\ .save() ``` 切记,在加载数据前[定义Index](https://neo4j.com/docs/cypher-manual/current/indexes-for-search-performance/ 'Indexes for search performance'),这一操作会显著提升程序运行速度。 ## 3 定义节点和关系
节点与关系
如图所示,彩色的圆圈代表着节点,节点之间的连线是其关系。直观来说,原始数据是一张表,它含有一些与目标有关的字段,而每个字段即对应这一个实体(节点)。 | Mule | Phone | Email | |------|-----------|-----------------| | John | 888888888 | demo@gmail.com | | Tim | 777777777 | demo2@gmail.com | 节点可以用上述代码写入Neo4J,实体与实体之间的关系[可用Cypher定义](https://neo4j.com/docs/cypher-manual/current/clauses/create/#create-relationships '在Neo4J创建关系'),如John拥有自己的邮箱可以用如下方式定义: ```sql MATCH (a:Mule), (b:Email) WHERE a.Email = b.Email CREATE (a)-[r:HAS_EMAIL]->(b) RETURN type(r) ``` 以此类推,对目标有用的关系都可以用这种方式进行定义。 ## 4 数据总览 反欺诈示例的第一部分对数据进行了描述性分析,如节点数量、关系数量等信息,这有利于帮助理解数据、检查数据完整性,确保你所需要的数据都按照设定的目标存入了Neo4J,该模块内容比较直观,不做过多赘述。
描述性分析
## 5 总结 本文解决了很多图数据库初学者最初的疑惑,如何将数据(通常是表格)导入Neo4J,并且定义服务于目标的节点与关系。毫无疑问,这是后续分析工作的基础,之后就可以正式对这些数据进行反欺诈的分析了。希望这次的分享对你有帮助,欢迎在评论区留言讨论!