对于最新稳定版本,请使用Spring Data Neo4j 8.0.0spring-doc.cadn.net.cn

开始

我们为 SDN 提供了 Spring Boot Starters。 请通过依赖管理包含入门模块,并配置螺栓URL以便使用,例如。spring.neo4j.uri=bolt://localhost:7687. 启动程序假设服务器已禁用认证。 由于SDNStarters依赖于Java驱动的Starters,所有关于配置的内容在这里也适用。 如需参考可用属性,请使用你的IDE自动补全功能。春.neo4jNamespace。spring-doc.cadn.net.cn

这些都包含在同一个二元进制中。 响应式编程模型则需要数据库端的4+ Neo4j服务器和响应式Spring。spring-doc.cadn.net.cn

准备数据库

在这个例子中,我们停留在电影图表内,因为每个Neo4j实例都会免费提供。spring-doc.cadn.net.cn

如果你没有运行数据库但安装了 Docker,请运行:spring-doc.cadn.net.cn

在 Docker 内启动一个本地的 Neo4j 实例。
docker run --publish=7474:7474 --publish=7687:7687 -e 'NEO4J_AUTH=neo4j/secret' neo4j:5

你现在可以访问 http://localhost:7474。 上述命令将服务器密码设置为秘密. 请注意提示符中准备运行的命令 (:p莱电影). 执行它,用测试数据填充你的数据库。spring-doc.cadn.net.cn

创建一个新的 Spring Boot 项目

搭建 Spring Boot 项目最简单的方法是 start.spring.io(它也集成在主要的 IDE 里,如果你不想用网站的话)。spring-doc.cadn.net.cn

选择“Spring Web Starter”,获取创建基于 Spring 的网页应用所需的所有依赖。 Spring Initializr 会帮你创建一个有效的项目结构,包含所选构建工具的所有文件和设置。spring-doc.cadn.net.cn

使用 Maven

你可以对 Spring 初始化器发出 curl 请求,创建一个基础的 Maven 项目:spring-doc.cadn.net.cn

用 Spring Initializr 创建一个基础的 Maven 项目
curl https://start.spring.io/starter.tgz \
  -d dependencies=webflux,data-neo4j  \
  -d bootVersion=3.2.0 \
  -d baseDir=Neo4jSpringBootExample \
  -d name=Neo4j%20SpringBoot%20Example | tar -xzvf -

这会创建一个新文件夹Neo4jSpringBootExample(Neo4jSpringBootExample). 由于这个起始程序还没有在初始化器上,你需要手动添加以下依赖项到pom.xml:spring-doc.cadn.net.cn

在Maven项目中包含spring-data-neo4j-spring-boot-starter
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

如果是已有项目,你也会手动添加依赖。spring-doc.cadn.net.cn

使用 Gradle

原理相同,只需生成一个Gradle项目:spring-doc.cadn.net.cn

用 Spring Initializr 创建一个基础的 Gradle 项目
curl https://start.spring.io/starter.tgz \
  -d dependencies=webflux,data-neo4j \
  -d type=gradle-project \
  -d bootVersion=3.2.0 \
  -d baseDir=Neo4jSpringBootExampleGradle \
  -d name=Neo4j%20SpringBoot%20Example | tar -xzvf -

Gradle的依赖结构如下,必须添加build.gradle:spring-doc.cadn.net.cn

在 Gradle 项目中包含 spring-data-neo4j-spring-boot-starter
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
}

如果是已有项目,你也会手动添加依赖。spring-doc.cadn.net.cn

配置项目

现在在你喜欢的IDE中打开任一项目。 找到application.properties并配置您的Neo4j凭证:spring-doc.cadn.net.cn

spring.neo4j.uri=bolt://localhost:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=verysecret

这只是连接 Neo4j 实例所需的最低要求。spring-doc.cadn.net.cn

使用该Starters时无需添加任何驱动程序的程序化配置。 SDN仓库将由该Starters自动启用。

Configure Neo4j Cypher-DSL

根据你运行应用的 Neo4j 版本, 建议配置 Neo4j 密码-DSL 所运行的方言。 默认使用的方言是针对 Neo4j 4.4。作为Neo4j的LTS版本。 这可以通过定义密码-DSL来改变配置豆。spring-doc.cadn.net.cn

让Cypher-DSL使用Neo4j 5方言
@Bean
Configuration cypherDslConfiguration() {
	return Configuration.newConfig()
                .withDialect(Dialect.NEO4J_5).build();
}
虽然 Spring Data Neo4j 尽力兼容 Neo4j 5 和默认方言的组合, 建议始终明确定义方言。 例如,这将带来更优化的查询,并利用elementId()用于较新的Neo4j版本。

在模块路径上运行

