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

从 SDN+OGM 迁移到 SDN

过去SDN+OGM迁移的已知问题

SDN+OGM多年来有着丰富的历史,我们理解迁移大型应用系统既不有趣,也不能立即带来利润。 我们在从旧版 Spring Data Neo4j 迁移到新版本时观察到的主要问题大致如下:spring-doc.cadn.net.cn

跳过了不止一次重大升级

虽然 Neo4j-OGM 可以单独使用,但 Spring Data Neo4j 不能。 它在很大程度上依赖于Spring数据,因此也依赖于Spring框架本身,最终影响应用的大部分部分。 根据应用的结构,也就是框架部分在业务代码中渗透的程度,你就需要更多地调整应用。 当你的应用中有多个 Spring Data 模块时,情况会更糟,尤其是你访问的是与图数据库同一服务层的关系型数据库。 更新两个对象映射框架并不有趣。spring-doc.cadn.net.cn

依赖通过 Spring Data 本身配置的嵌入式数据库

SDN+OGM项目中的嵌入式数据库由Neo4j-OGM配置。 比如你想从 Neo4j 3.0 升级到 3.5,不升级整个应用是做不到的。 为什么? 当你选择将数据库嵌入应用时,你就把自己绑定进了配置这个嵌入式数据库的模块。 要有另一个嵌入式数据库版本,你必须升级配置它的模块,因为旧模块不支持新数据库。 因为总有对应Neo4j-OGM的Spring Data版本,你也得升级它。 然而,Spring Data依赖于Spring Framework,然后第一个项目符号中的参数会适用。spring-doc.cadn.net.cn

不确定该包含哪些构建模块

准确使用术语并不容易。 我们在这里编写了SDN+OGM设置的构建模块。 可能是所有这些设备都是巧合添加的,你遇到了很多相互冲突的依赖。spring-doc.cadn.net.cn

基于这些观察,我们建议在从SDN+OGM切换到SDN之前,确保你当前应用中只使用Bolt或http传输。 因此,你的应用及其访问层在很大程度上独立于数据库的版本。 从该状态,考虑从SDN+OGM切换到SDN。

准备从 SDN+OGM Lovelace 或 SDN+OGM Moore 迁移到 SDN

Lovelace 发布列对应 SDN 5.1.x 和 OGM 3.1.x,而 Moore 则是 SDN 5.2.x 和 OGM 3.2.x。

首先,你必须确保你的应用能在Bolt协议的服务器模式下运行于Neo4j,这意味着在三种情况下有两种情况是正常工作的:spring-doc.cadn.net.cn

你现在在嵌入式

你补充了org.neo4j:neo4j-ogm-embedded-driverorg.neo4j:neo4j通过OGM设施进行项目和启动数据库。 这已经不再支持了,你需要搭建一个标准的Neo4j服务器(支持独立和集群)。spring-doc.cadn.net.cn

上述依赖必须被移除。spring-doc.cadn.net.cn

从嵌入式解决方案迁移可能是最难的,因为你还需要搭建服务器。 不过,它本身就给你带来了很大的价值: 未来,你可以直接升级数据库本身,而无需考虑你的应用框架和数据访问框架。spring-doc.cadn.net.cn

你正在使用 HTTP 传输

你补充了org.neo4j:neo4j-ogm-http-driver并配置了像这样的URL。用户:password@localhost:7474. 依赖必须被替换为org.neo4j:neo4j-ogm-bolt-driver你需要配置一个像 Bolt 的 URLbolt://localhost:7687或者使用新的neo4j@Scheme,也负责路由。spring-doc.cadn.net.cn

你已经间接使用了Bolt

默认的SDN+OGM项目使用org.neo4j:neo4j-ogm-bolt-driver因此间接地说,这就是纯Java驱动程序。 你可以保留现有的网址。spring-doc.cadn.net.cn

迁移

一旦你确认你的SDN+OGM应用能正常通过Bolt运行,就可以开始迁移到SDN。spring-doc.cadn.net.cn

你不能通过XML配置SDN。 如果你用 SDN+OGM 应用做过这件事,务必学习 Spring 应用的注释驱动或函数配置。 现在最简单的选择是春季靴。 有了起始程序,除了连接URL和认证外,所有必要的部分都已经为你配置好了。
旧房产与新房产的比较
# Old
spring.data.neo4j.embedded.enabled=false # No longer supported
spring.data.neo4j.uri=bolt://localhost:7687
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=secret

# New
spring.neo4j.uri=bolt://localhost:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=secret
这些新属性未来可能会再次变化,因为SDN和驱动最终完全替换了旧的设置。

最后,加入新的依赖,详见“Gradle和Maven的入门指南”。spring-doc.cadn.net.cn

然后你就可以替换注释了:spring-doc.cadn.net.cn

新增功能

