2.5.1 ETL导入工具的使用
Neo4j ETL(Extract-Transform-Load)导入工具可以帮助开发人员轻松地将数据从关系数据库导入到图数据库中。它包括以下3个简单的步骤:
步骤01 通过JDBC设置指定源关系数据库。
步骤02 使用图形化的编辑工具建立数据模型映射。
步骤03 运行生成的脚本将所有数据导入到Neo4j。
ETL工具有两个版本:Desktop版本和命令行版本。
2.5.1.1 Desktop版本ETL工具的导入
启动Neo4j Desktop后,单击“Add Application”打开应用安装界面,如图2-68所示。

图2-68 添加应用
在应用安装界面中选择“Neo4j ETLTool”项,开始自动安装,安装完成后单击“Close”按钮关闭应用安装界面,如图2-69所示。

图2-69 添加ETL工具
返回Neo4j Desktop界面上就可以看到Neo4j ETL Tool工具,然后单击就可以启动,如图2-70所示。

图2-70 Neo4j ETL Tool工具
2.5.1.2 压缩包版本命令行ETL工具的安装
压缩包版本的ETL工具需要到GitHub下载,地址为:https://github.com/neo4j-contrib/neo4j-etl/releases,如图2-71所示。

图2-71 ETL压缩包版下载
下载解压后的目录如图2-72所示。

图2-72 ETL压缩包内容
在lib文件夹中有ETL的jar包,我们可以通过bin文件夹中的neo4j-etl.cmd脚本来启动。
2.5.1.3 使用ETL工具从关系数据库导入数据
接下来,我们需要建立一个关系数据库连接。支持JDBC驱动程序的关系数据库,ETL工具也都支持,包括MySQL、PostgreSQL、Oracle、Cassandra、DB2、SQL Server、Derby等。虽然ETL工具只内置支持MySQL和PostgreSQL数据库,但可以通过指定驱动程序文件来轻松地支持所有其他数据库。
本节将以SQL Server 2008为例,来展示导入操作,其他数据库与之类似。
首先我们在关系数据库中准备待导入的数据表。
注意:因为我们除了要导入节点数据外,我们还要导入关系数据,因此需要在关系数据库中创建“外键”约束来实现图数据库中的“关系”。
在本例中,我们将采用“人员”→“角色”之间多对多的关系,因此除了人员表、角色表之外,我们还需要一个“中间表”来保存多对多关系,如图2-73所示。

图2-73 SQL Server数据库表结构
我们先创建表结构,sys_user表主键为user_id,sys_role表主键为role_id,中间关系表sys_role_user将通过创建同名字段来与sys_user表、sys_role表建立外键约束。
①sys_role表的创建语句如下:

②sys_user表的创建语句如下:

③中间关系表的创建语句如下:

接下来我们准备表的数据。
注意:不要用id作为字段名,而是用user_id、role_id来代替。
图2-74所示是sys_role表的数据,其中role_id列的数据很关键。

图2-74 sys_role表数据
图2-75所示是sys_user表的数据,其中user_id列的数据很关键。

图2-75 sys_user表数据
图2-76所示是sys_role_user表的数据,其中user_id、role_id列的数据很关键。

图2-76 sys_role_user表数据
2.5.1.4 配置ETL工具开始导入
如图2-77所示,在ETL工具界面上单击“ADD CONNECTION”按钮。

图2-77 添加ETL连接
填写如图2-78所示的连接SQL Server数据库的参数,最后单击“TEST AND SAVE CONNECTION”按钮。
注意:
(1)要先准备好驱动包,驱动包下载地址:https://github.com/neo4j-contrib/neo4j-etl。
(2)Schema输入框需要输入SQL Server的[数据库名].[dbo]。

图2-78 ETL连接配置
然后提示添加连接成功,我们选中刚创建的连接,单击“START MAPPING”按钮创建映射,如图2-79所示。

图2-79 ETL映射(1)
创建映射成功后,选中需要导入的Neo4j数据库,再单击“NEXT”按钮,如图2-80所示。

图2-80 ETL映射(2)
接下来,可以在NODES、RELATIONSHIP选项卡中编辑节点、关系的字段数据类型映射,如图2-81~图2-83所示。

图2-81 ETL映射编辑节点
Neo4j ETL App会根据源数据库模式决定基本的数据映射,规则如下:
● 拥有1个外键的表会映射成节点和其上的关系。
● 拥有2个外键的表会被当作是关系表映射成关系。
● 拥有多于2个外键的表会被当作中间表处理,映射成拥有多个关系的节点。

图2-82 ETL映射编辑关系

图2-83 ETL映射编辑属性
编辑完映射后单击“SAVE”按钮,再单击“NEXT”按钮,如图2-84所示。

图2-84 ETL映射配置完成
最后在导入界面设置每次导入的条数,ETL将分次导入,如图2-85所示。

图2-85 ETL开始自动导入
单击“IMPORT DATA”按钮后,请一直等待,直到提示导入成功,然后就可以到Neo4j中查询是否真的导入成功了,如图2-86所示。

图2-86 ETL导入成功
2.5.1.5 压缩包版命令行ETL工具的导入
在本例中,我们将不使用下载解压bin文件夹下的脚本,而是编写自己的导入脚本。准备工作如下:
(1)在E盘创建一个ETL文件夹,保存我们下载的jdbc驱动jar文件。
(2)确保Java环境变量设置正确,可以在命令行输入java命令进行确认。
(3)最好使用管理员角色运行命令行。
(4)在本例中,我们将下载后的压缩包解压到D:\software\文件夹中;然后将在E:/etl文件夹下准备import-tool-options.json文件,内容为:{"multiline-fields":"true"},如图2-87所示。

图2-87 准备参数脚本
将编写并运行导入脚本。脚本参数的说明文档位于:https://neo4j-contrib.github.io/neo4j-etl/#neo4j-etl-cli。以下是导入的脚本实例:

命令执行结果如图2-88所示。

图2-88 运行脚本
运行完毕后,我们到目标文件夹即E:/ etl下查看导入后的数据文件,如图2-89所示。

图2-89 导入后的数据文件
其中,csv-001文件夹下是生成的映射文件,如图2-90所示。logs文件夹下是日志文件。graph.db文件夹下是导入成功的数据库文件。

图2-90 生成的映射文件
最后我们把graph.db文件夹替换掉Neo4j安装目录下的\data\databases下的同名文件夹后,再启动Neo4j实例就发现导入成功了。