SpringBoot 整合 Neo4j 实战(头歌)

文章目录

  • 第1关:认识 Spring DATA Neo4J
    • 任务描述
    • 相关知识
      • Spring DATA Neo4J - 简介
        • Spring JDBC / Spring ORM 模块的缺点:
        • Spring 数据模块的优点:
        • Spring 数据模块功能:
        • Spring DATA Neo4j 模块的附加功能:
      • Spring DATA Neo4j - 结构
        • Spring DATA Neo4j 模块
        • Spring DATA Neo4j 架构
        • Spring DATA Neo4j 存储库
    • 本关要求
    • 测试说明
    • 题目答案
  • 第2关:Spring DATA Neo4J
    • 任务描述
    • 相关知识
      • Spring DATA Neo4J 环境
      • Spring DATA Neo4j 示例
        • Spring DATA Neo4j 模块注释
        • Entity 实体类模块
        • 开发 Spring DATA Neo4j 存储库
    • 编程要求
    • 测试说明
    • 答案
      • `PersonRepository.java`
      • `testController.java`
      • `Person.java`
      • `application.properties`
    • 注解

第1关:认识 Spring DATA Neo4J

任务描述

本关任务:了解关于 Neo4j 在 SpringBoot 中的关系和联系。

相关知识

为了完成本关任务,你需要掌握: 1.Spring DATA Neo4J - 简介; 2.Spring DATA Neo4J - 结构。

Spring DATA Neo4J - 简介

Spring是开源框架,很容易开发基于企业 Java 的应用程序。 它用Java语言编写。

Spring Framework 提供了以下模块来处理基于 Java 的应用程序的 DAO 层:

  • Spring JDBC
  • Spring ORM
  • Spring DATA

如果我们观察任何基于 Java 的 n 层应用程序,我们通常会找到以下层。

img

层次结构

这里DAO(数据访问对象)层负责实现数据库操作。

我们需要为每个实体(Say one Database Table)实现两套工件。

例如:

如果我们在我们的数据库中有一个PROFILE表,那么我们需要提供一个 Profile Entity 类(POJO)。 然后我们需要提供一个 DAO 接口和一个 DAO 实现类。

这里我们需要选择 Spring JDBC 或 Spring ORM 来实现这些工件。

img

选择类

Spring JDBC / Spring ORM 模块的缺点:
  • 大量的 boiler plate 代码来执行简单的数据库操作;
  • 增加了大量 DAO 层工件的维护;
  • 增加实现大量 DAO 图构件的开发时间。
Spring 数据模块的优点:
  • 消除 DAO 层中的 boiler plate 代码;
  • DAO 层中的工件少;
  • 易于开发和维护;
  • 改进开发过程。
Spring 数据模块功能:
  • 支持基于XML的实体映射;
  • 支持基于注释的实体映射;
  • 支持分页;
  • 支持事务;
  • 更少的 DAO 层工件-实现存储库;
  • Spring DATA Neo4j 模块具有与上述相同的优点和特点。
Spring DATA Neo4j 模块的附加功能:
  • 支持Neo4j属性图模块;
  • 支持Neo4j Lucence索引;
  • 支持Neo4j CQL;
  • Neo4jTemplate。

Spring DATA Neo4j - 结构

Spring DATA Neo4j 模块

Spring DATA 模块适用于为各种数据库实现 DAO 层。 它通过避免一些不需要的工件(DAO 实现)来改进应用程序开发过程。

关系数据库(Oracle,MySQL 等等)。 没有 SQL 数据库(MongoDB,Redis,Apache Cassandra 等) 无 SQL 图形数据库(Neo4j 等)。 在本实训中,我们将讨论 Spring DATA Neo4j 模块架构。 这个架构几乎类似于上面提到的所有类型的数据库。 它仅在几个组件名称不同。

Spring DATA Neo4j 架构

在开始 Spring DATA Neo4j 开发之前,首先我们将了解这个模块的架构。

下图显示了Spring DATA Neo4j 模块的体系结构。

,

Spring DATA Neo4j 存储库