org.neo4j.ogm.annotation.NodeEntityspring-doc.cadn.net.cn

org.springframework.data.neo4j.core.schema.Nodespring-doc.cadn.net.cn

org.neo4j.ogm.annotation.GeneratedValuespring-doc.cadn.net.cn

org.springframework.data.neo4j.core.schema.GeneratedValuespring-doc.cadn.net.cn

org.neo4j.ogm.annotation.Idspring-doc.cadn.net.cn

org.springframework.data.neo4j.core.schema.Idspring-doc.cadn.net.cn

org.neo4j.ogm.annotation.Propertyspring-doc.cadn.net.cn

org.springframework.data.neo4j.core.schema.Propertyspring-doc.cadn.net.cn

org.neo4j.ogm.注释.关系spring-doc.cadn.net.cn

org.springframework.data.neo4j.core.schema.Relationshipspring-doc.cadn.net.cn

org.springframework.data.neo4j.annotation.EnableBookmarkManagementspring-doc.cadn.net.cn

不需要更换,也不需要spring-doc.cadn.net.cn

org.springframework.data.neo4j.annotation.UseBookmarkspring-doc.cadn.net.cn

不需要更换,也不需要spring-doc.cadn.net.cn

org.springframework.data.neo4j.annotation.QueryResultspring-doc.cadn.net.cn

使用投影;不再支持任意结果映射spring-doc.cadn.net.cn

若干 Neo4j-OGM 注释尚未在 SDN 中拥有对应注释,有些甚至永远不会有。 随着我们支持更多功能,我们会在上述列表中添加内容。

书签管理

@EnableBookmarkManagement@UseBookmark以及org.springframework.data.neo4j.bookmark.BookmarkManager(目录管理器)接口及其唯一实现org.springframework.data.neo4j.bookmark.CaffeineBookmarkManager已经消失,不再需要。spring-doc.cadn.net.cn

SDN为所有交易使用书签,无需配置。 你可以去掉豆子声明咖啡因书签管理器以及 的依赖关系com.github.ben-manes.caffeine:caffeine.spring-doc.cadn.net.cn

如果非得这样做,可以按照这些说明关闭自动书签管理。spring-doc.cadn.net.cn

约束和索引的自动创建

SDN 5.3及更早版本提供了Neo4j-OGM的“自动索引管理器”。spring-doc.cadn.net.cn

@Index,@CompositeIndex@Required被移除且未更换。 为什么? 我们认为创建模式——即使是无模式数据库——也不属于领域建模的一部分。 你可以说SDN模型就是模式,但我们甚至更倾向于命令-查询分离, 这意味着我们更愿意定义独立的读写模型。 这些工具在写“无聊”内容和阅读图表形答案时非常有用。spring-doc.cadn.net.cn

除此之外,其中一些注释的值分别与特定的Neo4j版本绑定,因此它们属于 很难维持。spring-doc.cadn.net.cn

然而,最好的论点是转向生产环境:虽然所有生成模式的工具在开发过程中确实很有帮助,尤其是对强制严格方案的数据库来说, 在生产环境中它们往往不太友好:你如何处理不同版本的应用程序同时运行? 版本A断言新版本B创建的索引?spring-doc.cadn.net.cn

我们认为最好事先掌控,建议使用受控数据库迁移,比如LiquigraphNeo4j迁移工具。 后者在JHipster项目中的SDN中被发现。 两个项目的共同点是都将当前版本的模式存储在数据库中,并确保模式符合预期,然后才进行更新。spring-doc.cadn.net.cn

迁移出之前的Neo4j-OGM注释会影响@Index,@CompositeIndex@Required这里给出了一个使用 Neo4j-OGM 自动索引管理器的类示例:spring-doc.cadn.net.cn

一个使用 Neo4j-OGM 自动索引管理器的类
import org.neo4j.ogm.annotation.CompositeIndex;
import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.Index;
import org.neo4j.ogm.annotation.Required;

@CompositeIndex(properties = {"tagline", "released"})
public class Movie {

    @Id @GeneratedValue Long id;

    @Index(unique = true)
    private String title;

    private String description;

    private String tagline;

    @Required
    private Integer released;
}

其注释等同于 Cypher 中的以下方案(截至 Neo4j 4.2):spring-doc.cadn.net.cn

基于密码的迁移示例
CREATE CONSTRAINT movies_unique_title ON (m:Movie) ASSERT m.title IS UNIQUE;
CREATE CONSTRAINT movies_released_exists ON (m:Movie) ASSERT EXISTS (m.released);
CREATE INDEX movies_tagline_released_idx FOR (m:Movie) ON (m.tagline, m.released);

@Index没有唯一 = 真等价于为(m:电影)创建索引movie_title_index (m.title). 注意,唯一索引已经蕴含了一个索引。spring-doc.cadn.net.cn