知识库

如何使用 Cypher 通过 JDBC 连接到 RDBMS

随着 Neo4j 3.x 中对 Java 存储过程的支持,您可以使用 Cypher 通过 JDBC 连接到 RDBMS。为此需要下载并安装 https://github.com/neo4j-contrib/neo4j-apoc-procedures

安装完 Neo4j APOC 套件后,下载对应 RDBMS 的 JDBC 驱动 .jar,并放入 $NEO4J_HOME\plugins\ 目录。对应的 JDBC 驱动可从 RDBMS 供应商处获取。例如:

供应商 下载位置 JDBC jar 文件

MySQL

https://dev.mysqlserver.cn/downloads/connector/j/

mysql-connector-java-5.1.34.jar

Postgres

https://jdbc.postgresql.ac.cn/

postgresql-9.4.1209.jar

Oracle

http://www.oracle.com/technetwork/database/features/jdbc/

ojdbc7.jar

在安装 APOC 并将 RDBMS 供应商的 .jar 复制到 $NEO4J_HOME\plugins\ 之后,重新启动 Neo4j。

apoc.load.jdbc 存储过程用于通过 JDBC 进行连接,需传入 2 个参数,即

connection string
SQL statement or table

“connection string”(连接字符串)取决于供应商,需要参考对应 RDBMS 的语法。“SQL statement or table name”(SQL 语句或表名)可以是例如 “select * from movies” 或直接写 “movies”。如果只提供表名,实际会执行 “select * from <table name>”。

下面的示例将连接到名为 proddb1 的 MySQL 数据库,使用用户 root 且密码为 football,查询 “movies” 表中 studio 列为 “MGM Studios” 的所有电影。随后基于这些符合条件的记录在 Neo4j 中创建电影节点,并为其设置 title 属性。

CALL apoc.load.jdbc('jdbc:mysql://:3306/proddb1?user=root&password=football','select title from movies where studio=\'MGM Studios\'') YIELD row
CREATE (n:Movies {name:row.title})

如果运行上述语句时出现类似以下的错误信息

No suitable driver found for jdbc:mysql://:3306/proddb1?user=root&password=football

可能需要先手动加载驱动,调用如下语句

call apoc.load.driver('com.mysql.jdbc.Driver')

其中 “com.mysql.jdbc.Driver” 为 MySQL JDBC 驱动的类名。

如果希望隐藏或别名化连接字符串,可以在 conf/neo4j.conf 中加入类似下面的参数

apoc.jdbc.myalias.url=jdbc:mysql://:3306/proddb1?user=root&password=football

这样上述 Cypher 语句即可改写为

CALL apoc.load.jdbc('myalias','select title from movies where studio=\'MGM Studios\'') YIELD row
CREATE (n:Movies {name:row.title})

需要注意的是,apoc.load.jdbc 调用仅提供通过 JDBC 与 RDBMS 的连接。第二个参数可以是任意 SQL 语句,包括可能会通过 UPDATE、DROP、TRUNCATE 等操作修改源数据库的语句。若有需要,建议使用仅拥有 SELECT 权限的用户连接到 RDBMS。

另外,从 JDBC 加载数据时要留意数据类型及必要的转换;例如 MySQL 支持原生 DATE 类型,而 Neo4j 并不支持。因而在导入包含 DATE 列的数据时,需要先将该值转换为字符串再写入 Neo4j。

© . This site is unofficial and not affiliated with Neo4j, Inc.