知识库

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

以下示例将以用户 root 和密码 football 连接到名为 proddb1 的 mysql 数据库,并从“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 时将其值转换为字符串。