SpringBoot 整合 Neo4j 实战(头歌)

news2024/12/24 20:22:30

文章目录

  • 第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、PaginationAndSortingRepository

4、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
    @GeneratedValue
    private Long id;
    // 设置属性
    @Property
    private 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 **********/
    @Resource
    private 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
    @GeneratedValue
    private Long id;
    // 设置属性
    @Property
    private 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.coloradmin.cn/o/1273808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【腾讯云云上实验室】个人对腾讯云向量数据库的体验心得

目录 前言Tencent Cloud VectorDB概念使用初体验腾讯云向量数据库的优势应用场景有哪些&#xff1f;未来展望番外篇&#xff1a;腾讯云向量数据库的设计核心结语 前言 还是那句话&#xff0c;不用多说想必大家都能猜到&#xff0c;现在技术圈最火的是什么&#xff1f;非人工智…

HyperBDR云容灾v4.10.1发布,划重点:支持UCloud云平台自动化容灾+新增可灵活定义的备份策略

版本更新 HyperBDR云容灾v4.10.1版本来啦&#xff01; 此次更新为大家带来了多个新功能&#xff0c;下面让我们来看看具体是哪些吧~ 01 策略管理新功能&#xff1a; 多时间段限速功能&#xff1a; 更加灵活的多个时间段限速选择&#xff0c;可以在创建策略时为不同的时间段设…

JavaEE——简单认识CSS

文章目录 一、简单了解什么是 CSS二、CSS 选择器1.标签选择器2.类选择器3.ID 选择器4.后代选择器5.子选择器6.伪类选择器 三、字体属性1.设置字体家族2.设置字体大小3.设置字体粗细4.文字倾斜 四、文本属性1.文本对齐2.文本装饰3.文本缩进4.背景设置 五、圆角矩形六、CSS 盒子模…

【猜数字游戏】用wxPython实现:基本的游戏框架 + 简单的图形用户界面

【猜数字游戏】 写在最前面猜数字游戏 实现【猜数字游戏】安装wxPython全部代码代码解析1. 初始化界面2. 生成随机数3. 处理猜测4. 特殊功能5. 分数计算 游戏小程序呈现结语 写在最前面 看到了一个比较有意思的问题 https://ask.csdn.net/questions/8038039 猜数字游戏 在这…

人工智能_机器学习056_拉格朗日乘子法原理推导_公式由来详解_原理详解---人工智能工作笔记0096

https://blog.csdn.net/Soft_Po/article/details/118332454 这里有老师的一篇文章介绍拉格朗日乘子法的原理推导 结合老师的这篇文章我们来看一下详细的推导过程 可以看到上一节我们说,一个有条件的,函数,可以转换为一个,无条件的函数, 根据拉格朗日乘子法,可以创建出一个等…

3.C转python

1.int()默认是按照十进制来转换的 2.在python中没有字符 3.可以这样写 4.特例 这样写才对(要空语句即pass空语句来占位) 5.python中没有swicth语句 6.while循环例子 7.死循环有时不是Bug 8.for循环例子 其中的range()函数中的第三个常数是步长 例子 再一个例子 9.使用shif…

【Node.js】笔记整理4 - 版本管理工具nvm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

无限移动的风景 css3 动画

<style>*{margin:0;padding:0;/* box-sizing: border-box; */}ul{list-style: none;}#nav{width:900px;height:100px;border:2px solid rgb(70, 69, 69);margin:100px auto; overflow: hidden;}#nav ul{animation:moving 5s linear infinite;width:200%; /*怎么模拟动画…

python爬虫基础知识

使用python进行网络爬虫开发之前&#xff0c;我们要对什么是浏览器、什么HTML&#xff0c;HTML构成。请求URL的方法都有一个大概了解才能更清晰的了解如何进行数据爬取。 什么是浏览器&#xff1f; 网页浏览器&#xff0c;简称为浏览器,是一种用于检索并展示万维网信息资源的…

二进制求和

这篇文章会收录到 : 算法通关村第十三关-白银挑战数字与数学高频问题-CSDN博客 二进制求和 描述 : 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 题目 : LeetCode 67.二进制求和 : 67. 二进制求和 分析 : 这个题也是用字符串来表示数据的…

qt 5.15.2压缩和解压缩功能

qt 5.15.2压缩和解压缩功能 主要是添加qt项目文件.pro内容&#xff1a; 这里要先下载quazip的c项目先编译后引入到本项目中/zip目录下 INCLUDEPATH ./zip CONFIG(debug, debug|release) {win32:win32-g: PRE_TARGETDEPS $$PWD/zip/libquazipd.awin32:win32-g: LIBS -L$$PWD…

nginx部署多个vue或react项目

下载nginx(tar.gz) nginx: download(官方地址) 部署nginx # 进入nginx压缩包所在目录 cd /usr/nginx# 解压 tar -zxvf nginx-1.25.3.tar.gz# 安装nginx的相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel# 生成Makefile可编译文件 cd /usr/ng…

SSM校园组团平台系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 校园组团平台系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

11-30 JavaWeb

修改与删除操作 防止空指针异常 localhost:8080 -> 分页查询 修改流程&#xff1a;(先查后改(两个servlet)) 修改&#xff1a; 传用户id(用户id怎么得到 -> 循环一次得到一个user 对象 user对象里用user.getId()得到用户id) UpdateUserQueryServlet.java &#xff08;…

Linux系统的常见命令十一,文本编辑器(vi和vim)

目录 vi命令vim命令vi命令与vim命令的区别 本文主要介绍Linux系统的文本编辑器命令vi和vim&#xff0c;还有它们之间的区别。 vi命令 vi是Linux和其他类Unix操作系统中最常用的文本编辑器之一&#xff0c;它的功能强大且灵活&#xff0c;可以通过键盘快捷键来完成大量的编辑操…

TZOJ 1387 人见人爱A+B

答案&#xff1a; #include <stdio.h> void time(int ah, int am, int as, int bh, int bm, int bs, int* sum_h, int* sum_m, int* sum_s) //不需要返回值所以定义void函数&#xff0c;前面6个为输入&#xff0c;然后用指针存给后面三个 {*sum_s (as bs) % 60; …

【办公软件】Outlook启动一直显示“正在启动”的解决方法

早上打开电脑Outlook2016以后&#xff0c;半个多小时了&#xff0c;一直显示这个界面&#xff1a; 解决办法 按WIN R键打开“运行”&#xff0c;输入如下命令&#xff1a; outlook.exe /safe 然后点击“确定” 这样就进入了Outlook的安全模式。 点击“文件”->“选项”-…

ubuntu18.04安装miniconda和mysql

MySQL 1.更新软件包 apt-get update 2.mysql安装 apt-get install mysql-server 3.初始化配置mysql mysql_secure_installation 第一个选项是问你要不要安装密码插件&#xff0c;就是说安装了之后你必须用安全度很高的密码&#xff0c;不安装的话&#xff0c;可以随意设…

6.16二叉搜索树中的搜索(LC700-E)

算法&#xff1a; 二叉搜索树自带顺序&#xff0c;所以不用强调前、中、后序。 调试过程&#xff1a; 原因&#xff1a;初始化变量result时&#xff0c;没有给result赋值 正确代码&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int…

在Spring Boot中使用JavaMailSender发送邮件

用了这么久的Spring Boot&#xff0c;我们对Spring Boot的了解应该也逐步进入正轨了&#xff0c;这篇文章讲的案例也在我们的实际开发中算是比较实用的了&#xff0c;毕竟我们完成注册功能和对用户群发消息&#xff0c;都可以采用到邮箱发送功能&#xff0c;往下看&#xff0c;…