从运行在 Docker 上的 RDBMS 数据库执行 Neo4j ETL
以下提供了一些将测试 csv 数据导入 Neo4j 的示例,使用 Neo4j ETL 工具的命令行界面,数据源 RDBMS 数据库运行在 docker 上。本文中的示例特定于在 MAC OSX 主机上进行的测试,但其他操作系统的流程类似。
步骤 1:设置
获取 ETL CLI 工具作为 zip 或 tar.gz。命令行工具可在 https://github.com/neo4j-contrib/neo4j-etl/releases/latest 获取。如果将 ETL 作为 Neo4j 桌面应用程序使用,请将 dev-rel 提供的 ETL 许可证密钥添加到 Neo4j 桌面应用程序。
获取最新的 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 提供了一个更简单的过程,但是,这些 UI 的可用性和安装可能并不总是想要的。
-
安装 Docker。以下是安装过程
-
拉取 mssql 服务器容器镜像:
sudo docker pull microsoft/mssql-server-linux:2017-latest
-
运行 mssql 服务器容器
$ 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 服务器容器。密码应遵循 MSSQL Server 默认密码策略(除非指定了不同的策略),否则容器将无法启动。
-
检查容器是否已启动并正在运行:
sudo docker ps -a
。可以通过docker logs sql1
查看日志 -
连接到上面创建的 sql1 容器中的 mssql 服务器:
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);
-
现在需要将一些测试数据(或您的实际数据)导入到上面创建的天气表(或您想要的表)中。要在 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
中的天气表中。为此,请从 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。可以为导入指定其他选项,例如“多行支持”,以便 neo4j-import 可以处理字段中包含换行符的 csv 行。必须在导入命令中指定该选项文件的路径。以下是在生成导入映射文件时使用的示例命令
$ ./neo4j-etl generate-metadata-mapping \
--rdbms:url "jdbc:sqlserver://localhost: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://localhost: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"
就是这样!
其他资源如下
资源
此页面是否有帮助?