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中管理多个数据库)

其实也可以不在启动的时候就指定数据库的。

逐步输入以下命令:

  1. 查看当前这个DBMS下有多少数据库,使用:dbs。可以看到,只有两个默认的,一个就是system,另一个就是neo4j(默认的)
    在这里插入图片描述
    另外,可以观察一下这些命令的前缀
    在这里插入图片描述

  2. 创建一个新的数据库,使用create database mysql,再看看,:dbs的输出,其实就可以看到

    Creating a new database (Enterprise only),创建数据集这个功能只有企业版才有。。桌面版其实有一部分功能是企业版的,所以桌面版只有一年的试用期。所以正常来说,一个DBMS只有一个默认数据库neo4j可以使用。。。

    在这里插入图片描述

  3. 切换到新建的数据库进行使用,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提供的专门用于数据的工具

  1. 启动Neo4j ETL Tool(这个东西和DBMS的启动无关。。。这几个工具都可以单独启动)
    在这里插入图片描述

  2. 选择一个Project(注意,这个还是企业版的功能,桌面版只是有部分企业版功能,而且桌面版只可以用一年。。。但是只要数据库构建好了,这个工具其实就可以去用社区版维护一个数据库就好了。。。😶😶😶)

    另外,导入时是不能指定导入到neo4j中的哪个数据库中,只能是选择DBMS,然后新建一个图数据库导进去。
    在这里插入图片描述

  3. 点击上面的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
      在这里插入图片描述
    1. database就是要连接到mysql中哪个数据库

    在这里插入图片描述

  4. 点击TEST AND SAVE CONNECTION,报错
    在这里插入图片描述
    如果报错,直接在上面的Connection URL链接中加入:&serverTimezone=UTC(直接复制到最后面就可以。)。详情见 3. 问题解决->1.XXX部分

  5. 如果测试连接正确,就会看到下面这个提示,创建连接成功。完整的提示信息为:Connection mysql2neo4j saved. Connection successful. Catalog: poem_kbqa_demo, Schema: null,这里有一点要注意,Schema是NULL

  6. 有了mysql数据库和neo4j数据库之间的连接,接下来其实就可以开始映射了,START MAPPING
    在这里插入图片描述
    折腾了很久,发现这个错误其实是个乌龙。。。
    在这里插入图片描述

    只是因为我没有选择刚刚创建的那个mysql2neo4j的连接(那个框框,从浅灰变成深灰,就是选中了),另外,None变成mysql2neo4j。两个框都要选,官方文档Choose the ‘From’ and ‘To’ Databases for Import图就很明确,认真看!!!!
    有兴趣的可以看看logs,或者复制下来,防止之后出错。。

    💢💢💢乌龙 错误解决详情参见 3.问题解决->2.XXXX部分。

  7. 映射成功之后,点击NEXT,就会看到从mysql中导入的表了。
    在这里插入图片描述
    但是这里有个问题,导入的这个MySQL数据库中的表,格式和neo4j默认的有些出入。默认所有的表都是节点,而没有关系。。。
    参考2.4 关系数据库转为图数据库的规则以及3.问题解决中3.确认可导入的数据格式,重新修改mysql数据库的数据模式。
    mysql数据不符合外键约束,所以就直接只导入实体,关系。。稍后使用python等语言,逐句添加。。。哎😪😪😪

  8. 就先只映射节点好了
    这里我导入的时候,Import Mode默认只有一种选择,Bulk Import
    关于导入的图数据库名称,要么使用默认的,要么自己指定一个名字。
    在这里插入图片描述

  9. 上一步报错,参考 3. 问题解决中->4. Importing Data in Neo4j through ETL Tool failed due to error warning。
    在这里插入图片描述
    由于解决是使用命令行,所以。。其实和这部分界面控制是脱节的。还好这步就是最后一步。

另外,其实文档中也提示了,如果这步出错,可以使用命令行
在这里插入图片描述


2.3 关系数据库转为图数据库的规则

参考:Review data model transformation and make adjustments ,翻译大意如下:

查看数据模型转换并进行调整

这里实际上是将关系数据转换为图形数据的地方,使用三个规则将关系数据库转换为图形数据库。

  1. 带有外键的表被视为连接并作为具有关系的节点导入
    对于Person表来说,其主键是person_id,其包含一个属性,address_id,这个属性刚好是Address表的主键,所以对于Person表来说,address_id就是外键。。
    在这里插入图片描述
  2. 具有 2 个外键的表被视为连接表并作为关系导入。
    对于Student_Course这个表来说,它包含了两个外键,分别是Course的主键course_idStudent的主键student_id。所以Student_Course刚好是这两个表的桥梁,所以真正有关系的其实是CourseStudent这两个表
    在这里插入图片描述
  3. 外键 >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_work\neo4j_data\graphApps\_global\neo4j-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:\Users\HUANGS~1\AppData\Local\Temp/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插件目录下,我找了一下,桌面版没有。。。

参考:

3. 确认可导入的数据格式

在mapping之后,发现自己的这个mysql数据集导入之后,只有节点,没有关系(边)。

对于我目前的数据来说,其实只要把代表关系的那两个表,设置对应的外键即可。

在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_work\neo4j_data\graphApps\_global\neo4j-etl-ui/dist/neo4j-etl.jar" org.neo4j.etl.NeoIntegrationCli export 
--mapping-file "C:\Users\HUANGS~1\AppData\Local\Temp/mysql_poem_kbqa_demo_poem_kbqa_demo_mapping.json" --destination "C:\shaiic_work\neo4j_data\relate-data\dbmss\dbms-54e8721d-3337-412a-8b54-d6ccd03b564e/data/databases/graph.db/" 
--import-tool "C:\shaiic_work\neo4j_data\relate-data\dbmss\dbms-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:\Users\HUANGS~1\AppData\Local\Temp" 
--options-file "C:\Users\HUANGS~1\AppData\Local\Temp/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:\Users\HUANGS~1\AppData\Local\Temp\import-tool-options.json.
- Reading metadata mapping from file: C:\Users\HUANGS~1\AppData\Local\Temp/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:\Users\yourname~1\AppData\Local\Temp\csv-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_work\neo4j_data\relate-data\dbmss\dbms-54e8721d-3337-412a-8b54-d6ccd03b564e\bin\neo4j-admin.bat @C:\Users\HUANGS~1\AppData\Local\Temp\csv-002\neo4j-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:\Users\yourname~1\AppData\Local\Temp\import-tool-options.json.
    {"multiline-fields":"true"}
    
  • C:\Users\yourname~1\AppData\Local\Temp/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_work\neo4j_data\relate-data\dbmss\dbms-54e8721d-3337-412a-8b54-d6ccd03b564e\import\import.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 

参考:

根据官方文档: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:\Users\HUANGS~1\AppData\Local\Temp\csv-010\neo4j-admin-import-params把这个文件里,文件路径的斜杠,都换成/这个。

再执行:

C:\shaiic_work\neo4j_data\relate-data\dbmss\dbms-54e8721d-3337-412a-8b54-d6ccd03b564e\bin\neo4j-admin.bat @C:\Users\HUANGS~1\AppData\Local\Temp\csv-010\neo4j-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. 中文乱码

参考:


  • desktop转换的csv文件一般存放位置:C:\Users\huangshan\AppData\Local\Temp\csv-010\poem_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)
    
  • 由于没有关系,所以暂时无法进行更多的查询。

参考

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