返回介绍

12.2.2 使用注解标注图实体

发布于 2024-08-17 00:45:49 字数 4354 浏览 0 评论 0 收藏 0

Neo4j定义了两种类型的实体:节点(node)和关联关系(relationship)。一般来讲,节点反映了应用中的事物,而关联关系定义了这些事物是如何联系在一起的。

Spring Data Neo4j提供了多个注解,它们可以应用在模型类型及其域上,实现Neo4j中的持久化。表12.3描述了这些注解。

表12.3 借助Spring Data Neo4j的注解,能够将领域类型映射为图中的节点和关联关系

注  解

描  述

@NodeEntity

将Java类型声明为节点实体

@RelationshipEntity

将Java类型声明为关联关系实体

@StartNode

将某个属性声明为关联关系实体的开始节点

@EndNode

将某个属性声明为关联关系实体的结束节点

@Fetch

将实体的属性声明为立即加载

@GraphId

将某个属性设置为实体的ID域(这个域的类型必须是Long)

@GraphProperty

明确声明某个属性

@GraphTraversal

声明某个属性会自动提供一个iterable元素,这个元素是图遍历所构建的

@Indexed

声明某个属性应该被索引

@Labels

为@NodeEntity声明标签

@Query

声明某个属性会自动提供一个iterable元素,这个元素是执行给定的Cypher查询所构建的

@QueryResult

声明某个Java或接口能够持有查询的结果

@RelatedTo

通过某个属性,声明当前的@NodeEntity与另外一个@NodeEntity之间的关联关系

@RelatedToVia

在@NodeEntity上声明某个属性,指定其引用该节点所属的某一个@RelationshipEntity

@RelationshipType

将某个域声明为关联实体类型

@ResultColumn

在带有@QueryResult注解的类型上,将某个属性声明为获取查询结果集中的某个特定列

为了了解如何使用其中的某些注解,我们会将其应用到订单/条目样例中。

在该样例中,数据建模的一种方式就是将订单设定为一个节点,它会与一个或多个条目关联。图12.2以图的形式描述了这种模型。

图12.2 连接两个节点的简单关联关系,关系本身不包含任何属性

为了将订单指定为节点,我们需要为Order类添加@NodeEntity注解。如下的程序清单展现了带有@NodeEntity注解的Order类,它还包含了表12.3中的几个其他注解。

程序清单12.10 为Order添加注解,使其成为图数据库中的一个节点

除了类级别上的@NodeEntity,还要注意id属性上使用了@GraphId注解。Neo4j上的所有实体必要要有一个图ID。这大致类似于JPA @Entity以及MongoDB @Document类中使用@Id注解的属性。在这里,@GraphId注解标注的属性必须是Long类型。

customer和type属性上没有任何注解。只要这些属性不是瞬态的,它们都会成为数据库中节点的属性。

items属性上使用了@RelatedTo注解,这表明Order与一个Item的Set存在关联关系。type属性实际上就是为关联关系建立了一个文本标记。它可以设置成任意的值,但通常会给定一个易于人类阅读的文本,用来简单描述这个关联关系的特征。稍后,你将会看到如何将这个标记用在查询中,实现跨关联关系的查询。

就Item本身来说,下面展现了如何为其添加注解实现图的持久化。

程序清单12.11 Item也是图数据库中的节点

类似于Order,Item也使用了@NodeEntity注解,将其标记为一个节点。它同时也有一个Long类型的属性,借助@GraphId注解将其标注为节点的图ID,而product、price以及quantity属性均会作为图数据库中节点的属性。

Order和Item之间的关联关系很简单,关系本身并不包含任何的数据。因此,@RelatedTo注解就足以定义关联关系。但是,并不是所有的关联关系都这么简单。

让我们重新考虑该如何为数据建模,从而学习如何使用更为复杂的关联关系。在当前的数据模型中,我们将条目和产品的信息组合到了Item类中。但是,当我们重新考虑的时候,会发现订单会与一个或多个产品相关联。订单与产品之间的关系构成了订单的一个条目。图12.3描述了另外一种在图中建模数据的方式。

图12.3 关联关系实体自身具有属性

在这个新的模型中,订单中产品的数量是条目中的一个属性,而产品本身是另外一个概念。与前面一样,订单和产品都是节点,而条目是关联关系。因为现在的条目必须要包含一个数量值,关联关系不像前面那么简单。我们需要定义一个类来代表条目,比如如下程序清单所示的LineItem。

程序清单12.12 LineItem类连接了一个Order节点和一个Product节点

Order类通过@NodeEntity注解将其标示为一个节点,而LineItem类则使用了@RelationshipEntity注解。LineItem同样也有一个id属性标注了@GraphId注解,不管是节点实体还是关联关系实体,都必须要有一个图ID,而且其类型必须为Long。

关联关系实体的特殊之处在于它们连接了两个节点。@StartNode和@EndNode注解用在定义关联关系两端的属性上。在本例中,Order是开始节点,Product是结束节点。

最后,LineItem类有一个quantity属性,当关联关系创建的时候,它会持久化到数据库中。

领域对象已经添加了注解,现在就可以保存与读取节点和关联关系了。我们首先看一下如何使用Spring Data Neo4j中的Neo4jTemplate实现面向模板的数据访问。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文