概述
文章目录
- 1. 新建一个图数据库并设置为启动项
- 1.1 Desktop操作
- 1.2 命令行操作
- 2. 将MySQL数据库中的数据导入
- 2.1 现有的MySQL中的关系数据库
- 2.2 使用Desktop中的ETL Tool进行导入
- 2.3 关系数据库转为图数据库的规则
- 3. 问题解决
- 1. Connection failed. SQL state:08001,message:Could not create connection to database server
- 2. Mapping Error
- 3. 确认可导入的数据格式
- 4. Importing Data in Neo4j through ETL Tool failed due to error warning
- 4.1 ????????(无效)修改文件中的路径斜杠
- 4.2 ????????(无效)修改java版本
- 4.3 ????????研究neo4j-admin-import-params文件
- 4.4 ✅✅修改,然后直接执行中断错误的命令
- 4.5 结论✅✅
- 5. 用一下自己导入的这个数据库
- 5.1. 验证数据量
- 5.2. 中文乱码
- 5.3. 简单使用
- 参考
1. 新建一个图数据库并设置为启动项
1.1 Desktop操作
由于我使用的是桌面版(Desktop),所以直接在界面上点点就可以了
-
必须先启动自己在Project创建的DBMS,然后才会显示当前这个DBMS下的数据库,同时才有进行其他操作的空间
-
点击
Create database
,比如我就创建了一个叫mysql
的数据库,作为存放从mysql转过来的数据 -
然后需要将新建的这个数据库设置为(default)默认启动数据库,然后才可以使用命令行工具——neo4j bloom(浏览器UI命令行),然后才能做别的事情
-
点击这个DBMS的
Settings
,
-
把默认数据库那项,改成自己刚刚新建的那个数据库名称,前面的注释去掉。
-
改好之后,点击
Apply
,然后会提示重启这个DBMS,就重启等着好了
-
然后可以看到default这个关键词就跑到刚刚新创建的mysql数据库后面了,虽然右侧mysql数据库没有任何介绍,是个空壳子数据库。
-
另外,指定了mysql是default之后,启动neo4j的browser命令行,其命令行前缀就是这个数据库
1.2 命令行操作
参考: Managing Multiple Databases in Neo4j(在neo4j中管理多个数据库)
其实也可以不在启动的时候就指定数据库的。
逐步输入以下命令:
-
查看当前这个DBMS下有多少数据库,使用
:dbs
。可以看到,只有两个默认的,一个就是system
,另一个就是neo4j
(默认的)
另外,可以观察一下这些命令的前缀
-
创建一个新的数据库,使用
create database mysql
,再看看,:dbs
的输出,其实就可以看到Creating a new database (Enterprise only),创建数据集这个功能只有企业版才有。。桌面版其实有一部分功能是企业版的,所以桌面版只有一年的试用期。所以正常来说,一个DBMS只有一个默认数据库neo4j可以使用。。。
-
切换到新建的数据库进行使用,
use mysql
,提示已经更新了Neo4j的DBMS的数据库已经更新了,从这个语句之后的查询语句都是针对mysql数据库进行的了。(命令行前缀已经变成mysql了)
4. 可以回到Desktop重启一下这个DBMS,就可以看到刚刚使用命令行创建的mysql了,虽然并不是default,但是无所谓。
2. 将MySQL数据库中的数据导入
2.1 现有的MySQL中的关系数据库
感谢:基于知识图谱的问答系统(KBQA),本示例使用的数据库来自这位大公无私的大神博主。数据库如下:
2.2 使用Desktop中的ETL Tool进行导入
参考:https://neo4j.com/developer/neo4j-etl/以及https://neo4j.com/labs/etl-tool/1.5.0/
neo4j-ETL 这个工具就是neo4j提供的专门用于数据的工具
-
启动Neo4j ETL Tool(这个东西和DBMS的启动无关。。。这几个工具都可以单独启动)
-
选择一个Project(注意,这个还是企业版的功能,桌面版只是有部分企业版功能,而且桌面版只可以用一年。。。但是只要数据库构建好了,这个工具其实就可以去用社区版维护一个数据库就好了。。。????????????)
另外,导入时是不能指定导入到neo4j中的哪个数据库中,只能是选择DBMS,然后新建一个图数据库导进去。
-
点击上面的
ADD CONNECTION
,填写一些必要的信息。- 红框部分是默认的配置,Database名称改了之后,下面URL中也会自动修改的。如果不了解JDBC的话(这是java连接数据库的方式,可以参考菜鸟教程-Java MySQL 连接)。
- 用户密码就是mysql的用户密码,一般是root用户,密码自己好好想想,想不起来就只能重置,重置参考mysql官方文档,或者是类似外国的菜鸟教程:How to Reset MySQL Root Password in Windows using cmd?
- Host和Port就是安装时候显示的,一般mysql的端口就是3306
- database就是要连接到mysql中哪个数据库
-
点击
TEST AND SAVE CONNECTION
,报错
如果报错,直接在上面的Connection URL链接中加入:&serverTimezone=UTC
(直接复制到最后面就可以。)。详情见 3. 问题解决->1.XXX部分 -
如果测试连接正确,就会看到下面这个提示,创建连接成功。完整的提示信息为:
Connection mysql2neo4j saved. Connection successful. Catalog: poem_kbqa_demo, Schema: null
,这里有一点要注意,Schema是NULL -
有了mysql数据库和neo4j数据库之间的连接,接下来其实就可以开始映射了,
START MAPPING
折腾了很久,发现这个错误其实是个乌龙。。。
只是因为我没有选择刚刚创建的那个mysql2neo4j的连接(那个框框,从浅灰变成深灰,就是选中了),另外,
None
变成mysql2neo4j
。两个框都要选,官方文档Choose the ‘From’ and ‘To’ Databases for Import图就很明确,认真看!!!!
有兴趣的可以看看logs,或者复制下来,防止之后出错。。????????????乌龙 错误解决详情参见 3.问题解决->2.XXXX部分。
-
映射成功之后,点击
NEXT
,就会看到从mysql中导入的表了。
但是这里有个问题,导入的这个MySQL数据库中的表,格式和neo4j默认的有些出入。默认所有的表都是节点,而没有关系。。。
参考2.4 关系数据库转为图数据库的规则以及3.问题解决中3.确认可导入的数据格式,重新修改mysql数据库的数据模式。
mysql数据不符合外键约束,所以就直接只导入实体,关系。。稍后使用python等语言,逐句添加。。。哎???????????? -
就先只映射节点好了
这里我导入的时候,Import Mode默认只有一种选择,Bulk Import
关于导入的图数据库名称,要么使用默认的,要么自己指定一个名字。
-
上一步报错,参考 3. 问题解决中->4. Importing Data in Neo4j through ETL Tool failed due to error warning。
由于解决是使用命令行,所以。。其实和这部分界面控制是脱节的。还好这步就是最后一步。
另外,其实文档中也提示了,如果这步出错,可以使用命令行:
2.3 关系数据库转为图数据库的规则
参考:Review data model transformation and make adjustments ,翻译大意如下:
查看数据模型转换并进行调整
这里实际上是将关系数据转换为图形数据的地方,使用三个规则将关系数据库转换为图形数据库。
- 带有外键的表被视为连接并作为具有关系的节点导入
对于Person
表来说,其主键是person_id
,其包含一个属性,address_id
,这个属性刚好是Address
表的主键,所以对于Person
表来说,address_id
就是外键。。
- 具有 2 个外键的表被视为连接表并作为关系导入。
对于Student_Course
这个表来说,它包含了两个外键,分别是Course
的主键course_id
和Student
的主键student_id
。所以Student_Course
刚好是这两个表的桥梁,所以真正有关系的其实是Course
和Student
这两个表
- 外键 >2 的表被视为 n 个中间节点,并作为具有多个关系的节点导入
Orders
表包含其他四个表的主键,一共有4个外键,这时候,就是多个关系的节点。
3. 问题解决
1. Connection failed. SQL state:08001,message:Could not create connection to database server
查看日志,观察错误详细信息。就很尴尬,没有关于这个ETL插件的log。
感谢:ETL mysql Connection failed. SQL state 08001. How to find my JDBC driver?
解决方法就是,在上面的Connection URL链接中加入:&serverTimezone=UTC
(直接复制到最后面就可以。)
给的经验就是,可以尝试先用其他的工具链接一下,看看使用这样的url链接会报啥错,这个neo4j ETL工具不给具体的错误信息,就很恶心(但是这个错误信息是mysql端的,它确实也获取不到。。只能返回mysql给返回的信息,无解????????????)。
其实这个问题,和CSDN博客:idea连接MySQL数据库报错:[08001] Could not create connection to database server. Attempted reconnect 3 times是一样的,都是时区设置问题
2. Mapping Error
很好,继续报错,不过这次有SEE LOGS
,可以看到详细的报错信息。
COMMAND: java -cp "C:shaiic_workneo4j_datagraphApps_globalneo4j-etl-ui/dist/neo4j-etl.jar" org.neo4j.etl.NeoIntegrationCli generate-metadata-mapping --rdbms:url "" --rdbms:password "undefined" --rdbms:user "undefined" --output-mapping-file "C:UsersHUANGS~1AppDataLocalTemp/undefined_undefined_mapping.json"
- Skipping reading import options from file because file [] doesn't exist.
- Creating RDBMS to CSV mappings...
- There is no suitable driver for the connection URL:
- Command failed due to error (ClassNotFoundException: There is no suitable driver for the connection URL: ). Rerun with --debug flag for detailed diagnostic information.
最关键的一句, There is no suitable driver for the connection URL
。我以为是缺少驱动。。
但是在:Neo4j ETL Docs/Neo4j ETL User Guide中,有一句很关键的话:
The drivers for MySQL and PostgreSQL are bundled with the Neo4j-ETL tool.
意思就是,Neo4j-ETL工具里默认已经集成了MySQL和PostgreSQL的驱动了,所以不是驱动的问题。
后来误打误撞,点击一下刚刚配置的mysql2neo4j连接,对比下面,其实是因为我自己没有选择好connection
。RLG????????????????????????
????????????????都是乌龙
参考: Neo4j: 迁移MySQL的数据到Neo4j和菜鸟教程-Java MySQL 连接,
- 如果要使用JDBC连接mysql,第一件事就是下载JDBC驱动。
- 把mysql-connector-java-8.0.11.jar复制到Neo4j安装目录中的plugins子目录下,重启Neo4j
cp mysql-connector-java-8.0.11.jar $NEO4J_INSTALL_PATH/plugins
不过我这个是neo4j desktop版本。。。
第一步,下载那个jdbc driver
-
这个JDBC驱动似乎和MySQL版本有点关系。。可以在命令行中输入
mysql --version
,可以看到,自己的mysql版本号,挺新的。mysql5.0以上就直接下最新版本的驱动就可以。
-
感谢 Neo4j: 迁移MySQL的数据到Neo4j中提供的下载链接
-
直接把上面的版本号改成自己想要的就可以,类似:https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.27.zip
-
如果使用下面这个网页下载(集成下载,一次把mysql所有的东西都下下来)。。还要注册登录,注意避坑
第二步,把jar包放到合适的位置 -
解压完之后有很多文件,只需要jar包就行,其他不用管
-
那个博主用的是neo4j社区版本,直接放在neo4j安装目录下的plugins插件目录下,我找了一下,桌面版没有。。。
参考:
- Stack Overflow:No suitable driver found for jdbc Neo4j
有直接包含了jdbc依赖的neo4j包,来自于neo4j github issue-Getting No suitable driver found for jdbc:neo4j://localhost:7474/ #36,但是对解决我的问题没啥用。
- CSDN博客: neo4j Caused by:java.sql.SQLException:No suitable driver found for jdbc:neo4j:http:/127.0.0.1:7474/
- 或neo4j官方社区:Connecting to neo4j using java
3. 确认可导入的数据格式
在mapping之后,发现自己的这个mysql数据集导入之后,只有节点,没有关系(边)。
- 查看示例数据库,NorthWind的形式,github地址:https://github.com/pthom/northwind_psql
- 参考2.4 关系数据库转为图数据库的规则
对于我目前的数据来说,其实只要把代表关系的那两个表,设置对应的外键即可。
在navicat里点点就可以了,设计表,加一下外键。
看看ER图,对比一下NorthWind和三个转换规则,就差不多了。
复习一下,MySQL里有一点
一个表的某个属性既可以是这个表的主键,也可以是外键!
但是mapping的时候报错了。。。所以neo4j转换的时候,不接受mysql一个表中一个属性既是主键,又是外键。。所以还是改改。
记录一下用到的sql语句(记得要加分号。。。)
# 查询某个表中的约束
SELECT * FROM information_schema.`TABLE_CONSTRAINTS`
where table_name="poem";
# 查看当前含有的数据库
show databases;
# 切换数据库
use poem_kbqa_demo;
# 删除某个表中的约束
alter table poet
drop constraint poem_ibfk_1;
# 如果是外键约束,则需要直接使用如下
alter table poet drop foreign key poem_ibfk_1;
报错:
这个问题比较复杂,参考另一个博客:mysql 1452 Cannot add or update a child row: a foreign key constraint fails
4. Importing Data in Neo4j through ETL Tool failed due to error warning
完整的错误信息:
COMMAND:
java -cp "C:shaiic_workneo4j_datagraphApps_globalneo4j-etl-ui/dist/neo4j-etl.jar" org.neo4j.etl.NeoIntegrationCli export
--mapping-file "C:UsersHUANGS~1AppDataLocalTemp/mysql_poem_kbqa_demo_poem_kbqa_demo_mapping.json" --destination "C:shaiic_workneo4j_datarelate-datadbmssdbms-54e8721d-3337-412a-8b54-d6ccd03b564e/data/databases/graph.db/"
--import-tool "C:shaiic_workneo4j_datarelate-datadbmssdbms-54e8721d-3337-412a-8b54-d6ccd03b564e/bin"
--rdbms:password "XX"
--rdbms:user "XXXX"
--rdbms:url "jdbc:mysql://localhost:3306/poem_kbqa_demo?autoReconnect=true&useSSL=false&useCursorFetch=true&allowPublicKeyRetrieval=true&serverTimezone=UTC"
--csv-directory "C:UsersHUANGS~1AppDataLocalTemp"
--options-file "C:UsersHUANGS~1AppDataLocalTemp/import-tool-options.json"
--using "bulk:neo4j-import"
--neo4j:url "bolt://localhost:7687"
--neo4j:user "XXX" --neo4j:password "XXX"
--neo4j:db-auto-creation --force
- Reading options from file C:UsersHUANGS~1AppDataLocalTempimport-tool-options.json.
- Reading metadata mapping from file: C:UsersHUANGS~1AppDataLocalTemp/mysql_poem_kbqa_demo_poem_kbqa_demo_mapping.json
- Running ETL on Neo4j 4.3.5 - ENTERPRISE
- Exporting from RDBMS to CSV...
- CSV directory: C:Usersyourname~1AppDataLocalTempcsv-002
- Writing CSV headers for node NODE_poemkbqademo.poem_629d5d8a-fe19-490a-8c36-cff14a7c8e25
- Writing CSV headers for node NODE_poemkbqademo.poet_af4dd1cb-83c9-4146-ad07-47c45a6a0d39
- Writing CSV headers for node NODE_poemkbqademo.verse_40715f90-ac78-4a5e-8ff0-e76a6caa2918
Export time: 0.278 (s)
- Creating Neo4j store from CSV...
- Direct driver instance 1765900922 created for server address localhost:7687
Unable to connect to Neo4j due to the following exception: Unable to connect to localhost:7687, ensure the database is running and that there is a working network connection to it.
- Importing data into Neo4j
- Command failed due to error (CommandFailedException: Command failed [Command: 'C:shaiic_workneo4j_datarelate-datadbmssdbms-54e8721d-3337-412a-8b54-d6ccd03b564ebinneo4j-admin.bat @C:UsersHUANGS~1AppDataLocalTempcsv-002neo4j-admin-import-params', CommandResult { ExitValue: 2, Stdout: 'Selecting JVM - Version:11.0.8, Name:OpenJDK 64-Bit Server VM, Vendor:Azul Systems, Inc.', Stderr: 'Invalid value for option '--report-file': cannot convert 'C:shaiic_work
eo4j_data
elate-datadbmssdbms-54e8721d-3337-412a-8b54-d6ccd03b564eimportimport.report' to interface java.nio.file.Path (java.nio.file.InvalidPathException: Illegal char <
> at index 13: C:shaiic_work
eo4j_data
elate-datadbmssdbms-54e8721d-3337-412a-8b54-d6ccd03b564eimportimport.report)
仔细看上面的路径,问题很明显,由于转义符存在,所以真正执行的时候,路径错误。
类似的问题也有:Neo4j Desktop Can’t export database。可能还是推出时间不够长,很多功能还没有被验证过,所以这个bug还没修。
4.1 ????????(无效)修改文件中的路径斜杠
查看执行ETL前读取的两个配置文件的内容,分别是:
C:Usersyourname~1AppDataLocalTempimport-tool-options.json.
{"multiline-fields":"true"}
C:Usersyourname~1AppDataLocalTemp/mysql_poem_kbqa_demo_poem_kbqa_demo_mapping.json
。这里面主要是一些转换模式,转过来neo4j图数据库的节点和边的定义- 出错那一步的上一步是:
Creating Neo4j store from CSV...
,在对应的csv2
文件夹中,有一个文件:neo4j-admin-import-params
,其内容是:import --report-file "C:shaiic_workneo4j_datarelate-datadbmssdbms-54e8721d-3337-412a-8b54-d6ccd03b564eimportimport.report" --nodes "XXXXa6caa2918.csv" --delimiter , --array-delimiter ; --id-type STRING --ignore-empty-strings true --trim-strings true --multiline-fields true
- 所以对这里面的路径进行修改,全部改成
/
这种斜杠。无效,看来还是要改执行的命令。
直接把command中的斜杠全部改掉,运行,可以看到,报错信息是说我的Java版本不行。。。
即便在命令后面加上--debug
,输出的错误信息其实都差不多。
4.2 ????????(无效)修改java版本
警告: * Please use Oracle(R) Java(TM) 11, OpenJDK(TM) 11 to run Neo4j Server. * Please see https://neo4j.com/docs/ for Neo4j installation instructions.', Stderr: 'Invoke-Neo4jAdmin : This instance of Java is not supported
参考:
- Please help me install Neo4j Community, Java 11 Doesn’t Seem to Be Properly Working . .
根据官方文档:System requirements
所以必须是Java的JDK11.。。。
另外,根据:Use Java Runtime 11 with Neo4J 3.5.x
neo4j从3.x版本到4.x版本最显著的一个区别就是,前者对应java jdk8,后者对应jdk 11。
同时,上面报错的地方,确实有这个neo4j-admin report
工具,其依赖于java jdk 11。
好了,版本不行,重新安装吧。对不起,是我的版本太老了,我不配!
去这里下载11。安装好了记得改Java_Home等系统变量。
4.3 ????????研究neo4j-admin-import-params文件
这个文件是每次执行的时候现场生成的,所以改没有用。
执行多少次,就会有多少个csv。
找到执行的命令,
虽然找到了。。但是不会改啊。
4.4 ✅✅修改,然后直接执行中断错误的命令
C:UsersHUANGS~1AppDataLocalTempcsv-010neo4j-admin-import-params
把这个文件里,文件路径的斜杠,都换成/
这个。
再执行:
C:shaiic_workneo4j_datarelate-datadbmssdbms-54e8721d-3337-412a-8b54-d6ccd03b564ebinneo4j-admin.bat @C:UsersHUANGS~1AppDataLocalTempcsv-010neo4j-admin-import-params
在这里中断了,就直接改后面那个文件的斜杠,直接执行。然后就对了。。
4.5 结论✅✅
- github上的issue也有,但是大部分,甚至是绝大部分都是linux上的!命令行操作的!
- 偶尔能找到的neo4j desktop版本的都是neo4j社区上的问题,回答的人很少,和我一样有这个问题的人有好几个,但是没人回答。我的解决方案也是很low,大概知道在哪改,可惜看不懂windows下的批处理。(其实我找到需要修改的文件了,但是再深的内容就看不懂了)
综上,不建议使用desktop版本,也不建议在windows上使用neo4j。
- 如果是想使用desktop的,可以先使用server版本的,熟悉一下基本的命令和操作
- 这样当desktop版本报错的时候,起码不至于慌张,而且有迹可循。
另外,可以从中看出neo4j的导入逻辑
从上面的输出信息其实可以看出来,neo4j从mysql中提取文件的时候,其实还是先把RDBMS数据转为csv文件,然后再以csv文件的形式导入。
和之前调研的说法一样,neo4j只支持csv导入。
同时从输出信息中,找到csv目录:
打开就可以看到转存的这个csv文件了
5. 用一下自己导入的这个数据库
5.1. 验证数据量
弄完了,回到界面,就可以看到:
只有节点,没有关系。
验证一下数量
MATCH (p:Poem)
RETURN p
# 可以看一下图的样子(默认看300个)
# 另外,也可以直接统计数量
MATCH (p:Verse)
RETURN count(p)
可以看到,这里还有个中文编码显示的问题。。。看来mysql那边导入的时候要十分注意。
- mysql中,poem表839+poet表228+verse表10148=11215,数量并不完全对得上。
- 检索之后,实际图数据库中poem839+poet228个+verse9987=11054,问题主要出在Verse表中。
怀疑是因为mysql中Verse(诗句),内容有重复的,去mysql里看看(其实都不用检索,肉眼都能看出来。。这个数据库质量真的不高!)
SELECT verse_content,count(verse_content) as count FROM verse GROUP BY verse_content HAVING count(verse_content) > 1 ORDER BY count DESC;
统计之后,重复了1353个,mysql中verse表是 10148-neo4j中是9987=161.。。。对不上,排除这个原因。
- mysql中,poem表839+poet表228+verse表10148=11215,数量并不完全对得上。
- 检索之后,实际图数据库中poem839+poet228个+verse9987=11054,
然后瞥了一眼旁边的介绍。。就很奇怪,有10148行,但是id递增只有9988(从1开始的)???但是拉到最后,最后一个序号是9987.。。。。就很迷??????????????
那就是数据导入ok,没少。只是中文乱码这个问题要解决一下。
5.2. 中文乱码
参考:
- neo4j etl工具导入中文数据出现乱码解决方案
- ✅✅ neo4j导入中文的csv文件,出现乱码
- desktop转换的csv文件一般存放位置:
C:UsershuangshanAppDataLocalTempcsv-010poem_kbqa_demo
- 把mysql转成的csv文件格式编码重新搞一下就可以了,但是不能再重新使用上面的导入了,要重新搞一个数据库才可以导入。算了,垃圾。
不要用桌面版!!!!直接用命令行!!!!不要用windows,用linux!!!!
5.3. 简单使用
参考:Managing Multiple Databases in Neo4j
- 查看现有的数据库:
show databases
- 切换到某个指定的数据库:
:use neo4j
- 查看当前数据库的schema,使用
CALL db.schema.visualization()
- 查看每个类型节点的数量和情况,(和mysql差不多,语法关键词不区分大小写,节点类型等区分)
match (p:Poem) return p # 如果要看数量 match (p:Poem) return count(p)
- 由于没有关系,所以暂时无法进行更多的查询。
参考
-
Data Migration between MySQL and Neo4j
-
Database Integration
APOC 库增加了与其他数据库集成的支持,包括关系数据库(通过 JDBC)、MongoDB、Elastic 和 Couchbase。 它还支持从 LDAP 目录导入数据并针对其他 Neo4j 数据库执行查询。
- Tutorial: Import Relational Data Into Neo4j
-
MySQL迁移到Neo4j几种方法及注意事项
-
github博客:From SQL to Neo4j: Northwind
最后
以上就是爱听歌缘分为你收集整理的图数据库初探——4. mysql数据导入neo4j(desktop界面导入)1. 新建一个图数据库并设置为启动项2. 将MySQL数据库中的数据导入3. 问题解决5. 用一下自己导入的这个数据库参考的全部内容,希望文章能够帮你解决图数据库初探——4. mysql数据导入neo4j(desktop界面导入)1. 新建一个图数据库并设置为启动项2. 将MySQL数据库中的数据导入3. 问题解决5. 用一下自己导入的这个数据库参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复