最新的稳定版本请使用 Spring Data Neo4j 7.3.1Spring中文文档

最新的稳定版本请使用 Spring Data Neo4j 7.3.1Spring中文文档

本章介绍在使用 SDN 的抽象层时如何创建查询。 会有一些简化,因为我们不会讨论所有可能的情况,而是坚持其背后的一般思想。Spring中文文档

除了操作之外,该操作是处理数据时最常用的操作之一。 保存操作调用通常对数据库发出多个语句,以确保生成的图形模型与给定的 Java 模型匹配。find/loadsaveSpring中文文档

  1. 将创建一个联合语句,如果找不到节点的标识符,则创建节点,或者更新节点的属性(如果节点本身存在)。Spring中文文档

    (OPTIONAL MATCH (hlp:Person) WHERE id(hlp) = $__id__ WITH hlp WHERE hlp IS NULL CREATE (n:Person) SET n = $__properties__ RETURN id(n) UNION MATCH (n) WHERE id(n) = $__id__ SET n = $__properties__ RETURN id(n))Spring中文文档

  2. 如果实体不是新的,则域模型中第一个找到类型的所有关系都将从数据库中删除。Spring中文文档

    (MATCH (startNode)-[rel:Has]→(:Hobby) WHERE id(startNode) = $fromId DELETE rel)Spring中文文档

  3. 相关实体的创建方式与根实体相同。Spring中文文档

    (OPTIONAL MATCH (hlp:Hobby) WHERE id(hlp) = $__id__ WITH hlp WHERE hlp IS NULL CREATE (n:Hobby) SET n = $__properties__ RETURN id(n) UNION MATCH (n) WHERE id(n) = $__id__ SET n = $__properties__ RETURN id(n))Spring中文文档

  4. 关系本身将被创建Spring中文文档

    (MATCH (startNode) WHERE id(startNode) = $fromId MATCH (endNode) WHERE id(endNode) = 631 MERGE (startNode)-[:Has]→(endNode))Spring中文文档

  5. 如果相关实体也与其他实体有关系,则过程与 2.将开始。Spring中文文档

  6. 对于根实体上的下一个定义关系,请从 2 开始。但将 First 替换为 NextSpring中文文档

正如你所看到的,SDN尽最大努力使你的图模型与Java世界保持同步。 这就是为什么我们真的建议您不要加载、操作和保存子图的原因之一,因为这可能会导致关系从数据库中删除。

多个实体

该操作使用用于接受相同类型的多个实体的功能重载。 如果使用生成的 id 值或使用乐观锁定,则每个实体都将导致单独的调用。saveCREATESpring中文文档

在其他情况下,SDN 将创建一个包含实体信息的参数列表,并向其提供调用。MERGESpring中文文档

UNWIND $__entities__ AS entity MERGE (n:Person {customId: entity.$__id__}) SET n = entity.__properties__ RETURN collect(n.customId) AS $__ids__Spring中文文档

参数如下所示Spring中文文档

:params {__entities__: [{__id__: 'aa', __properties__: {name: "PersonName", theId: "aa"}}, {__id__ 'bb', __properties__: {name: "AnotherPersonName", theId: "bb"}}]}Spring中文文档

正如你所看到的,SDN尽最大努力使你的图模型与Java世界保持同步。 这就是为什么我们真的建议您不要加载、操作和保存子图的原因之一,因为这可能会导致关系从数据库中删除。

负荷

该文档不仅会显示查询的 MATCH 部分的外观,还会显示数据的返回方式。loadSpring中文文档

最简单的加载操作类型是调用。 它将使用您查询的类型的标签匹配所有节点,并对 id 值进行筛选。findByIdSpring中文文档

MATCH (n:Person) WHERE id(n) = 1364Spring中文文档

如果提供了自定义 ID,SDN 将使用你定义为 ID 的属性。Spring中文文档

MATCH (n:Person) WHERE n.customId = 'anId'Spring中文文档

要返回的数据定义为地图投影Spring中文文档

RETURN n{.first_name, .personNumber, __internalNeo4jId__: id(n), __nodeLabels__: labels(n)}Spring中文文档

如您所见,其中有两个特殊字段:The 和 . 在将数据映射到 Java 对象时,两者都至关重要。 的值是提供的自定义 ID,但在映射过程中,必须存在一个要引用的已知字段。 这确保可以找到并映射此节点上所有定义的标签。 如果使用继承,并且不查询具体类,或者定义的关系仅定义超类型,则需要这样做。__internalNeo4jId____nodeLabels____internalNeo4jId__id(n)__nodeLabels__Spring中文文档

谈论关系:如果您在实体中定义了关系,它们将作为模式推导添加到返回的映射中。 上面的返回部分将如下所示:Spring中文文档

RETURN n{.first_name, …​, Person_Has_Hobby: [(n)-[:Has]→(n_hobbies:Hobby)|n_hobbies{__internalNeo4jId__: id(n_hobbies), .name, nodeLabels: labels(n_hobbies)}]}Spring中文文档

SDN 使用的地图投影和模式推导可确保仅查询已定义的属性和关系。Spring中文文档

如果您具有自引用节点或创建的架构,这些架构可能会导致返回的数据出现循环, SDN 回退到级联/数据驱动的查询创建。 从查找特定节点的初始查询开始并考虑条件, 它逐步遍历生成的节点,如果它们的关系也被映射,它将动态创建进一步的查询。 此查询创建和执行循环将继续进行,直到没有查询找到新的关系或节点。 创建方式可以看作是类似于保存/更新过程。Spring中文文档