精华 neo4j-admin批量导入
发布于 4 年前 作者 pangguoming 3158 次浏览 来自 分享

当需要导入大量的数据时,可以使用neo4j自带的neo4j-admin import工具来进行批量导入,但是该种方式只能用来导入一个全新的数据库,也就是建库的时候来使用。该种导入方式的数据来源是csv文件,下面会具体通过实例来介绍整个的流程,

1、首先我们需要准备导入的csv文件

我们知道neo4j中的数据主要分为节点数据和关系数据,那么csv文件中也就分为节点文件和关系文件。

当系统要导入csv文件的时候,读取文件的第一行必需是数据域信息,用来表示该文件中各列的具体意思,当csv文件是节点文件的时候,必要要包含的是ID域(:ID),用来表示节点的id信息,当csv文件是关系文件的时候,必需包含的是(:START_ID),(:END_ID),(:TYPE)分别用来表示关系的开始节点id,结束节点id和关系类型。

图1是节点csv文件的数据域信息,数据域的定义方式<name>:<ID/type>,这里定义了3个属性,其中movieId是之后用来创建关系的id, :LABEL是可选项,用来对节点来进行标记,当一个节点有多个标签的时候,可以采用;来进行分割,例如:电影;喜剧。

image.png

图2是节点csv文件的具体数据信息,这里需要注意的就是数据域和数据的对应关系,并且ID域中的信息必需是全局唯一的,这个全局唯一后面会进一步讲解。这样我们就准备好了电影节点csv文件。

image.png 类似,图3是演员节点csv文件的数据域和数据。 image.png 图5是关系csv文件的数据域,数据域必需包含(:START_ID),(:END_ID),(:TYPE)这三个,分别用来表示开始节点、结束节点和类型。 image.png 图6是关系csv文件的具体数据信息。 image.png 这里需要注意,数据的头和内容可以分别写在两个不同的csv文件中,也可以写在一个文件中,当一个头信息只是对应一个内容信息的时候,可以考虑写在一个文件,当一个头信息对应多个内容信息文件的时候,可以考虑将头文件放在一个单独的文件中。我这里是将头文件和内容文件分开来表示。

2、将数据导入到数据库中

导入数据的具体命令如下:

neo4j-admin import [–mode=csv] [–database=<name>]

[–additional-config=<config-file-path>]

[–report-file=<filename>]

[–nodes[:Label1:Label2]=<“file1,file2,…”>]

[–relationships[:RELATIONSHIP_TYPE]=<“file1,file2,…”>]

[–id-type=<STRING|INTEGER|ACTUAL>]

[–input-encoding=<character-set>]

[–ignore-extra-columns[=<true|false>]]

[–ignore-duplicate-nodes[=<true|false>]]

[–ignore-missing-nodes[=<true|false>]]

[–multiline-fields[=<true|false>]]

[–delimiter=<delimiter-character>]

[–array-delimiter=<array-delimiter-character>]

[–quote=<quotation-character>]

[–max-memory=<max-memory-that-importer-can-use>]

[–f=<File containing all arguments to this import>]

[–high-io=<true/false>]

这里我还是通过例子来讲解:

目前我手头的文件包括:

—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代表如果某属性中的数据内容有多行时,可以成功导入。

image.png image.png 如图提示,导入成功。

3、通过浏览器查看导入的数据

启动数据库,通过浏览器查看导入的数据情况,可以看出,数据已经全部导入成功了。 image.png 4、注意事项:

4.1、:ID字段的内容在全部导入文件中不能有任何的重复。

4.2、该导入方式适合大规模数据的初始化建库,如果是要增量数据导入或者数据规模不大,可以考虑其他的导入方式。可以看到,对于1000多万个节点,导入也就2分钟不到的时间。 image.png

作者:玻璃瓶外的水 链接:https://www.jianshu.com/p/3acbf66bd0d0

1 回复
回到顶部