图数据库Neo4j搭建以及大批量数据导入
2018-09-13 本文已影响809人
薛云龙
最近在搞风控相关的事情,有幸参与了Neo4j的搭建以及数据导入的过程。
构建容器
docker环境下安装:这里说明下,默认将容器的/data,/var/lib/neo4j/import目录映射到宿主机。/data存储的是数据,/var/lib/neo4j/import存储的是你想要导入数据的
docker run \
--publish=7474:7474 --publish=7687:7687 \
--volume=/data/neo4j/data:/data \
--volume=/data/neo4j/import:/var/lib/neo4j/import \
--env=NEO4J_dbms_memory_pagecache_size=2G \
--env=NEO4J_dbms_memory_heap_max__size=8G \
--name=neo4j \
-d neo4j
数据导入
初次进行大批量数据的导入有很多方式,但是每种方式都会有自己的局限性。这里是官网文档。另外,我大概分析了一下,
cypher-shell load csv
- 通过cypher-shell命令行直接导入数据。这样的方式,可以不停用neo4j服务,直接导入到库中。
#load node csv
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:/nodes.csv" AS csvLine
CREATE (c:Contact { mobile:csvLine.mobile, name:csvLine.name, updateTime:csvLine.updateTime, createTime:csvLine.createTime });
USING PERIODIC COMMIT 1000,是满足1000条之后,提交一个事务,这样能够提高效率。
2.导入节点之后,我们必然会导入关系。这里就有个坑,如果你在node节点的库里,没有创建index,那么导入关系的时候,将会慢的要死。
创建索引之前,我们插入的节点数据有可能会有重复的情况,我们需要先清除一下重复数据。
MATCH (n:Contact)
WITH n.mobile AS mobile, collect(n) AS nodes
WHERE size(nodes) > 1
FOREACH (n in tail(nodes) | DETACH DELETE n);
#创建索引
CREATE CONSTRAINT ON (c:Contact) ASSERT c.mobile IS UNIQUE;
CREATE INDEX ON :Contact(mobile);
3.接下来,我们开始导入关系数据
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:/rels.csv" AS csvLine
MATCH (c:Contact {mobile:csvLine.mobile1}),(c1:Contact {mobile:csvLine.mobile2})
CREATE (c)-[:hasContact]->(c1);
neo4j-admin(neo4j-import)方式
通过neo4j-admin方式导入的话,需要暂停服务,并且需要清除graph.db,这样才能导入进去数据。而且,只能在初始化数据时,导入一次之后,就不能再次导入了😂,很坑。。。
所以这种方式,可以在初次建库的时候,导入大批量数据,等以后如果还需要导入数据时,可以采用上边的方法
neo4j-import官方文档