在 Docker 上运行的 RDBMS 数据库中执行 Neo4j ETL
下面提供了一些示例,演示如何使用 Neo4j ETL 工具的命令行界面将测试 CSV 数据导入 Neo4j,源 RDBMS 数据库运行在 Docker 中。此处的示例特定于在 macOS 主机上进行的测试,但其他操作系统的流程类似。
步骤 1:设置
获取 ETL CLI 工具的 zip 或 tar.gz 包。命令行工具可在 https://github.com/neo4j-contrib/neo4j-etl/releases/latest 下载。如果将 ETL 用作 Neo4j Desktop 应用程序,请将来自 dev-rel 的 ETL 许可证密钥添加到 Neo4j Desktop 应用程序中。
获取最新的 mssqljdbc 驱动程序版本:https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017,relevant,用于源 RDBMS 数据库。测试中成功使用了 Sql-jdbc 6.0、6.2 和 6.4 版本。
步骤 2:设置测试 RDBC 数据库。
本例使用 MSSQL Server。其他数据库非常相似。
可以将 MSSQL Server 作为 Docker 容器运行,也可以作为独立应用程序运行。本文档的范围仅限于 Docker。服务器应用程序的 UI 提供更直接的过程,但其可用性和安装并不总是所需的。
-
安装 Docker。以下是安装过程
-
拉取 MSSQL Server 容器镜像:
sudo docker pull microsoft/mssql-server-linux:2017-latest -
运行 MSSQL Server 容器
$ sudo docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Neo4j1234' \
-p 1433:1433 --name sql1 \
-d microsoft/mssql-server-linux:2017-latest
这将在 localhost:1433 上创建并初始化一个名为 sql1 的 MSSQL Server 容器。密码必须符合 MSSQL Server 默认密码策略(除非另行指定),否则容器将无法启动。
-
检查容器是否已启动并运行:
sudo docker ps -a。可通过docker logs sql1查看日志。 -
连接到上述 sql1 容器内的 MSSQL Server:
sudo docker exec -it sql1 "bash",需要输入 bash 密码。 -
在容器内启动 sqlcmd 实用程序以执行 TSQL 查询:
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Neo4j1234 -
进入 sqlcmd 后,使用 TSQL 创建数据库、模式以及使用该模式的临时表。
CREATE DATABASE TestDB;
-- created
SELECT Name from sys.Databases;
-
验证上面创建的 TestDB 是否在数据库列表中
CREATE SCHEMA testschema;
-
确认已创建模式
SELECT * FROM sys.schemas;
-
使用上面创建的 testschema 创建临时表。表的列将根据要导入该表的数据而定,随后使用 ETL 工具将其导出到 Neo4j。本例中,将包含随机天气数据的 CSV 上传到以下表(本文稍后会说明如何操作)。
CREATE TABLE testschema.weather
(ID int,
StationCode nvarchar(50),
Date date,
StationName nvarchar(50),
Tmax float,
Tmin float,
Tobs float,
Latitude float,
Longitude float,
Fy int);
-
现在需要将一些测试数据(或实际数据)导入上面创建的 weather 表(或您想要的表)。在 Docker 中, 在 sqlcmd 提示符之外(可以在另一个终端窗口),执行以下命令:
docker cp /Users/user/Desktop/weather.txt sql1:/,其中 weather.txt 是待导入的 CSV 文件名,/Users/user/Desktop/ 是该文件的目录路径,sql1 是 Docker 容器的名称。此操作会将 weather.txt 文件从主机系统复制到 Docker 容器中。 -
随后可以使用 SQL 的 Bulk Insert 过程将 CSV 映射并导入到我们 TestDB 的 weather 表中。为此,请在 sql1 容器内的 sqlcmd 提示符下执行以下操作
BULK INSERT testschema.weather from '/weather.txt' with (FIRSTROW=2, fieldterminator = ',', rowterminator = '0x0a');
步骤 3:使用 Neo4j ETL CLI 将关系数据导出到 Neo4j
使用 Neo4j ETL 将 testschema.weather SQL 表的内容导入 Neo4j 的 graph.db。此步骤还需要正确版本的 JDBC 驱动程序。已使用 mssql-jdbc 6.0、6.2 和 6.4 版本进行测试。ETL 过程本质上需要指定 JDBC jar 文件(本例中为 mssql-jdbc-6.2.2.jre8.jar)及其路径。
-
使用 Neo4j ETL CLI 工具,首先需要生成映射文件。本例中,映射文件名为
mssql_TestDB_mapping,放置在/$NEO4j_HOME/import。可以为导入指定额外选项,例如 “Multiline support”,以便 neo4j-import 能处理包含字段换行的 CSV 行。导入命令中必须指定该选项文件的路径。以下是用于生成导入映射文件的示例命令
$ ./neo4j-etl generate-metadata-mapping \
--rdbms:url "jdbc:sqlserver://:1433;databaseName=TestDB" \
--rdbms:schema "TestDB.testschema" \
--rdbms:user sa \
--rdbms:password Neo4j1234 \
--output-mapping-file "/$NEO4j_HOME/import/mssql_TestDB_mapping.json" \
--debug \
--force \
--using "bulk:neo4j-import" \
--options-file "/$NEO4j_HOME/import/import-tool-options.json" \
--driver "/$NEO4j_HOME/import/jdbc drivers/6.2/sqljdbc_6.2/enu/mssql-jdbc-6.2.2.jre8.jar" \
--mapping-file "/$NEO4j_HOME/import/mssql_TestDB_mapping"
-
随后执行实际的导入操作,使用前一步生成的映射文件
$ ./neo4j-etl export \
--rdbms:url "jdbc:sqlserver://:1433;databaseName=TestDB" \
--rdbms:user "sa" \
--rdbms:password "Neo4j1234" \
--destination "/$NEO4j_HOME/data/databases/graph.db" \
--import-tool "/$NEO4j_HOME/bin" \
--csv-directory "/$NEO4j_HOME/import/csv-008" \
--debug \
--force \
--using "bulk:neo4j-import" \
--options-file "/$NEO4j_HOME/import/import-tool-options.json" \
--driver "/$NEO4j_HOME/drivers/jdbc drivers/6.2/sqljdbc_6.2/enu/mssql-jdbc-6.2.2.jre8.jar"\
--mapping-file "/$NEO4j_HOME/import/mssql_TestDB_mapping.json" \
--rdbms:schema "TestDB.testschema"
完成!
以下是附加资源
资源
此页面有帮助吗?