neo4j中导入数据的两种常用方式(千万级和亿级)
我第一次建立关联图谱用的是R语言,通过写代码帮公安挖掘团伙犯罪,并用图形展示团伙之间的关联关系。
如有需要请关注本公众号的后续文章,会手把手教大家用R搭建关联图谱,做成app,让没有安装R的电脑通过你分享的网址链接看到罪犯的关联关系。
公司最近又有挖掘团伙犯罪的项目,这次想在关联关系的基础上利用模型算法寻找犯罪团伙。这一次选用的是基于java实现的开源图数据库neo4j和Python,搭建关联图谱。
由于在导入数据时碰到了很多坑,为了避免大家再次踩坑浪费时间,本文详细介绍向neo4j中导入数据的两种方法。后续文章会探讨社群发现算法在关联图谱中的应用,欢迎持续关注。
本文目录
- 删除数据库中的数据
- 用load csv方法导入数据 2.1 导入点的数据 2.2 创建索引 2.3 导入关系数据 2.4 创建好的关联图
- 用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:neo4jneo4j-community-3.5.5import)—需找到你对应的目录,具体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:neo4jneo4j-community-3.5.5)打开cmd,运行“.binneo4j stop”即可。
3 导入数据
在Neo4j的根目录neo4j-community-3.5.5文件夹中打开cmd,运行如下语句:
.binneo4j-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中运行.binneo4j 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
- 用ggplot2画了一个我也叫不上名的炫酷图表
- React技巧8(不再手动绑定this,跟.bind(this)说88)
- 美美的商务范儿——ggplot2蝴蝶图
- 机器学习(三)使用Python和R语言从头开始理解和编写神经网络介绍目录神经网络背后的直观知识多层感知器及其基础知识什么是激活函数?前向传播,反向传播和训练次数(epochs)多层感知器全批量梯度下降
- React第三方组件2(状态管理之Refast的使用⑤LogicRender使用)
- 左右用R右手Python9——字符串合并与拆分
- hdu 1003 Max Sum(最大子窜和)
- React第三方组件2(状态管理之Refast的使用④中间件middleware使用)
- 高维分面应用——ggplot2分面气泡图饼图
- poj 1579 Function Run Fun
- React第三方组件2(状态管理之Refast的使用③扩展ctx)
- 财经小知识——CRS风暴与全球离岸金融中心
- The Triangle
- React第三方组件2(状态管理之Refast的使用②异步修改state)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 收款神器!解读聚合收款码背后的原理
- 短视频商城源码,滑动时渐变效果实现
- CICD实战——服务自动测试
- MySQL 案例:left join 与 BUG
- WordPress缩略图出现A TimThumb error has occured解决办法
- 2020-09-30:谈谈内存对齐。
- leetcode树之对称二叉树
- 【网络技术联盟站】网络安全 | 瑞哥带你全方位解读防火墙技术!
- 腾讯云服务器CVM+CentOS,部署LAMP环境快速搭建WordPress博客
- leetcode栈之有效的括号
- JSON Web Token 的结构是什么
- codeforces 1429E(dp)
- Linux Ubuntu 安装 Fish Shell 教程以及配置和使用方法
- 2020-10-02:golang如何写一个插件?
- Kubernetes 1.19.0——健康性检查