它提供了不同的 API 来支持不同的场景。

  • GraphRepository:它用于执行 Basic Neo4j DB 操作。
  • GraphTemplate:像其他模块一样,它是执行 Neo4j DB 操作的 Spring 模板。
  • CrudRepository:它用于使用 Cypher 查询语言(CQL)执行 Neo4j CRUD 操作。
  • PaginationAndSortingRepository:它用于执行 Neo4j CQL 查询结果的分页和排序。 这些是 Java 类。 每个具有执行 Neo4j 数据库操作的特定目的。

Neo4j 驱动程序:当我们使用 Spring DATA Neo4j 模块 API 来执行一些数据库操作时,Spring DATA Neo4j Jars 在内部使用这些驱动程序 Jars 来交互和执行 Neo4j 数据库操作。

本关要求

根据相关知识完成右侧选择题。

测试说明

若选择题答案与正确答案一致则可通关。

题目答案

1、下面属于 Spring JDBC 模块的缺点的是:C
A、少量的 boiler plate 代码来执行简单的数据库操作
B、减少了大量 DAO 层工件的维护
C、增加实现大量 DAO 图构件的开发时间
D、DAO 层中的工件少2、下面属于 Spring 数据模块的优点是:ABCD
A、消除 DAO 层中的 boiler plate 代码
B、DAO 层中的工件少
C、易于开发和维护
D、改进开发过程3、Spring DATA Neo4j 存储库 提供了哪些不同的 API 来支持不同的场景。ABCD
A、GraphRepository
B、GraphTemplate
C、CrudRepository
D、PaginationAndSortingRepository4、Spring 是▁▁▁框架,很容易开发基于企业 Java 的应用程序。
填空1答案:开源5、Spring DATA 模块仅适用于为 Neo4j 数据库实现 DAO 层。
错误

第2关:Spring DATA Neo4J

任务描述

本关任务:基于 SpringBoot 查询 Neo4j 中的信息。

相关知识

为了完成本关任务,你需要掌握:

  1. Spring DATA Neo4J 环境;
  2. Spring DATA Neo4j 示例。

Spring DATA Neo4J 环境

在 Pom 文件中添加需要的依赖。

Spring DATA Neo4j 模块 Jar 文件:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId></dependency>

这个依赖是最重要的,里面包含了 Neo4j 所需的所有 Jar 文件。

基于 SpringBoot 所需要的完整 pom 文件为:

    <properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.3.7.RELEASE</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

配置 :

# 连接的 Neo4j 数据库地址
spring.data.neo4j.uri= bolt://localhost:11002
# username
spring.data.neo4j.username=neo4j
# password
spring.data.neo4j.password=123456

Spring DATA Neo4j 示例

Spring DATA Neo4j 模块注释

我们将使用以下 Spring Framework 注释来开发此应用程序。

Spring DATA Neo4j 注解用法
@GraphEntity定义域类Neo4j Entity
@GraphID定义节点或关系id
@GraphProperty定义节点或关系属性

实现 Spring DATA Neo4j 应用程序的简要步骤:

  • 开发图表实体或域或 POJO 类;
  • 开发 DAO 或存储库;
  • 开发服务层(如果需要);
  • Spring DATA Neo4j XML 配置。
Entity 实体类模块

需要创建一个 entity 包,存放实体类。 在包下创建一个实体类 Person 类:

import lombok.Data;
import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Property;
import java.io.Serializable;
@Data
// 设置节点标签
@NodeEntity(label = "person")
// 序列化
public class Person implements Serializable {// 自动生成 id@Id@GeneratedValueprivate Long id;// 设置属性@Propertyprivate String name;
}

关键注释:

  • @Data:自动创建 GetSet 方法;
  • @NodeEntity(label = "person"):设置节点实体的标签;
  • @Id、@GeneratedValue:自动生成节点 id;
  • @Property:设置节点属性。
开发 Spring DATA Neo4j 存储库

Spring DATA Neo4j 将在内部为此接口提供实现。 为我们的 Person 类定义一个存储库或 DAO 接口:PersonRepository,接口需要继承 Neo4jRepository<T,ID>接口。(T 为你要传入的实体类) PersonRepository:

public interface PersonRepository extends Neo4jRepository<Person,Long> {}

