知识库

如何使用 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

"连接字符串"特定于供应商,因此应查阅 RDBMS 供应商以获取语法。"SQL 语句或表名"例如可以是 'select * from movies' 或简单地 'movies'。使用单个表名将导致 'select * from <表名>'。

以下示例将连接到名为 proddb1 的 mysql 数据库,用户为 root,密码为 football,并从 'movies' 表中选择 studio 列定义为 'MGM Studios' 的所有电影。使用这些数据,我们将在 Neo4j 中为所有符合此条件的电影创建节点,并定义 title 属性。

CALL apoc.load.jdbc('jdbc:mysql://localhost: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://localhost: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://localhost: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 等修改源数据库的 SQL 语句。如果需要,您可能希望使用只拥有 SELECT 权限的用户连接到 RDBMS。

此外,从 JDBC 加载数据时,请注意数据类型和任何必要的转换;例如,尽管 MySQL 支持原生的 DATE 数据类型,但 Neo4j 不支持。例如,要获取包含 DATE 数据类型的列,在导入到 Neo4j 时将其值转换为字符串。