Spring Data Neo4j 可以在模块路径上运行。它的自动模块名称是Spring.data.neo4j. 由于当前 Spring Data 构建设置的限制,它本身不提供模块。 因此,它使用了一个自动但稳定的模块名称。不过,这确实取决于情况 一个模块化库(Cypher-DSL)。没有module-info.java由于 上述限制,我们无法代表您表达对该图书馆的需求。spring-doc.cadn.net.cn

因此,最低要求module-info.java在你的项目中,用于在模块路径上运行 Spring Data Neo4j 6.1+。 如下:spring-doc.cadn.net.cn

一个module-info.java在一个项目中,该项目应在模块路径上使用 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; (1)

	exports your.domain; (2)
}
1 Spring Data Neo4j 使用 Spring Data Commons 及其反射功能,因此你需要打开你的域名包到Spring.core至少。
2 我们假设your.domain还包含仓库:这些仓库必须导出才能被Spring豆,Spring。背景Spring.data.commons. 如果你不想把它们导出到世界,你可以限制它们只能使用那些模块。

创建您的域名

我们的域层应该实现两个目标:spring-doc.cadn.net.cn

节点实体示例

SDN 完全支持不可修改的实体,适用于 Java 和数据Kotlin 中的类。因此,我们将重点讨论不可变实体,MovieEntity.java 展示了这样一个实体。spring-doc.cadn.net.cn

SDN 支持所有 Neo4j Java 驱动支持的数据类型,详见“密码类型系统”章节中的“将 Neo4j 类型映射到本地语言类型”。未来版本将支持更多转换器。
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") (1)
public class MovieEntity {

	@Id (2)
	private final String title;

	@Property("tagline") (3)
	private final String description;

	@Relationship(type = "ACTED_IN", direction = Direction.INCOMING) (4)
	private List<Roles> actorsAndRoles = new ArrayList<>();

	@Relationship(type = "DIRECTED", direction = Direction.INCOMING)
	private List<PersonEntity> directors = new ArrayList<>();

	public MovieEntity(String title, String description) { (5)
		this.title = title;
		this.description = description;
	}

	// Getters omitted for brevity
}
1 @Node用于标记该类为托管实体。它也用于配置 Neo4j 标签。如果你只是用普通 ,标签默认是类名@Node.
2 每个实体都必须有一个ID。这里展示的电影类使用了属性标题作为唯一的商业密钥。如果你没有这样的唯一密钥,你可以使用以下组合@Id@GeneratedValue配置SDN以使用Neo4j的内部ID。我们还提供UUID的生成器。
3 这显示了@Property作为一种用不同名称来表示字段和图属性名称的方法。
4 这定义了与类型类别的关系PersonEntity以及关系类型ACTED_IN
5 这是你的应用代码要使用的构造函数。

一般来说:使用内部生成的ID的不可变实体有点矛盾,因为SDN需要一种方法来设置数据库生成的字段。spring-doc.cadn.net.cn

如果你找不到好的业务密钥,或者不想用ID生成器,这里有同一个实体,使用内部生成的ID,搭配一个普通构造函数和一个SDN使用的所谓wither-Methodspring-doc.cadn.net.cn

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) { (1)
		this.id = null;
		this.title = title;
		this.description = description;
	}

	public MovieEntity withId(Long id) { (2)
		if (this.id.equals(id)) {
			return this;
		} else {
			MovieEntity newObject = new MovieEntity(this.title, this.description);
			newObject.id = id;
			return newObject;
		}
	}
}
1 这是你的应用代码要使用的构造函数。它将 id 设置为空,因为包含内部 id 的字段不应作。
2 这就是所谓的枯萎身份证-属性。 它创建一个新实体并相应设置字段,而无需修改原实体,从而使其不可变。

当然,你也可以用 SDN 配合 Kotlin,并用 Kotlin 的数据类来建模你的领域。如果你想或需要完全用 Java 语言,Project Lombok 是一个替代方案。spring-doc.cadn.net.cn

声明春季数据仓库

你基本上有两个选择:你可以用 SDN 实现不依赖于店铺的方式,并让你的领域扩展成为其中之一spring-doc.cadn.net.cn

根据情况选择命令式和响应式。spring-doc.cadn.net.cn

虽然技术上不禁止,但不建议在同一应用中混合命令式和响应式数据库访问。我们不会支持你处理此类情况。

另一种选择是选择特定商店的实现,并获得我们开箱即用的所有方法。这种方法的优点也是最大的缺点:一旦使用,所有这些方法都会成为你的 API 的一部分。大多数时候,移除某些东西比事后添加更难。此外,使用商店具体功能会把你的商店泄漏到你的域名中。从性能角度看,没有任何惩罚。spring-doc.cadn.net.cn

适用于上述任何电影实体的响应式仓库如下:spring-doc.cadn.net.cn

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的相关文档,或查看我们的示例代码。