neo4j中导入数据的两种常用方式(千万级和亿级)

时间:2022-07-24
本文章向大家介绍neo4j中导入数据的两种常用方式(千万级和亿级),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

我第一次建立关联图谱用的是R语言,通过写代码帮公安挖掘团伙犯罪,并用图形展示团伙之间的关联关系。

如有需要请关注本公众号的后续文章,会手把手教大家用R搭建关联图谱,做成app,让没有安装R的电脑通过你分享的网址链接看到罪犯的关联关系。

公司最近又有挖掘团伙犯罪的项目,这次想在关联关系的基础上利用模型算法寻找犯罪团伙。这一次选用的是基于java实现的开源图数据库neo4jPython,搭建关联图谱。

由于在导入数据时碰到了很多坑,为了避免大家再次踩坑浪费时间,本文详细介绍向neo4j中导入数据的两种方法。后续文章会探讨社群发现算法在关联图谱中的应用,欢迎持续关注。

本文目录

  1. 删除数据库中的数据
  2. 用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: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});

说明:

  1. using periodic commit的作用是分段式创建顶点,可以理解为指定读取多少行后就写入数据库。我这里设置成每读取10000行就写入数据库,防止溢出内存导致的错误。
  2. create语句可以替换成merge,防止导入的数据重复。
  3. gzh代表节点的标签名称。
  4. 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)

说明:

  1. (from:)和(to:)可以分别看成两个点。
  2. gzh代表之前创建点的标签。
  3. item表示根据点的item属性进行匹配创建关系。
  4. item_l和item_r分别代表关系数据中匹配的左边点和右边点。
  5. [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

说明:

  1. --database graph.db表示把数据导入到graph数据库中去。
  2. --nodes:mer表示导入点的数据。
  3. --relationships:ACTED_IN表示导入关系数据。
  4. --ignore表示忽略缺失值、重复点。
  5. 本文导入点和关系时输入的都是绝对路径。
  6. 当数据过大时可以把数据和头部分开保存,格式一样时,下次导入数据只要修改头部即可。

注意:保存点的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