Neo4j 4.x 社区版数据导入及Spring-Data-Neo4j 5.x、6.x使用案例

本文详细介绍Neo4j4.3.6版本的数据导入流程及注意事项,包括CSV格式调整、neo4j-import命令使用,并提供Spring-Data-Neo4j5.3.5和6.1.5版本的使用案例,涵盖实体定义、Repository配置及测试代码。

背景及版本介绍

最近看因为工作原因开始接触Neo4j,发现Neo4j本身资料就比较少,而且版本差异比较大,比较流行的书籍《Neo4j权威指南》用是的3.x 社区版(使用Java8),而我由于本机装的是java11,一开始使用的就是社区版 4.3.6,因此很多3.x的命令是无法使用,但也不值当重新装一个3.x的环境(这点不得不夸一下Neo4j无论是安装启动,neo4j在windows上体验都和Linux非常相似,自己学习不用重新搞个Linux环境,非常方便,其实重装一次也不麻烦,只是比较懒)。

在碰到问题时还是尝试搜索资料,解决了一下相关的问题,其实很多问题官方文档已经给出了答案,只是官方文档太繁琐,很有可能一开始看忽略掉问题。

我这边主要碰到的问题是数据导入命令的变化,还是社区版的切换库问题。因此主要说的也是这两个问题。注意本篇博客并不教搭建和CQL语法,因为这些内容是比较通用的,网上3.x的教程也完全可以用。

然后就是Spring-Data-Neo4j操作Neo4j,我看的教程使用SpringBoot版本是2.3.5,配套的Spring-Data-Neo4j是5.3.5,然而我用最新IDEA创建的SpringBoot项目是2.5.5,配套的Spring-Data-Neo4j是6.1.5。

其实Spring中很多starter升级版本对API的影响不大,或者基本是兼容的,但Spring-Data-Neo4j 的 API 变了多了,因此两个版本我都去简单实现了一下。也让初入坑的小伙伴了解一下,不要像我一样无所适从。

Neo4j 4.3.6数据导入

Neo4j本质上是NoSQL,因此开发对Neo4j的学习可能主要集中在CQL上。但我觉得图数据库造数据要比RDB麻烦的多,RDB无非就插入几条数据而已,而且有图形化界面,操作起来很麻烦。

图数据库要造节点,造关系,自带的web图形界面可以查询,插入操作还是要使用CQL语句,一开始对CQL语句操作不熟悉经常把关系搞得很乱,因此我决定导入现成的关系,学起来也比较有意思,有成就感。

想导入数据首先要有数据,网上找了一下没有现成的CSV,那就只能自己做了,我从网上找了一个有意思的,是火影忍者的关系图,内容如下

[
    {
   
   
        "entity_1": "千手纲手",
        "entity_2": "加藤断",
        "relationship": "女友"
    },
    {
   
   
        "entity_1": "加藤断",
        "entity_2": "千手纲手",
        "relationship": "男友"
    },
    {
   
   
        "entity_1": "加藤断",
        "entity_2": "静音",
        "relationship": "叔叔"
    },
    //...
]

这种是不能直接导入的,需要改为neo4j可用的csv格式,因此我写了一份代码把json转为两份CSV,一份是人物,一个是关系,具体数据如下

# 角色csv
roleId:ID,name,:LABEL
role_0,千手纲手,naruto
role_1,加藤断,naruto
role_2,静音,naruto
...
# 关系csv
:START_ID,:END_ID,:TYPE
role_0,role_1,女友
role_1,role_0,男友
role_1,role_2,叔叔
...

后面我会把csv传上来,简单解释一下,角色csv是提供节点的,节点中有两个属性,roleId和name,节点的标签均为naruto,这里roleId并不是数据库中的id,它只是作为关系节点设置关系的依据,也就是在关系CSV中,START_ID和END_ID中的数据,TYPE字段这样写就相当于不同的关系都设置了一种类型,其实更通用的写法可以设置成这样

# 关系csv
:START_ID,:END_ID,relation,:TYPE
role_0,role_1,女友,narutoRelation
role_1,role_0,男友,narutoRelation
role_1,role_2,叔叔,narutoRelation

也就是类型都是 narutoRelation,具体关系在边的relation属性里,有兴趣的可以自己修改一下导入。

我这里使用的是neo4j import方式导入数据,注意这种方式只能在第一次初始化数据的时候才能使用,也就是这个库必须是无数据的新库,但很有你的Neo4j库是有数据的,因此我们不会传到默认的neo4j库,具体操作下面还会有详细说明。还有一点需要提前说明,Neo4j 3.x 是使用bin目录下的neo4j-import命令,但4.x是没有这个命令的, 因为这个命令被合并到neo4j-admin命令里了。

具体操作是先把两个CSV,放到import文件夹下,一定要放到import文件夹下,然后跳到neo4j的bin目录下,使用GitBash(CMD也可以)输入如下命令

./neo4j-admin.bat import 
--database=naruto.db 
--nodes=import/role.csv 
--relationships=import/relation.csv

用我这个命令会产生一个naruto.db的库,需要修改配置文件并重启,原因是我的默认库neo4j已经有数据量,而有数据的库是不能用import命令导入的,后文注意第5点有详细说明。

具体的操作是找到conf/neo4j.conf,修改配置文件中的库

# The name of the default database
#dbms.default_database=neo4j
dbms.default_database=naruto.db

最后使用命令重启

neo4j restart

导入数据后部分图(MATCH (n:naruto) RETURN n LIMIT 25)
火影人物关系图(局部)
需要注意以下几点

  1. 在windows环境下,在CMD输入命令可以直接用命令,但在GitBash中,需要使用neo4j-admin.bat。
  2. –nodes,–relationships后面是等号(=),3.x是冒号(:)
  3. –nodes,–relationships后面的路径,并不是你现在所在目录的相对路径,而是以neo4j的根目录作为起始的相对目录,真正执行的时候会拼接上neo4j所在的目录,因此我建议使用时就使用import开头。
  4. import 命令必须导入到一个空库,如果你的库已经有数据,是无法导入成功的,这也是我在–database=后面加了一个新数据库的原因。
  5. neo4j 3.x的默认数据库叫graph.db,而4.x默认数据库为neo4j,我这样写直接会新建一个名为naruto.db的数据库,但是社区版不支持创建新库,因此需要找到conf/neo4j.conf,修改配置文件中的库,并重启,此时旧库neo4j虽然在web页面可见,但却不能使用,切换到新的naruto.db就可以看到数据了。
    切换数据库

更多关于Neo4j的操作可以看一下官方文档

SDN使用案例

两个案例我会挂到gitee上,因此就不描述目录结构,引入包类等信息了,简单写一下思路和异同点。

SDN 5.3.5 使用案例

新建一个SpringBoot项目,我使用的版本是2.3.5.RELEASE,因为Spring-Data-Neo4j是属于SpringData项目的,因此填写依赖的时候不需要填写它的版本,会根据SpringBoot版本自动设置。

添加依赖

 <dependency>
     <groupId>org.springframework.boot<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值