创建完后我们就可以直接对 PersonRepository 接口进行实例化,直接调用,我们所需要的方法即可。 可以实现的数据库操作为:

  • 增:save(Entity)

    // 创建实体类
    Person person = new Person();
    // 设置实体类属性
    person.setName("玉皇大帝");
    // 使用接口创建节点
    personRepository.save(person);
    
  • 删:deleteAll()deleteByID()delete() deleteAll():删除所有节点; deleteByID(id):传入所需要删除节点的 Id,即可删除其节点; delete(entity):传入一个实体类,即可删除与这个实体类相同的属性的节点。

  • 查:findAll()findById() findById(id):通过节点的 Id 对节点进行查询; findAll():查询所有节点暑假。、; findAll(int i):查询关系深度; findAll(Sort sort):选择排序方式进行查询所有节点信息。

  • 改:可以通过结合前面三中方法进行操作。

编程要求

根据提示,在右侧编辑器补充代码, 完成四个文件代码文件的内容补充:PersonRepository.javatestController.javaPerson.javaapplication.properties

  1. 创建 Person 类:属性为 name:演员姓名、born:出生年份,节点标签为:person

  2. 配置 Neo4j 数据库连接配置;Neo4j 数据库的端口号为:7687

  3. 使用接口和实体类进行创建节点,创建 3 个节点节点属性如下:

    born,name
    1996,汤姆-赫兰德
    1998,赵露思
    2001,张子枫
    1999,吴磊
    

测试说明

平台会对你编写的代码进行测试:

测试输入:; 预期输出:

创建成功
n
(:person {name: "汤姆-赫兰德", born: "1996"})
(:person {name: "赵露思", born: "1998"})
(:person {name: "张子枫", born: "2001"})
(:person {name: "吴磊", born: "1999"})

答案

PersonRepository.java

package com.example.comstartneo4j.dao;import com.example.comstartneo4j.entity.Person;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.stereotype.Repository;
/********** Begin **********/
@Repository
public interface PersonRepository extends Neo4jRepository<Person, Long> {}
/********** End **********/

testController.java

