知识库

在 Docker 上运行的 RDBMS 数据库中执行 Neo4j ETL

下文提供了一些使用 Neo4j ETL 工具的命令行界面,将测试 CSV 数据导入 Neo4j 的示例,其中源 RDBMS 数据库运行在 Docker 上。本文中的示例是针对在 MAC OSX 主机上进行的测试,但其他操作系统的过程类似。

步骤 1:设置

以 zip 或 tar.gz 格式获取 ETL 命令行工具。该命令行工具可在 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 命令行工具将关系数据导出到 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 命令行工具,首先需要生成一个映射文件。在此例中,它被命名为 mssql_TestDB_mapping,并选择将其放置在 /$NEO4j_HOME/import 目录下。可以为导入指定其他选项,例如“多行支持”,以便 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"

大功告成!

更多资源如下

资源

© . All rights reserved.