暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot使用Neo4j

dalaoyang 2020-11-16
438

1.Neo4j简介

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。

Neo4j的官方网站:http://www.neo4j.org

2.安装Neo4j

网上安装教程很多,本文是在mac电脑下使用docker+Kitematic安装的,步骤大致如下:

1.启动docker
2.在Kitematic中搜索Neo4j镜像并安装,这里安利一下这个软件,安装一些镜像非常方便,如下图:

3.安装完成后,访问对应web地址,如下:

3.SpringBoot整合

接下来介绍SpringBoot中如何视同Neo4j。

3.1 添加Neo4j依赖

创建项目,pom文件中引入依赖,如下:

  1. <dependency>

  2. <groupId>org.springframework.boot</groupId>

  3. <artifactId>spring-boot-starter-data-neo4j</artifactId>

  4. </dependency>

复制

3.2 配置文件

在配置文件中配置Neo4j相关配置,如下:

  1. # neo4j配置

  2. spring.data.neo4j.uri= bolt://localhost:7687

  3. spring.data.neo4j.username=neo4j

  4. spring.data.neo4j.password=neo4j

复制

3.3 创建对应entity

这里以部门为例,要创建一个如下的图:

  1. * CEO

  2. * -设计部

  3. * - 设计1

  4. * - 设计2

  5. * -技术部

  6. * - 前端技术部

  7. * - 后端技术部

  8. * - 测试技术部

复制

那么这里简单创建一个部门实体和一个关系实体。

其中部门实体,如下:

  1. @NodeEntity(label = "dept")

  2. @Data

  3. @Builder

  4. public class Dept {


  5. @Id

  6. @GeneratedValue

  7. private Long id;


  8. @Property(name = "deptName")

  9. private String deptName;


  10. }

复制

关系实体如下:

  1. @RelationshipEntity(type = "relationShip")

  2. @Data

  3. @Builder

  4. public class RelationShip {


  5. @Id

  6. @GeneratedValue

  7. private Long id;


  8. @StartNode

  9. private Dept parent;


  10. @EndNode

  11. private Dept child;

  12. }

复制

这里说明一下几个注解的意思:

  • @NodeEntity:标明是一个节点实体

  • @RelationshipEntity:标明是一个关系实体

  • @Id:实体主键

  • @Property:实体属性

  • @GeneratedValue:实体属性值自增

  • @StartNode:开始节点(可以理解为父节点)

  • @EndNode:结束节点(可以理解为子节点)

3.4 repository

由于使用的spring-data操作neo4j,所以实现逻辑类似,创建接口继承Neo4jRepository。

DeptRepository如下:

  1. import org.springframework.data.neo4j.repository.Neo4jRepository;

  2. import org.springframework.stereotype.Repository;


  3. @Repository

  4. public interface DeptRepository extends Neo4jRepository<Dept,Long> {


  5. }

复制

RelationShipRepository如下:

  1. import org.springframework.data.neo4j.repository.Neo4jRepository;

  2. import org.springframework.stereotype.Repository;


  3. @Repository

  4. public interface RelationShipRepository extends Neo4jRepository<RelationShip, Long> {


  5. }

复制

3.5 基本使用