package com.example.comstartneo4j.controller;import com.example.comstartneo4j.dao.PersonRelationshipRepository;
import com.example.comstartneo4j.dao.PersonRepository;
import com.example.comstartneo4j.entity.Person;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.Optional;@RestController
public class testController {/********** Begin **********/@Resourceprivate PersonRepository personRepository;@GetMapping("create")public String create() {// 创建实体类,并设置实体类属性Person proson1 = new Person("汤姆-赫兰德", "1996");Person proson2 = new Person("赵露思", "1998");Person proson3 = new Person("张子枫", "2001");Person proson4 = new Person("吴磊", "1999");// 使用接口创建节点personRepository.save(proson1);personRepository.save(proson2);personRepository.save(proson3);personRepository.save(proson4);return "创建成功\n";}/********** End **********/
}

Person.java

package com.example.comstartneo4j.entity;import lombok.Data;
import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Property;import java.io.Serializable;
/********** Begin **********/
@Data
// 设置节点标签
@NodeEntity(label = "person")
// 序列化
public class Person implements Serializable {// 自动生成 id@Id@GeneratedValueprivate Long id;// 设置属性@Propertyprivate String name;private String born;public Person(String name, String born) {this.name = name;this.born = born;}
}
/********** End **********/

application.properties

# 应用名称
spring.application.name=com.start.neo4j
# 应用服务 WEB 访问端口
server.port=8081# neo4j配置信息
/********** Begin **********/
# 连接的 Neo4j 数据库地址
spring.data.neo4j.uri=bolt://localhost:7687
# username
spring.data.neo4j.username=neo4j
# password
spring.data.neo4j.password=123456
/********** End **********/

注解

下述定义注解如果使用 @Autowired 会报错

@Resource
private PersonRepository personRepository;

可能是因为 Spring 框架没有可注入的 PersonRepository Bean。在使用 @Resource 注解时,Spring 会尝试找到与所注入 Bean 的名字相匹配的 Bean。如果找不到匹配的 Bean, @Resource 注解会容忍这个缺失,而不会抛出异常。然而,@Autowired 注解需要找到精确匹配的 Bean,否则会抛出异常("Bean"是指 Spring 容器中的对象实例)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

键盘敲入一个字母,操作系统发生了什么?

一、设备控制器 我们的电脑设备可以接非常多的输入输出设备&#xff0c;比如鼠标键盘网卡硬盘打印机等&#xff0c;每个设备的用法和功能都不相同&#xff0c;那操作系统是如何把这些输入输出设备统一管理的呢&#xff1f; 为了屏蔽设备之间的差异&#xff0c;每个设备都有一…

自定义 element DatePicker组件指令 使选择器呈现为只读状态,用户无法直接编辑,但可以查看和选择日期

1.问题 现实中遇到列表的搜索条件使用DatePicker 组件进行开始结束时间筛选&#xff0c;但是手动修改input中的值&#xff0c;导致请求参数异常。比如讲clearable设置为false之后还是能手动清空输入框中的值。虽然组件提供了readonly 属性&#xff0c;但是也会让日期选择也无法…

如何提高3D建模技能?

无论是制作影视动画还是视频游戏&#xff0c;提高3D建模技能对于你的工作都至关重要的。那么如何能创建出精美的3D模型呢&#xff1f;本文给大家一些3D建模技能方面的建议。 3D建模通过专门的软件完成&#xff0c;涉及制作三维对象。这项技能在视频游戏开发、建筑、动画和产品…

Stable Video Diffusion(SVD)参数使用教程

Stable Video Diffusion&#xff08;SVD&#xff09;安装和测试 官网 github | https://github.com/Stability-AI/generative-modelsHugging Face | https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xtPaper | https://stability.ai/research/stable-vid…

CentOS7 网络配置

前言&#xff1a; 安装虚拟机后&#xff0c;在虚拟机ping www.baidu.com ping不通。 一、centos7配置IP地址有两种方法&#xff1a; 动态获取IP&#xff08;不推荐使用&#xff09;设置静态ip&#xff08;推荐&#xff09; 二、centos7配置静态IP&#xff1a; 第一步&#xff…

网络视频怎么更改IP?使用静态IP更改地址有哪些好处?

随着互联网的普及&#xff0c;越来越多的人开始使用网络视频。有时候&#xff0c;我们可能会遇到需要更改网络视频的IP地址的情况。那么&#xff0c;如何更改IP地址呢&#xff1f;使用静态IP更改地址又有哪些好处呢&#xff1f; 首先&#xff0c;我们来了解一下什么是静态IP地址…

OpenCV快速入门:彩蛋——小游戏制作

文章目录 前言一、游戏玩法1.1 核心玩法1.2 特殊事件 二、功能模块划分2.1 主游戏文件 (main.py)2.2 游戏对象 (game_objects.py)2.3 游戏逻辑 (game_logic.py)2.4 事件和奖励 (events_and_rewards.py)2.5. 游戏界面 (game_ui.py) 三、完整代码3.1 主游戏文件 (main.py)3.1.1 游…

使用JAVA语言写一个排队叫号的小程序

以下是一个简单的排队叫号的小程序&#xff0c;使用JAVA语言实现。 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class NumberingSystem {public static void main(String[] args) {Queue<String> queue new LinkedList<…

Springboot快速整合kafka

kafka的基本了解 kafka也是 目前常用的消息中间件,支持同步与异步通信,和rabbitmq一样,工作模式大概相同,并且被spingboot整合的后的都是 中间件Template的实列化客户端类 ,消费者监听注解为KafkaListener,和RabbitListener和很相似,这些消息中间件使用过后,发现大致都是相同的…

[c++]—string类___深度学习string标准库成员函数与非成员函数

要相信别人能做出来自己一定可以做出来&#xff0c;只不过是时间没到而已 目录 &#x1f6a9;string类对象capacity操作 &#x1f4bb;reserve()保留 &#x1f4bb;resize() &#x1f6a9;string类对象元素访问操作 &#x1f4bb;operator[]和at() &#x1f4bb;operator…

基于AT89C51单片机的节日彩灯门设计

1&#xff0e;设计任务 本设计采用单片机为主控芯片&#xff0c;结合外围电路组成彩灯门的控制系统器&#xff0c;用来控制16个彩色的LED发光&#xff0c;实现彩色亮点的循环移动&#xff1b;通过软件编程实现各种各样的彩色亮点平面循环移动&#xff0c;该彩色控制器可以通过输…

【开源】基于Vue+SpringBoot的高校宿舍调配管理系统

项目编号&#xff1a; S 051 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S051&#xff0c;文末获取源码。} 项目编号&#xff1a;S051&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统…