neo4j的导入方案

仅供学习交流,如有错误请指出,如要转载请加上出处,谢谢

概述

Neo4j是一种强大的,可扩展的和高性能的图形数据库,由边,属性和节点组成,是用来描述节点与节点之间的关系,由位于美国旧金山的Neo技术公司进行开发和维护,它属于NoSql的范围内,在一些社交的项目中处理人与人或物之间的关系挥发这巨大的作用,以下列举它的一些特点

  • 支持ACID事务
  • 高可用性
  • 可扩展到数十亿的节点和关系
  • 高效且快速的遍历查询(图的遍历)
  • 强大的结构化查询语言Cypher

导入方案

如果你想选择Neo4j作为你的处理关系的数据库,首先处理的问题就是导入外部数据,将MySQL,Oracle或者PostgreSQL的关于用户的关系数据导入Neo4j中,这里有两种导入数据的方式:

1. LOAD CSV

LOAD CSV是Cypher语言的指令,是将csv文件中的属性插入Neo4j中,首先先将原数据库的数据导出成csv文件,以电影信息为例,导出CSV文件如下:

movies.csv

1
2
3
4
id,title,country,year
1,Wall Street,USA,1987
2,The American President,USA,1995
3,The Shawshank Redemption,USA,1994

Neo4j提供了一个WEB端的客户端系统,利用可视化的方式展示节点与节点的关系,在上面可以利用Cypher语言对数据进行操作,代码如下:

1
2
3
4
LOAD CSV WITH HEADERS FROM "CSV地址" AS csvLine
MERGE (country:Country { name: csvLine.country })
CREATE (movie:Movie { id: toInt(csvLine.id), title: csvLine.title, year:toInt(csvLine.year)})
CREATE (movie)-[:MADE_IN]->(country)

上面的意思是创建country和movie节点,然后将country和movie建立MADE_IN的关系,这样就将csv的数据导入了Neo4j中了,LOAD CSV指令导入的形式只是相当于多个CRATE指令,通过繁杂的JAVA程序向硬盘写数据,所以只是适于小数据量的导入

注意:csv中属性的数据都是String类型的,Neo4j是由JAVA写的,每个属性是有类型的,所以内置了toInt这样的类型转换方法

2. neo4j-import

neo4j内置了一个批量导入的脚本,存储在/BIN目录下的neo4j-import.bat,它直接在数据库存储文件目录中生成你所需创建节点和关系文件,所以它的限制也很多,第一点是导入前,还没有创建数据库,讲白了只能是第一次导入才有效,第二点是节点和关系要分开导入就是要额外进行导出存储关系的csv,第三点是如果不进行强制指定类型,每个节点(包括不同类型的节点)的id不能相同,

movie.csv

1
2
3
4
id,title,year
1,Wall Street,1987
2,The American President,1995
3,The Shawshank Redemption,1994

country.csv

1
2
3
4
id,name
4,USA
5,CHINA
6,UK

MADE_IN.csv

1
2
3
4
:START_ID,:END_ID
1,4
2,5
3,6

(1)由于配置文件的默认读取的位置在import中,所以导出的csv格式的文件要存储在neo4j存储目录下的import目录
(2)使用neo4j-import工具,在neo4j的bin目录下执行以下的指令

1
neo4j-import --into ../data/databases/graph.db --id-type string --nodes:movie ../import/movie.csv --nodes:country ../import/country.csv --relationships:MADE_IN ../import/MADE_IN.csv --multiline-fields=true --skip-bad-relationships=true --bad-tolerance=2000

这样就完成了neo4j的批量导入了,大约1000万的数据量,十几分钟就完成了

注意:在导入过程中有可能遇到如下错误
(1)./data/databases/graph.db already contains a database错误,表示graph.db已经包含了一个数据库,需要将其删除才能导入
(2)Duplicate input ids that would otherwise clash can be put into separate id space,表示有ID重复,按提示查询
(3)panic called,so exiting表示出现特殊符号,可检查列中可含有特殊符号

–multiline-fields=true :多行导入
–skip-bad-relationships=true:过滤错误的关系不导入,可以在log中查看
–bad-tolerance=2000:错误的最大限制在2000个