领先一步
VMware 提供培训和认证,助您加速前进。
了解更多Spring Data Neo4j 是一个 Spring Data 社区项目,由 Neo4j, Inc. 维护和开发。我们代表 Neo4j 团队负责该模块的成员,很高兴分享他们关于 2020.0.0 版本中最近更改和新功能的见解。
使用 Spring Boot 2.3 的 Neo4j 用户需要特别注意,因为 Spring Data Neo4j 6.0 的配置基础设施发生了不兼容的更改。
话虽如此,不仅配置基础设施发生了变化,整个项目也发生了变化。
该模块有一些历史,并经历了多次重大更改。大约四年来,它遵循了 Spring Data JPA 的原则:使用 Spring Data 作为薄层来协调底层的对象映射器。
对于 Neo4j,那个映射器称为 Neo4j-OGM。尽管 Neo4j-OGM 相当灵活,但它也付出了代价。它不仅像任何对象映射器那样对我们的查询语言进行抽象,还对传输进行了抽象。它可以用于启动嵌入式 Neo4j、使用 HTTP 或我们自己的 Bolt 协议。最后,但并非最不重要的一点是,它在客户端重新创建了图的许多抽象。也就是说,它在映射期间创建了一个本地图模型,并通过迭代该模型来构建对象,而不是以记录导向的方式工作。
有了这么多的抽象,许多事情变得越来越困难
以一种不仅仅是顶层虚假响应层的方式支持响应式编程范式
支持不可变对象
提供可组合的栈
轻松使用 Cypher 和自定义查询 - 无论是否进行映射
新的 Spring Data Neo4j 6.0 主要版本解决了所有这些问题。
我们从 2019 年 3 月左右开始这项工作,很大程度上受到 Spring Data 团队在 Spring Data JDBC 方面出色工作的启发。SDN 6 最初是一个名为 SDN/RX 的副项目。通过 SDN/RX,我们收集了客户和早期采用者的反馈,其中包括 JHipster 用户。
最终,它成为了 SDN 6,我们在 Spring One 2020 大会上宣布了它
幻灯片:https://speakerdeck.com/michaelsimons/spring-up-your-graph
它能为您带来什么
全面支持响应式编程,从映射层到数据库(需要 Neo4j)。
兼容广泛的 Neo4j Java Driver 版本:从 4.0 到 4.2 及未来版本,因此支持 Neo4j 3.5 到 4.2(尚未发布)。
符合 Spring Framework 和 Spring Data 的 JDK 8 基线,但在 JDK 15 中也能很好地运行,包括使用 Records 预览功能作为领域类。
说到记录,映射是记录导向的,因此流水线化和映射的数据可以完全不可变地检索。这适用于 Kotlin-Data 类、Java 15 记录,当然也适用于带有 withers 的“数据”类,无论是手动创建还是通过 Lombok 生成。
首次在 Spring Data Neo4j 中支持基于 findByExample
的方法。
引入了我们新的 https://github.com/neo4j-contrib/cypher-dsl。我们在内部使用它,但您也可以用它创建自定义查询。
支持实验性的 Spring Native 项目,Spring Data Neo4j。Cypher-DSL 和 Neo4j Java driver 与 GraalVM 的原生镜像完全兼容。
Neo4j 模板的回归。
定义明确的多层抽象
SDN 6 不再负责创建数据库连接。它也不能负责启动嵌入式实例。相反,您需要提供驱动程序(或让 Spring Boot 为您处理)。
您可以使用驱动程序做任何您想做的事情。以您需要的方式管理事务。
SDN 6 在驱动程序之上提供了一个薄客户端。我们希望该客户端为您自己的映射提供了一些良好且可用的钩子。至少我们对此感到满意并在底层使用它。该客户端集成了 Spring 的事务管理器。
在客户端之上是 Neo4j 模板。它了解您的领域模型。
该模板被 Repository 抽象使用。
有一个对我们来说非常重要的一点:对嵌入式 Neo4j 的支持。虽然 Neo4j-OGM 不仅可以启动嵌入式实例,还可以直接使用 Graphdatabase API,但我们根本不推荐这种方法。从对象映射层启动任何数据库都会带来一系列问题。这始于数据库为您的应用程序带来的大量依赖项,然后是同一服务的多个实例的同步,最终可能会导致关闭时序问题,尤其是在 Kubernetes 上运行时,它倾向于快速终止进程。
如果您了解这些缺点,仍然可以启动嵌入式 Neo4j。此处是一个可以转换为 Spring bean 的示例。
然后 SDN 6 可以使用这个嵌入式实例。您可以向其打开一个本地 Bolt 连接。
Spring Boot 的基础设施有以下变化
顶层新增了属性:现在使用 spring.neo4j.*
来配置数据库连接。
spring.data.neo4j.*
拥有新的属性来配置正在使用的数据库名称。
更好的健康检查和(有望很快)优秀的 Micrometer 指标支持。
@DataNeo4jTest
不再启动嵌入式实例。
关于最后一点,我们推荐使用 Testcontainers Neo4j 或手动创建和管理嵌入式实例。
您需要做什么?注解已更改,我们在文档中提供了专门的页面来描述 OGM 的哪些注解已被 Spring Data Neo4j 注解替换。映射有些主观,您可能需要在几个地方重做您的领域模型。
我们认为我们已经为未来几年稳定框架奠定了基础,我们期待您的反馈。
我们要感谢 Spring Data 团队的团队负责人 Mark Paluch。对于我们关于 Spring Data commons 内部运作的所有问题以及任何讨论,Mark 都展现出了令人难以置信的耐心。
还要感谢 Project Reactor 的 Sergei Egorov:Sergei 不仅是 Java 生态系统中最友好的人之一,而且他也是关于所有响应式事物的一个热点源泉。
当然,还要感谢 Stéphane Nicoll,他在过去两年中与我们合作,在许多方面改进了 Spring Boot 对 Neo4j 的支持:通过挑战我们的想法、打磨我们的代码,并促成了一个现在更加清晰、有望对我们共同的用户群更具吸引力的集成。
Michael Simons,代表 Spring Data Neo4j 团队。