当需要导入大量的数据时,可以使用neo4j自带的neo4j-admin import工具来进行批量导入,但是该种方式只能用来导入一个全新的数据库,也就是建库的时候来使用。该种导入方式的数据来源是csv文件,下面会具体通过实例来介绍整个的流程,
1、首先我们需要准备导入的csv文件
我们知道neo4j中的数据主要分为节点数据和关系数据,那么csv文件中也就分为节点文件和关系文件。
当系统要导入csv文件的时候,读取文件的第一行必需是数据域信息,用来表示该文件中各列的具体意思,当csv文件是节点文件的时候,必要要包含的是ID域(:ID),用来表示节点的id信息,当csv文件是关系文件的时候,必需包含的是(:START_ID),(:END_ID),(:TYPE)分别用来表示关系的开始节点id,结束节点id和关系类型。
图1是节点csv文件的数据域信息,数据域的定义方式
图2是节点csv文件的具体数据信息,这里需要注意的就是数据域和数据的对应关系,并且ID域中的信息必需是全局唯一的,这个全局唯一后面会进一步讲解。这样我们就准备好了电影节点csv文件。
类似,图3是演员节点csv文件的数据域和数据。
图5是关系csv文件的数据域,数据域必需包含(:START_ID),(:END_ID),(:TYPE)这三个,分别用来表示开始节点、结束节点和类型。
图6是关系csv文件的具体数据信息。
这里需要注意,数据的头和内容可以分别写在两个不同的csv文件中,也可以写在一个文件中,当一个头信息只是对应一个内容信息的时候,可以考虑写在一个文件,当一个头信息对应多个内容信息文件的时候,可以考虑将头文件放在一个单独的文件中。我这里是将头文件和内容文件分开来表示。
2、将数据导入到数据库中
导入数据的具体命令如下:
neo4j-admin import [--mode=csv] [--database=
[--additional-config=
[--report-file=
[--nodes[:Label1:Label2]=<"file1,file2,...">]
[--relationships[:RELATIONSHIP_TYPE]=<"file1,file2,...">]
[--id-type=
[--input-encoding=
[--ignore-extra-columns[=
[--ignore-duplicate-nodes[=
[--ignore-missing-nodes[=
[--multiline-fields[=
[--delimiter=
[--array-delimiter=
[--quote=
[--max-memory=
[--f=
[--high-io=
这里我还是通过例子来讲解:
目前我手头的文件包括:
---movieNode_header.csv电影节点头文件
---movieNode.csv电影节点内容文件
---personNode_header.csv演员节点头文件
---personNode.csv演员节点内容文件
---relationshipPM_header.csv关系头文件
---relationshipPM.csv关系文件
所有的文件我放在import目录中,采用命令:
neo4j-admin import --database=graph01.db --nodes "import/movieNode_header.csv,import/movieNode.csv" --nodes "import/personNode_header.csv,import/personNode.csv" --relationships "import/relationshipPM_header.csv,import/relationshipPM.csv" --multiline-fields=true
其中:
--database=graph01.db代表我要建立的数据库的名字为graph01.db,这里需要注意,graph01.db必需为全新的,如果该库已经存在的情况下,会无法导入。
--nodes代表要导入的文件为节点文件,当有多个导入文件的时候,使用,来进行隔开,当如果头文件是单独文件的时候,必需将其放在内容文件的前面,否则会无法导入。
---relationships代表要导入的文件为关系文件,当有多个关系文件导入的时候,使用,来进行隔开,当如果头文件是单独文件的时候,必需将其放在内容文件的前面,否则会无法导入。
--multiline-fields=true代表如果某属性中的数据内容有多行时,可以成功导入。
如图提示,导入成功。
3、通过浏览器查看导入的数据
启动数据库,通过浏览器查看导入的数据情况,可以看出,数据已经全部导入成功了。
4、注意事项:
4.1、:ID字段的内容在全部导入文件中不能有任何的重复。
4.2、该导入方式适合大规模数据的初始化建库,如果是要增量数据导入或者数据规模不大,可以考虑其他的导入方式。可以看到,对于1000多万个节点,导入也就2分钟不到的时间。