我第一次建立关联图谱用的是 R语言 ,通过写代码帮公安 挖掘团伙犯罪 ,并用图形展示团伙之间的关联关系。
如有需要请关注本公众号的后续文章,会手把手教大家用R搭建关联图谱,做成app,让没有安装R的电脑通过你分享的网址链接看到罪犯的关联关系。
公司最近又有挖掘团伙犯罪的项目,这次想在关联关系的基础上 利用 模型算法 寻找犯罪团伙。 这一次选用的是基于java实现的开源图数据库 neo4j 和 Python ,搭建关联图谱。
由于在导入数据时碰到了很多坑,为了避免大家再次踩坑浪费时间,本文详细介绍向neo4j中导入数据的两种方法。后续文章会探讨
社群发现算法
在关联图谱中的应用,欢迎持续关注。
本文目录
- 删除数据库中的数据
- 用load csv方法导入数据
2.1 导入点的数据
2.2 创建索引
2.3 导入关系数据
2.4 创建好的关联图 3. 用neo4j-admin import方法导入数据
3.1 删除graph.db目录下的所有文件
3.2 停止neo4j
3.3 导入数据
3.4 启动neo4j查看数据
一、删除数据库中的数据
向neo4j中导入数据,有些方法要求数据库中没有数据,有些方法可以累加导入数据 , 所以 这一步不是必须操作 。
删除数据库中的数据,我常用以下两种方法:
#删除数据方法一
match (n) detach delete n
#删除数据方法二
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
接下来详细阐述两种导入数据的方法,选一种你需要的方法导入数据吧。
二、用load csv方法导入数据
如果想要增量数据同步加载,又不想暂停数据库服务,可以使用load csv向neo4j中导入数据。
1 导入点的数据
把数据放在neo4j安装目录下的import文件夹中(D:\neo4j\neo4j-community-3.5.5\import)—需找到你对应的目录,具体node_gzh.csv的数据格式如下:
注:如需本文导入的所有原数据可到公众号中回复 “neo4j导入数据” ,即可免费获取。
如果数据中有中文,要把csv数据的编码设置成utf-8,不然导入到neo4j中去中文会变成乱码。
我一般用Notepad++打开要导入的数据,把数据编码转为UTF-8格式,在neo4j中就可以正常显示中文了。
在neo4j中运行如下语句:
using periodic commit 10000 load csv with headers from "file:/node\_gzh.csv" as line with line create (:gzh {item:line.item, trans\_amount\_sum:line.trans\_amount\_sum, trans\_cnt:line.trans\_cnt, type:line.type});
说明:
- using periodic commit的作用是分段式创建顶点,可以理解为指定读取多少行后就写入数据库。我这里设置成每读取10000行就写入数据库,防止溢出内存导致的错误。
- create语句可以替换成merge,防止导入的数据重复。
- gzh代表节点的标签名称。
- item、trans_amount_sum等代表节点的属性。
本文导入26077个点的数据,用load csv的方法用时1393ms(1.393秒),所以千万及以下级别的数据用load csv的方式还是可以的。
2 创建索引
为了加快关系的创建,我把item这一列设置成了索引。
CREATE INDEX ON :gzh(item)
3 导入关系数据
同样把数据放到import文件夹下,数据格式如下:
运行如下语句:
using periodic commit 10000 load csv with headers from "file:/node\_rela\_gzh.csv" as line match (from:gzh {item: line.item\_l}),(to:gzh {item:line.item\_r}) merge (from)-[c:gzh{relation:line.relation}]-(to)
说明:
- (from:)和(to:)可以分别看成两个点。
- gzh代表之前创建点的标签。
- item表示根据点的item属性进行匹配创建关系。
- item_l和item_r分别代表关系数据中匹配的左边点和右边点。
- [c:gzh]代表点和点之间的关系,关系的属性是relation,如果有多个属性可以用逗号隔开,创建多个。
本文导入147103行关系数据,用load csv方法耗时21789ms(21.789秒)。
4 创建好的关联图
导入好点和关系数据后,在浏览器中打开neo4j,即可看到导好的数据。由于数据样本较多,我选取了其中一簇(43个点之间的关系),作为展示。
三、用neo4j-admin import方法导入数据
如果数据上亿,用load csv方法导入数据较慢,可以用neo4j-admin import方法导入数据。
1 删除graph.db目录下的所有文件
我用delete语句删除所有点和关系,尝试用import方法导入数据时报错。查了下发现Neo4j根目录下data/databases/graph.db 中不能有文件,即初始化导入时要求数据库为空。
2 停止neo4j
在导入数据之前neo4j应当关闭,处于stop状态。可以在Neo4j的根目录下(我的是D:\neo4j\neo4j-community-3.5.5)打开cmd,运行“.\bin\neo4j stop”即可。
3 导入数据
在Neo4j的根目录neo4j-community-3.5.5文件夹中打开cmd,运行如下语句:
.\bin\neo4j-admin import --mode csv --database graph.db --nodes:mer "D:/neo4j/neo4j-community-3.5.5/import/node\_gzh\_1.csv" --relationships:ACTED\_IN "D:/neo4j/neo4j-community-3.5.5/import/node\_rela\_gzh\_1.csv" --ignore-extra-columns=true --ignore-missing-nodes=true --ignore-duplicate-nodes=true
说明:
- --database graph.db表示把数据导入到graph数据库中去。
- --nodes:mer表示导入点的数据。
- --relationships:ACTED_IN表示导入关系数据。
- --ignore表示忽略缺失值、重复点。
- 本文导入点和关系时输入的都是绝对路径。
- 当数据过大时可以把数据和头部分开保存,格式一样时,下次导入数据只要修改头部即可。
注意:保存点的csv必须包含ID域(:ID),用来表示节点的id信息。保存关系的csv必须包含(:START_ID)(:END_ID),分别表示关系的开始节点id和结束节点id。
为了大家理解得更透彻,下面展示点的前几行和关系的前几行。
点的前几行:
关系的前几行:
如果cmd中出现如下语句说明数据导入成功:
注:如需本文导入的所有原数据可到公众号中回复**“neo4j导入数据”** ,即可免费获取。
本文导入2万多点的数据,22万左右的关系数据,总共用了4秒多的时间。可以发现比之前的load csv速度要快。
4 启动neo4j查看数据
在cmd中运行.\bin\neo4j start,即可启动neo4j。在浏览器中打开neo4j,可以看到neo4j中创建好的关联图谱。
这两种导入方法基本可以满足需求。千万以下的数据用load csv方式增量导入数据,千万以上的数据用import方法初始化建库,也可以结合使用两种方法。
其它方法比如create(速度太慢慎用)、Batch-import、Apoc等,感兴趣的可以自己尝试一下。
参考文献
https://www.cnblogs.com/jpfss/p/11395858.html
https://blog.csdn.net/zfqbd/article/details/78808678
https://blog.csdn.net/u013946356/article/details/82629014
https://blog.csdn.net/shuibuzhaodeshiren/article/details/88559383
https://zhuanlan.zhihu.com/p/93746655?utm_source=wechat_session&utm_medium=social&utm_oi=1090367802518536192&utm_content=first
往期回顾:
扫一扫关注我
19967879837
投稿 微信号、手机
