原题目:Spring认证中国教育管理中心-Spring Data Neo4j教程一(Spring中国教育管理中心)

Spring认证-Spring Data Neo4j教程一

  1. 开始
    咱们为 SDN 提供了 Spring Boot 启动器。请通过您的依赖治理蕴含启动模块并配置要应用的螺栓 URL,例如org.neo4j.driver.uri=bolt://localhost:7687. 启动器假设服务器已禁用身份验证。因为 SDN 启动器依赖于 Java 驱动程序的启动器,因而无关配置的所有内容在此处也实用。无关可用属性的参考,请应用org.neo4j.driver命名空间中的 IDE 主动实现性能或查看专用手册。

SDN反对

家喻户晓和了解的命令式编程模型(很像 Spring Data JDBC 或 JPA)
基于Reactive Streams的反应式编程,包含对反应式事务的齐全反对。
这些都蕴含在同一个二进制文件中。反应式编程模型在数据库端须要 4.0 Neo4j 服务器,另一方面须要反应式 Spring。

5.1筹备数据库
对于这个例子,咱们停留在movie graph 中,因为它随每个 Neo4j 实例收费提供。

如果您没有正在运行的数据库但装置了 Docker,请运行:

清单 1. 在 Docker 中启动一个本地 Neo4j 实例。

docker run --publish=7474:7474 --publish=7687:7687 -e 'NEO4J_AUTH=neo4j/secret' neo4j:4.3.6
您当初能够拜访http://localhost:7474。下面的命令将服务器的明码设置为secret. :play movies请留神在提示符 ( )中筹备好运行的命令。执行它以用一些测试数据填充您的数据库。

5.2.创立一个新的 Spring Boot 我的项目
设置 Spring Boot 我的项目的最简略办法是start.spring.io (它也集成在次要 IDE 中,以防您不想应用该网站)。

抉择“Spring Web Starter”以获取创立基于 Spring 的 Web 应用程序所需的所有依赖项。Spring Initializr 将负责为您创立一个无效的我的项目构造,其中蕴含所选构建工具的所有文件和设置。

5.2.1应用 Maven
您能够针对 Spring Initializer 收回curl申请以创立根本的 Maven 我的项目:

清单 2. 应用 Spring Initializr 创立一个根本的 Maven 我的项目

curl https://start.spring.io/start... \
-d dependencies=webflux,actuator,data-neo4j \
-d bootVersion=2.5.3 \
-d baseDir=Neo4jSpringBootExample \
-d name=Neo4j%20SpringBoot%20Example | tar -xzvf -
这将创立一个新文件夹Neo4jSpringBootExample。因为这个启动器还没有在初始化器上,您必须手动将以下依赖项增加到您的pom.xml:

清单 3. 在 Maven 我的项目中蕴含
spring-data-neo4j-spring-boot-starter

<dependency>

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

</dependency>
如果是现有我的项目,您还能够手动增加依赖项。

5.2.2.应用 Gradle
思路是一样的,只是生成一个Gradle我的项目:

清单 4. 应用 Spring Initializr 创立一个根本的 Gradle 我的项目

curl https://start.spring.io/start... \
-d dependencies=webflux,actuator,data-neo4j \
-d type=gradle-project \
-d bootVersion=2.5.3 \
-d baseDir=Neo4jSpringBootExampleGradle \
-d name=Neo4j%20SpringBoot%20Example | tar -xzvf -
Gradle 的依赖项如下所示,必须增加到build.gradle:

清单 5. 在 Gradle 我的项目中蕴含
spring-data-neo4j-spring-boot-starter

dependencies {

implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'

}
如果是现有我的项目,您还能够手动增加依赖项。

5.3.配置我的项目
当初在您最喜爱的 IDE 中关上这些我的项目中的任何一个。查找application.properties并配置您的 Neo4j 凭据:

spring.neo4j.uri=bolt://localhost:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=secret
这是连贯到 Neo4j 实例所需的最低限度。

应用此启动器时,无需增加驱动程序的任何编程配置。此启动器将主动启用 SDN 存储库。

5.4.在模块门路上运行 (Java 9+)
Spring Data Neo4j 能够在模块门路上运行。它的主动模块名称是spring.data.neo4j. 因为以后 Spring Data 构建设置的限度,它自身不提供模块。因而,它应用主动但稳固的模块名称。然而,它的确依赖于模块化库(Cypher-DSL)。因为module-info.java上述限度,咱们无奈代表您表白对该库的要求。

因而,module-info.java您的我的项目中在模块门路上运行 Spring Data Neo4j 6.1+ 所需的最低要求如下:

清单 6.module-info.java我的项目中的 A 应该在模块门路上应用 Spring Data Neo4j

module your.module {

    requires org.neo4j.cypherdsl.core;    requires spring.data.commons;    requires spring.data.neo4j;    opens your.domain to spring.core;     exports your.domain; 

}
Spring Data Neo4j 应用 Spring Data Commons 及其反射性能,因而您spring.core至多须要关上域包。

咱们假如这里your.domain还蕴含存储库:必须导出这些存储库能力被

