如何使用 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-connector-java-5.1.34.jar |
||
postgresql-9.4.1209.jar |
||
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。
此页面有帮助吗?