最近在搞風控相關的事情,有幸參與了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官方文檔