这里创建了一些基础方法,使用方式和spring-data-jpa类似,由于需要构建一个本文3.1所描述的图,所以创建了一个create方法来初始化数据,完整代码如下:

  1. @RestController

  2. public class TestController {


  3. @Resource

  4. private DeptRepository deptRepository;

  5. @Resource

  6. private RelationShipRepository relationShipRepository;


  7. /**

  8. * CEO

  9. * -设计部

  10. * - 设计1组

  11. * - 设计2组

  12. * -技术部

  13. * - 前端技术部

  14. * - 后端技术部

  15. * - 测试技术部

  16. */

  17. @GetMapping("create")

  18. public void create(){

  19. Dept CEO = Dept.builder().deptName("CEO").build();

  20. Dept dept1 = Dept.builder().deptName("设计部").build();

  21. Dept dept11 = Dept.builder().deptName("设计1组").build();

  22. Dept dept12 = Dept.builder().deptName("设计2组").build();


  23. Dept dept2 = Dept.builder().deptName("技术部").build();

  24. Dept dept21 = Dept.builder().deptName("前端技术部").build();

  25. Dept dept22 = Dept.builder().deptName("后端技术部").build();

  26. Dept dept23 = Dept.builder().deptName("测试技术部").build();

  27. List<Dept> depts = new ArrayList<>(Arrays.asList(CEO,dept1,dept11,dept12,dept2,dept21,dept22,dept23));

  28. deptRepository.saveAll(depts);


  29. RelationShip relationShip1 = RelationShip.builder().parent(CEO).child(dept1).build();

  30. RelationShip relationShip2 = RelationShip.builder().parent(CEO).child(dept2).build();

  31. RelationShip relationShip3 = RelationShip.builder().parent(dept1).child(dept11).build();

  32. RelationShip relationShip4 = RelationShip.builder().parent(dept1).child(dept12).build();

  33. RelationShip relationShip5 = RelationShip.builder().parent(dept2).child(dept21).build();

  34. RelationShip relationShip6 = RelationShip.builder().parent(dept2).child(dept22).build();

  35. RelationShip relationShip7 = RelationShip.builder().parent(dept2).child(dept23).build();

  36. List<RelationShip> relationShips = new ArrayList<>(Arrays.asList(relationShip1,relationShip2,relationShip3,relationShip4,relationShip5

  37. ,relationShip6,relationShip7));

  38. relationShipRepository.saveAll(relationShips);

  39. }


  40. @GetMapping("get")

  41. public RelationShip get(Long id){

  42. Optional<RelationShip> byId = relationShipRepository.findById(id);

  43. return byId.orElse(null);

  44. }


  45. @GetMapping("deleteRelationShip")

  46. public void deleteRelationShip(Long id){

  47. relationShipRepository.deleteById(id);

  48. }


  49. @GetMapping("deleteDept")

  50. public void deleteDept(Long id){

  51. deptRepository.deleteById(id);

  52. }


  53. @GetMapping("deleteAll")

  54. public void deleteAll(){

  55. deptRepository.deleteAll();

  56. relationShipRepository.deleteAll();

  57. }

  58. }

复制

执行create方法初始化数据,结果如下图所示:

其余测试方法这里就不在演示了,可以自行测试。

4.Neo4j基本命令

4.1 操作命令简介

接下来介绍一下Neo4j的基本操作命令。

  • CREATE命令:创建节点命令

  • MATCH命令:查询命令

  • RETURN命令:返回数据命令

  • DELETE命令:删除命令,可以用于删除节点和关联节点信息

  • REMOVE命令:可以用于删除标签和属性

4.2 简单练习

创建命令,可以用来创建节点和关系节点,比如我们要在创建一个部门,秘书部,如下,执行如下命令:

  1. CREATE (d:dept {deptName:"秘书部"})

复制

操作后如下图所示:

目前可以看到,秘书部和其余节点是没有关系的,那么接下来将秘书部与CEO创建关系,执行如下命令:

  1. MATCH (n:dept {deptName:"CEO"}),(m:dept {deptName:"秘书部"}) CREATE (n)-[r:relationShip]->(m) return r;

复制

查看结果如图:

可以看到秘书部已经挂在了CEO节点下。

其中从上面就可以看出,CQL语句大致结构如下:

  • MATCH RETURN:查询命中结果返回;

  • MATCH CREATE RETURN:查询后创建关系返回;

  • MATCH DELETE:查询命中删除;

...

5.源码

源码地址:https://gitee.com/dalaoyang/springbootlearn/tree/master/springboot2neo4j

6.参考

参考地址:

https://baike.baidu.com/item/Neo4j/9952114?fr=aladdin
http://www.neo4j.org


文章转载自dalaoyang,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论