spring.beans,spring.context和拜访spring.data.commons。如果您不想将它们导出到世界,您能够将它们限度在这些模块中。

5.5.创立您的域
咱们的畛域层应该实现两件事:

将图表映射到对象
提供拜访这些
5.5.1示例节点实体
SDN 齐全反对 Java 和dataKotlin 中的类的不可批改实体。因而,咱们将在这里关注不可变实体,清单 7显示了这样一个实体。

SDN 反对 Neo4j Java 驱动程序反对的所有数据类型,请参阅“Cypher 类型零碎”一章中将Neo4j 类型映射到本地语言类型。将来的版本将反对额定的转换器。

清单 7. MovieEntity.java

import java.util.ArrayList;
import java.util.List;

import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;
import org.springframework.data.neo4j.core.schema.Property;
import org.springframework.data.neo4j.core.schema.Relationship;
import org.springframework.data.neo4j.core.schema.Relationship.Direction;

@Node("Movie")
public class MovieEntity {

    @Id     private final String title;    @Property("tagline")     private final String description;    @Relationship(type = "ACTED_IN", direction = Direction.INCOMING)     private List<Roles> actorsAndRoles;    @Relationship(type = "DIRECTED", direction = Direction.INCOMING)    private List<PersonEntity> directors = new ArrayList<>();    public MovieEntity(String title, String description) {             this.title = title;            this.description = description;    }    // Getters omitted for brevity

}
Spring认证-Spring Data Neo4j教程一
@Node用于将此类标记为托管实体。它还用于配置 Neo4j 标签。如果您只是应用 plain ,标签默认为类的名称@Node。

每个实体都必须有一个 id。此处显示的电影类应用该属性title作为惟一的业务键。如果您没有这样的惟一密钥,您能够应用 和 的组合@Id来@GeneratedValue

配置 SDN 以应用 Neo4j 的外部 id。咱们还提供 UUID 的生成器。

这显示@Property了为字段应用与图形属性不同的名称的一种形式。

这定义了一个关系到一个类的类型PersonEntity和关系类型ACTED_IN

这是您的利用程序代码要应用的构造函数。

作为个别评论:应用外部生成的 id 的不可变实体有点矛盾,因为 SDN 须要一种办法来应用数据库生成的值设置字段。

如果您找不到好的业务密钥或不想应用生成器生成 ID,这里是应用外部生成的 id 以及惯例构造函数和所谓的wither -Method 的同一实体,SDN 应用该办法:

清单 8. MovieEntity.java

import org.springframework.data.neo4j.core.schema.GeneratedValue;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;
import org.springframework.data.neo4j.core.schema.Property;

import org.springframework.data.annotation.PersistenceConstructor;

@Node("Movie")
public class MovieEntity {

    @Id @GeneratedValue    private Long id;    private final String title;    @Property("tagline")    private final String description;    public MovieEntity(String title, String description) {             this.id = null;            this.title = title;            this.description = description;    }    public MovieEntity withId(Long id) {             if (this.id.equals(id)) {                    return this;            } else {                    MovieEntity newObject = new MovieEntity(this.title, this.description);                    newObject.id = id;                    return newObject;            }    }

}
Spring认证-Spring Data Neo4j教程一
这是您的利用程序代码要应用的构造函数。它将 id 设置为 null,因为不应操纵蕴含外部 id 的字段。

这就是所谓的-属性凋零id。它创立一个新实体并相应地设置字段,而不批改原始实体,从而使其不可变。

您当然能够将 SDN 与Kotlin一起应用,并应用 Kotlin 的数据类对您的域进行建模。 如果您想或须要纯正地留在 Java 中,Project Lombok是一个代替计划。

5.5.2.申明 Spring Data 存储库
您在这里基本上有两个抉择:您能够应用 SDN 以与商店无关的形式工作,并使您的域特定扩大之一

org.springframework.data.repository.Repository
org.springframework.data.repository.CrudRepository
org.springframework.data.repository.reactive.ReactiveCrudRepository
org.springframework.data.repository.reactive.ReactiveSortingRepository
相应地抉择命令式和反应式。

尽管技术上不禁止,但不倡议在同一个应用程序中混合命令式和反应式数据库拜访。咱们不会在这种状况下为您提供反对。

另一种抉择是抉择特定于商店的实现并取得咱们开箱即用的所有办法。这种办法的长处也是它最大的毛病:一旦进去,所有这些办法都将成为您 API 的一部分。大多数时候,拿走货色比预先增加货色更难。此外,应用商店细节会将您的商店透露到您的域中。从性能的角度来看,没有惩办。

适宜上述任何电影实体的反应式存储库如下所示:

清单 9. MovieRepository.java

import reactor.core.publisher.Mono;

import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository;

public interface MovieRepository extends ReactiveNeo4jRepository<MovieEntity, String> {

    Mono<MovieEntity> findOneByTitle(String title);

}
测试响应式代码是应用
reactor.test.StepVerifier. 查看Project Reactor的相应文档或查看咱们的示例代码。