|
对于最新稳定版本,请使用Spring Data Neo4j 8.0.0! |
从 SDN+OGM 迁移到 SDN
过去SDN+OGM迁移的已知问题
SDN+OGM多年来有着丰富的历史,我们理解迁移大型应用系统既不有趣,也不能立即带来利润。 我们在从旧版 Spring Data Neo4j 迁移到新版本时观察到的主要问题大致如下:
- 跳过了不止一次重大升级
-
虽然 Neo4j-OGM 可以单独使用,但 Spring Data Neo4j 不能。 它在很大程度上依赖于Spring数据,因此也依赖于Spring框架本身,最终影响应用的大部分部分。 根据应用的结构,也就是框架部分在业务代码中渗透的程度,你就需要更多地调整应用。 当你的应用中有多个 Spring Data 模块时,情况会更糟,尤其是你访问的是与图数据库同一服务层的关系型数据库。 更新两个对象映射框架并不有趣。
- 依赖通过 Spring Data 本身配置的嵌入式数据库
-
SDN+OGM项目中的嵌入式数据库由Neo4j-OGM配置。 比如你想从 Neo4j 3.0 升级到 3.5,不升级整个应用是做不到的。 为什么? 当你选择将数据库嵌入应用时,你就把自己绑定进了配置这个嵌入式数据库的模块。 要有另一个嵌入式数据库版本,你必须升级配置它的模块,因为旧模块不支持新数据库。 因为总有对应Neo4j-OGM的Spring Data版本,你也得升级它。 然而,Spring Data依赖于Spring Framework,然后第一个项目符号中的参数会适用。
- 不确定该包含哪些构建模块
-
准确使用术语并不容易。 我们在这里编写了SDN+OGM设置的构建模块。 可能是所有这些设备都是巧合添加的,你遇到了很多相互冲突的依赖。
| 基于这些观察,我们建议在从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,这意味着在三种情况下有两种情况是正常工作的:
你现在在嵌入式
你补充了org.neo4j:neo4j-ogm-embedded-driver和org.neo4j:neo4j通过OGM设施进行项目和启动数据库。
这已经不再支持了,你需要搭建一个标准的Neo4j服务器(支持独立和集群)。
上述依赖必须被移除。
从嵌入式解决方案迁移可能是最难的,因为你还需要搭建服务器。 不过,它本身就给你带来了很大的价值: 未来,你可以直接升级数据库本身,而无需考虑你的应用框架和数据访问框架。
你正在使用 HTTP 传输
你补充了org.neo4j:neo4j-ogm-http-driver并配置了像这样的URL。用户:password@localhost:7474.
依赖必须被替换为org.neo4j:neo4j-ogm-bolt-driver你需要配置一个像 Bolt 的 URLbolt://localhost:7687或者使用新的neo4j@Scheme,也负责路由。
迁移
一旦你确认你的SDN+OGM应用能正常通过Bolt运行,就可以开始迁移到SDN。
-
全部删除
org.neo4j:neo4j-ogm-*依赖 -
通过 配置 SDN
org.neo4j.ogm.config.Configuration不支持BEAN,所有驱动配置都通过我们新的Java驱动Starters完成。 你特别需要调整属性以匹配网址和认证,详见“旧资产与新资产的比较”
| 你不能通过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的入门指南”。
然后你就可以替换注释了:
| 老 | 新增功能 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
不需要更换,也不需要 |
|
不需要更换,也不需要 |
|
使用投影;不再支持任意结果映射 |
| 若干 Neo4j-OGM 注释尚未在 SDN 中拥有对应注释,有些甚至永远不会有。 随着我们支持更多功能,我们会在上述列表中添加内容。 |
书签管理
双@EnableBookmarkManagement和@UseBookmark以及org.springframework.data.neo4j.bookmark.BookmarkManager(目录管理器)接口及其唯一实现org.springframework.data.neo4j.bookmark.CaffeineBookmarkManager已经消失,不再需要。
SDN为所有交易使用书签,无需配置。
你可以去掉豆子声明咖啡因书签管理器以及 的依赖关系com.github.ben-manes.caffeine:caffeine.
如果非得这样做,可以按照这些说明关闭自动书签管理。
约束和索引的自动创建
SDN 5.3及更早版本提供了Neo4j-OGM的“自动索引管理器”。
@Index,@CompositeIndex和@Required被移除且未更换。
为什么?
我们认为创建模式——即使是无模式数据库——也不属于领域建模的一部分。
你可以说SDN模型就是模式,但我们甚至更倾向于命令-查询分离,
这意味着我们更愿意定义独立的读写模型。
这些工具在写“无聊”内容和阅读图表形答案时非常有用。
除此之外,其中一些注释的值分别与特定的Neo4j版本绑定,因此它们属于 很难维持。
然而,最好的论点是转向生产环境:虽然所有生成模式的工具在开发过程中确实很有帮助,尤其是对强制严格方案的数据库来说, 在生产环境中它们往往不太友好:你如何处理不同版本的应用程序同时运行? 版本A断言新版本B创建的索引?
我们认为最好事先掌控,建议使用受控数据库迁移,比如Liquigraph或Neo4j迁移工具。 后者在JHipster项目中的SDN中被发现。 两个项目的共同点是都将当前版本的模式存储在数据库中,并确保模式符合预期,然后才进行更新。
迁移出之前的Neo4j-OGM注释会影响@Index,@CompositeIndex和@Required这里给出了一个使用 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):
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).
注意,唯一索引已经蕴含了一个索引。