|
该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用Spring Data Neo4j 8.0.0! |
查询创建
本章讨论了使用 SDN 抽象层时如何技术性地创建查询。 这里会有一些简化,因为我们不会讨论所有可能的情况,而是坚持背后的大致思路。
救
除了查找/装填作救作是处理数据时最常用的之一。
一般来说,保存作调用会对数据库发送多个语句,以确保最终的图模型与给定的 Java 模型匹配。
-
会创建一个 union 语句,如果找不到节点的标识符,它要么创建节点;要么如果节点本身存在,则更新该节点的属性。
(
可选匹配(hlp:Person) 其中id(hlp) = $__id__ 其中HLP为空 创建(n:Person) 集合 n = $__properties__ 返回 ID(n) Union Match (n) 其中id(n) = $__id__ 集合 n = $__properties__返回ID(n)) -
如果实体不是新的,所有在领域模型中第一个找到类型的关系都会从数据库中移除。
(
MATCH (startNode)-[rel:Has]→(:Hobby) 其中 id(startNode) = $fromId 删除 rel) -
相关实体的创建方式与根实体相同。
(
可选匹配(hlp:爱好) 其中id(hlp) = $__id__ 与 hlp 其中 HLP 为空 创建(n:爱好) 集合 n = $__properties__ 返回 ID(n) Union Match (n) 其中id(n) = $__id__集合 n = $__properties__返回 ID(n)) -
关系本身会被建立起来
(
MATCH (startNode) WHERE id(startNode) = $fromId MATCH (endNode) WHERE id(endNode) = 631 MERGE (startNode)-[:Has]→(endNode)) -
如果相关实体也与其他实体有关系,则作与2中的相同过程。我会开始。
-
对于根实体上下一个定义的关系,从2开始。但先用“Next”替换。
| 正如你所见,SDN 尽力让你的图模型与 Java 世界保持同步。 这也是我们强烈建议你不要加载、作和保存子图的原因之一,因为这可能导致关联从数据库中被移除。 |
多实体
这救作被加载了接受同一类型多个实体的功能。
如果你使用生成的ID值或使用乐观锁定,每个实体都会生成独立的创造叫。
在其他情况下,SDN会创建包含实体信息的参数列表,并提供合并叫。
UNWIND $__entities__ AS entity MERGE (n:Person {customId: entity.$__id__}) SET n = entity.__properties__ RETURN collect(n.customId) AS $__ids__
参数如下
:p arams {__entities__: [{__id__: 'aa', __properties__: {name: “PersonName”, theId: “aa”}}, {__id__ 'bb', __properties__: {name: “AnotherPersonName”, theId: “bb”}}}
负荷
这负荷文档不仅会展示查询中匹配部分的界面,还会显示数据是如何返回的。
最简单的负载作是findById叫。
它会匹配所有带有你查询类型标签的节点,并对 id 值进行过滤。
匹配(n:人)其中id(n) = 1364
如果提供了自定义ID,SDN会使用你定义的属性作为ID。
MATCH (n:Person) 其中 n.customId = 'anId'
返回的数据定义为地图投影。
返回 n{.first_name, .personNumber, __internalNeo4jId__: id(n), __nodeLabels__: labels(n)}
如你所见,里面有两个特殊字段:__internalNeo4jId__以及__nodeLabels__.
这两者在将数据映射到 Java 对象时都至关重要。
该__internalNeo4jId__是id(n)或者是提供的自定义ID,但在映射过程中必须存在一个已知字段可引用。
这__nodeLabels__确保该节点上所有定义的标签都能被找到并映射。
这适用于使用继承且查询时不涉及具体类,或定义的关系只定义了超类型。
谈关系:如果你的实体中有定义的关系,它们会作为模式理解被添加到返回的映射中。 上述返回部分将呈现如下:
返回 n{.first_name, ..., Person_Has_Hobby: [(n)-[:Has]→(n_hobbies:Hobby)|n_hobbies{__internalNeo4jId__: id(n_hobbies), .name, __nodeLabels__: labels(n_hobbies)}]}
SDN使用的地图投影和模式理解确保只查询你定义的属性和关系。
如果你有自引用节点或创建模式,可能导致返回数据出现周期, SDN 则退回到级联/数据驱动的查询创建。 从初始查询开始,寻找特定节点并考虑条件, 它会逐步处理生成的节点,如果它们的关系也被映射,则会实时生成更多查询。 这个查询创建和执行循环将持续,直到没有查询找到新的关系或节点为止。 创作过程可以类似于保存/更新过程。