[toc]
neo4j数据批量导入
目前主要有以下几种数据插入方式:(转自:如何将大规模数据导入Neo4j)
- Cypher CREATE 语句,为每一条数据写一个CREATE
- Cypher LOAD CSV 语句,将数据转成CSV格式,通过LOAD CSV读取数据。
- 官方提供的Java API —— Batch Inserter
- 大牛编写的 Batch Import 工具 (已经停止更新)
- 官方提供的 neo4j-import 工具(
https://neo4j.com/developer/guide-import-csv/#_super_fast_batch_importer_for_huge_datasets
)
这些工具有什么不同呢?速度如何?适用的场景分别是什么?我这里根据我个人理解,粗略地给出了一个结果:
这边重点来说一下官方最快的neo4j-import,使用的前提条件:
- graph.db需要清空,可以指定graph.db;
- neo4j需要停掉;
- 接受CSV导入,而且格式较为固定;
- 试用场景:首次导入
- 节点名字需要唯一,ID需要唯一
- 比较适用:首次导入,无法迭代更新
1 neo4j基本参数
1.1 启动与关闭:
bin\neo4j start
bin\neo4j stop
bin\neo4j restart
bin\neo4j status
1.2 neo4j-admin的参数:控制内存
1.2.1 memrec 是查看参考内存设置
neo4j-admin memrec [--memory=<memory dedicated to Neo4j>] [--database=<name>]
参考:
$neo4j-home> bin/neo4j-admin memrec --memory=16g
1.2.2 指定缓存–pagecache
还有–pagecache单条命令指定缓存:
bin/neo4j-admin backup --from=192.168.1.34 --backup-dir=/mnt/backup --name=graph.db-backup --pagecache=4G
指的是,再该条导入数据的指令下,缓存设置。
1.3 neo4j-admin的参数:Dump and load databases - 线下备份
执行该两步操作,需要关闭数据库。参考:10.7. Dump and load databases
dump过程:把graph.db转存到.dump 需要关闭数据库
$neo4j-home> bin/neo4j-admin dump --database=graph.db --to=/backups/graph.db/2016-10-02.dump
$neo4j-home> ls /backups/graph.db
$neo4j-home> 2016-10-02.dump
load过程:把.dumpload进来 好像可以不用关闭
$neo4j-home> bin/neo4j stop
Stopping Neo4j.. stopped
$neo4j-home> bin/neo4j-admin load --from=/backups/graph.db/2016-10-02.dump --database=graph.db --force
如果带–force,那么load之后,会更新所有的存在着的.db(any existing database gets overwritten. )
1.4 neo4j-admin的参数:backup and restore - 在线备份
参考:6.2. Perform a backup
在线备份backup :
$neo4j-home> export HEAP_SIZE=2G
$neo4j-home> mkdir /mnt/backup
$neo4j-home> bin/neo4j-admin backup --from=192.168.1.34 --backup-dir=/mnt/backup --name=graph.db-backup --pagecache=4G
backup 进临时文件夹之中。
追加备份:
$neo4j-home> export HEAP_SIZE=2G
$neo4j-home> bin/neo4j-admin backup --from=192.168.1.34 --backup-dir=/mnt/backup --name=graph.db-backup --fallback-to-full=true --check-consistency=true --pagecache=4G
2 简单demo
- movies.csv.
movieId:ID,title,year:int,:LABEL
tt0133093,"The Matrix",1999,Movie
tt0234215,"The Matrix Reloaded",2003,Movie;Sequel
tt0242653,"The Matrix Revolutions",2003,Movie;Sequel
其中,title是属性,注意此时需要有双引号;year:int也是属性,只不过该属性是数值型的; :LABEL与:ID一样生成了一个新节点,也就是一套数据可以通过:生成双节点
- actors.csv.
personId:ID,name,:LABEL
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor
- roles.csv.
其中,:LABEL非常有意思,是节点的附属属性,其中personId:ID一定是唯一的,:LABEL可以不唯一。 而且,载入之后,:LABEL单独会成为新的节点,而且是去重的。
:START_ID,role,:END_ID,:TYPE
keanu,"Neo",tt0133093,ACTED_IN
keanu,"Neo",tt0234215,ACTED_IN
keanu,"Neo",tt0242653,ACTED_IN
laurence,"Morpheus",tt0133093,ACTED_IN
laurence,"Morpheus",tt0234215,ACTED_IN
laurence,"Morpheus",tt0242653,ACTED_IN
carrieanne,"Trinity",tt0133093,ACTED_IN
carrieanne,"Trinity",tt0234215,ACTED_IN
carrieanne,"Trinity",tt0242653,ACTED_IN
其中,这个节点的属性,role没有标注:,role是属性,可以加双引号,也可以不加。最好是指定一下格式,譬如:int为数值型,还有字符型roles:string[]
linux执行:
neo4j_home$ bin/neo4j-admin import --nodes import/movies.csv --nodes import/actors.csv --relationships import/roles.csv
其中,之前老版本批量导入是:neo4j-import,现在批量导入是:neo4j-admin。
Twitter用户关系导入
- Twitter用户实体 twitter.csv
- Twitter用户关系 relation.csv
- 导入
./bin/neo4j-admin import --database twitter.db --nodes ./czg/twitter/twitter.csv --relationships ./czg/twitter/relation.csv
本文使用 文章同步助手 同步