Spring Data Neo4j(1.对象映射)

news2024/11/28 15:44:28

文章目录

  • 一、Spring Data Neo4j
  • 二、注释
    • @Node
    • @Id
    • @Version(乐观锁)
    • @Property
    • @Relationship


一、Spring Data Neo4j

Spring Data Neo4j或简称SDN是下一代Spring Data模块,由Neo4j,Inc.创建和维护。与VMware的Spring Data Team密切合作。 它支持所有官方支持的Neo4j版本,包括Neo4j AuraDB。 Spring Data Neo4j项目将上述Spring Data概念应用于使用Neo4j图形数据存储开发解决方案。

SDN完全依赖于Neo4j Java驱动程序,而无需在映射框架和驱动程序之间引入另一个“驱动程序”或“传输”层。Neo4j Java驱动程序 - 有时被称为Bolt或Bolt驱动程序 - 被用作协议,就像JDBC与关系数据库一样。

SDN是一个 对象-图形-映射(OGM) 库。 OGM 将图中的节点和关系映射到域模型中的对象和引用。 对象实例映射到节点,而对象引用使用关系映射,或序列化为属性(例如,对日期的引用)。 JVM 基元映射到节点或关系属性。 OGM 抽象化数据库,并提供一种方便的方法,将域模型保留在图形中并查询它,而无需直接使用低级别驱动程序。 它还为开发人员提供了灵活性,可以在 SDN 生成的查询不足的情况下提供自定义查询。

SDN的所有抽象都有命令式和响应式。 不建议在同一应用程序中混合使用这两种编程样式。 反应式基础架构需要一个 Neo4j 4.0+ 数据库
在这里插入图片描述

二、注释

import java.util.ArrayList;
import java.util.List;

import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;
import org.springframework.data.neo4j.core.schema.Property;
import org.springframework.data.neo4j.core.schema.Relationship;
import org.springframework.data.neo4j.core.schema.Relationship.Direction;

@Node("Movie")   // 1
public class MovieEntity {

	@Id      // 2
	private final String title;

	@Property("tagline")    // 3
	private final String description;

	@Relationship(type = "ACTED_IN", direction = Direction.INCOMING)   // 4
	private List<Roles> actorsAndRoles;

	@Relationship(type = "DIRECTED", direction = Direction.INCOMING)
	private List<PersonEntity> directors = new ArrayList<>();

	public MovieEntity(String title, String description) {   // 5
		this.title = title;
		this.description = description;
	}

	// Getters omitted for brevity
}


@Node用于将此类标记为托管实体。
它还用于配置 Neo4j 标签。
标签默认为类的名称,如果您只是使用普通。@Node


每个实体都必须有一个 ID。
此处显示的电影类使用 attributeas 唯一的业务键。
如果你没有这样的唯一密钥,你可以使用组合的and来配置SDN以使用Neo4j的内部ID。 We also provide generators for UUID。title@Id@GeneratedValue


这显示为一种为字段使用与图形属性不同的名称的方法。@Property


这定义了与类型和关系类型的类的关系PersonEntityACTED_IN


这是应用程序代码要使用的构造函数


@Node

注释用于将类标记为托管域类,受映射上下文的类路径扫描的约束。@Node

要将 Object 映射到图中的节点,反之亦然,我们需要一个标签来标识要映射到和从中映射的类。

@Node具有一个属性允许您配置一个或多个标签,以便在读取和写入带批注的类的实例时使用。 属性是 的别名。 如果未指定标签,则简单类名将用作主标签。 如果要提供多个标签,可以:labelsvaluelabels

  1. 向属性提供数组。 数组中的第一个元素将被视为主标签。labels
  2. 提供值并将其他标签放入。primaryLabellabels
    主标签应始终是反映您的域类的最具体的标签。

对于通过存储库或 Neo4j 模板编写的注释类的每个实例,将写入图形中至少具有主标签的一个节点。 反之亦然,所有具有主标签的节点都将映射到带注释的类的实例。


@Id

在类和具有特定标签的节点之间创建映射时,我们还需要在该类(对象)的各个实例和节点实例之间建立连接。@Node

这就是发挥作用的地方。将类的一个属性标记为对象的唯一标识符。 该唯一标识符在最佳环境中是唯一的业务键,换句话说,是自然键。可用于具有受支持的简单类型的所有属性。@Id

但随着时间的推移,键的设置会变得越来越麻烦,就提出如下方法解决

  1. 在类型器的属性上,可以使用它。 这会将 Neo4j 内部 ID(它不是节点或关系上的属性,通常不可见)映射到属性,并允许 SDN 检索类的各个实例。longLong@Id@GeneratedValue
    @GeneratedValue提供属性。可用于指定类实现。 Anis 一个功能接口,它包含主标签和实例来生成 Id。 我们支持开箱即用的实现。
@Node("Movie")
public class MovieEntity {

	@Id @GeneratedValue(UUIDStringGenerator.class)
	private String id;

	private String name;
}
  1. 还可以从应用程序上下文中指定 Spring Bean。 该 Bean 也需要实现,但可以利用上下文中的所有内容,包括 Neo4j 客户端或模板与数据库进行交互。
@Node("Movie")
public class MovieEntity {

	@Id @GeneratedValue(generatorRef = "myIdGenerator")
	private String id;

	private String name;
}
@Component
class MyIdGenerator implements IdGenerator<String> {

	private final Neo4jClient neo4jClient;

	public MyIdGenerator(Neo4jClient neo4jClient) {
		this.neo4jClient = neo4jClient;
	}

	@Override
	public String generateId(String primaryLabel, Object entity) {
		return neo4jClient.query("YOUR CYPHER QUERY FOR THE NEXT ID") 
			.fetchAs(String.class).one().get();
	}
}

@Version(乐观锁)

Spring Data Neo4j通过在非类型字段上使用注释来支持乐观锁定。 此属性将在更新期间自动递增,不得手动修改。@VersionLong

例如,如果不同线程中的两个事务想要使用版本修改同一对象,则第一个操作将成功持久化到数据库中。 此时,版本字段将递增,因此。 第二个操作将失败,因为它想要使用数据库中不再存在的版本修改对象。 在这种情况下,需要重试操作,首先从数据库中重新获取具有当前版本的对象。xx+1OptimisticLockingFailureExceptionx


@Property

带注释的类的所有属性都将保留为 Neo4j 节点和关系的属性。 如果没有进一步的配置,Java 或 Kotlin 类中的属性名称将用作 Neo4j 属性。@Node

如果您正在使用现有的 Neo4j 模式,或者只是想根据自己的需求调整映射,则需要使用。 用于指定数据库中属性的名称。@Propertyname


@Relationship

Neo4j不仅支持在节点上定义属性,还支持在关系上定义属性。 为了在模型中表达这些属性,SDN提供应用于简单的Java类。
在属性类中,必须只有一个标记为 as 的字段来定义关系指向的实体。
或者,在关系的背景下,来自。@RelationshipProperties@TargetNodeINCOMING

该注释可用于非简单类型的所有属性。 它适用于其他类型的属性注释或集合及其Map。@Relationship@Node

属性允许配置关系的类型,允许指定方向。 SDN 中的默认方向是。typevaluedirectionRelationship.Direction#OUTGOING

我们支持动态关系。 动态关系表示为 aor。 在这种情况下,与其他域类的关系类型由 maps 键给出,不得通过 进行配置。Map<String, AnnotatedDomainClass>Map<Enum, AnnotatedDomainClass>@Relationship

import java.util.ArrayList;
import java.util.List;

import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;
import org.springframework.data.neo4j.core.schema.Property;
import org.springframework.data.neo4j.core.schema.Relationship;
import org.springframework.data.neo4j.core.schema.Relationship.Direction;

@Node("Movie") 
public class MovieEntity {

	@Id 
	private final String title;

	@Property("tagline")  //这显示为一种为字段使用与图形属性不同的名称的方法
	private final String description;

	@Relationship(type = "ACTED_IN", direction = Direction.INCOMING) 
	private List<Roles> actorsAndRoles;

	@Relationship(type = "DIRECTED", direction = Direction.INCOMING)
	private List<PersonEntity> directors = new ArrayList<>();

	public MovieEntity(String title, String description) { 
		this.title = title;
		this.description = description;
	}

	// Getters omitted for brevity
}

我们还没有在两个方向上模拟电影和人之间的关系。 为什么? 我们将 thes 视为聚合根,拥有关系。
另一方面,我们希望能够从数据库中提取所有人,而无需选择与他们关联的所有电影
在尝试将数据库中的每个关系映射到各个方向之前,请考虑应用程序的用例。
虽然您可以这样做,但您最终可能会在对象图中重建图形数据库,这不是映射框架的意图。 如果您必须对循环域或双向域进行建模,并且不想获取整个图,
您可以使用投影定义要提取的数据的细化描述。MovieEntity

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<Linux> shell运行原理及Linux权限的理解

文章目录一、shell 命令及其运行原理shell外壳shell运行原理二、Linux 权限的概念1.用户分类2.切换用户3.用户提权三、Linux 权限管理1.文件访问者的分类&#xff08;人&#xff09;2.文件类型和访问权限&#xff08;事物属性&#xff09;四、文件权限值的表示方法1.字符表示法…

Pycharm 配置远程SSH服务器环境(切换不同虚拟环境)

1.首先在Xshell上通过conda创建新的虚拟环境 2.此时在 /home/y210101004/.conda/envs下多了刚刚创建的环境的文件夹 3.路径说明&#xff01; &#xff08;注意&#xff01;&#xff09;该环境的编译器python3.6就在.../jiayan_test/bin里面 &#xff08;注意&#xff01;&…

04.函数

一、 函数 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, routine, method, subprogram, callable unit&#xff09;&#xff0c;是一个大型程序中的某部分代码&#xff0c; 由一个或多个语句块组 成。它负责完成某项特定任务…

ctfshow学习记录-misc入门(图片篇-颜色通道50-59)

目录misc50misc51misc52misc53misc54misc55misc56misc57misc58misc59misc51-52的wp和脚本参考的是csdn博主&#xff1a;z.volcano 九某人的碎碎念&#xff1a;这篇一更&#xff0c;说明近期是真的没有时间写wp了。虽说好多都是之前做过的题&#xff0c;但是wp整理起来还是比较耗…

OpenCV-Python 颜色识别(红色)并拟合矫正目标区域

OpenCV版本&#xff1a;4.6.0.66 算法实现思路&#xff1a; 颜色识别(红色)形态学去噪轮廓检测多边形拟合透视矫正代码实现&#xff1a; import cv2 import numpy as np# 可视化 def img_show(name, img):cv2.namedWindow(name, 0)cv2.resizeWindow(name, 1000, 500)cv2.imsh…

Java内存模型与volatile

Java内存模型 Java内存模型Java Memory Model&#xff0c;简称JMM&#xff0c;本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范&#xff0c;通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另…

白鹭群优化算法(ESOA)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

单调区间能写成并吗?【基于间断区间的讨论】

不能。 问题 在做到一道题的时候&#xff0c;发现了两个减区间&#xff0c;于是就用并∪连接到一起了&#xff0c;但是答案是要用和连接。于是想要辨析一下这个并和和的区别。 区别 并&#xff1a;并的意思是将多个区间看成一个并起来的整体&#xff0c;在整个区间上仍然是…

按照 STAR 法则介绍自己做过的项目

大家好啊&#xff0c;我是大田 介绍项目注意两点&#xff1a;1、自己真的做过 2、逻辑表达能力 为什么推荐你用 STAR 法则说呢&#xff1f; STAR 法则是结构化面试中非常重要的理论。 面试官通过这样的描述全面了解你的测试知识、经验、技术能力的掌握程度&#xff0c;通过你发…

本地pycharm连接到远程服务器(超级详细)

本地pycharm连接到远程服务器&#xff08;超级详细&#xff09; 文章之前&#xff0c;你需要做的是 1.服务器需要创建好虚拟环境 2.你的本地安装好pycharm 目的是 同步服务器上的文件 在本地进行debug&#xff0c;并将修改后的文件进行更新 一般是将文件代码上传到服务器上面&…

【微服务】Sentinel 控制台

目录 1. 概述 2. 启动控制台 2.1 获取 Sentinel 控制台 2.2 启动 3. 客户端接入控制台 3.1 引入JAR包 3.2 配置启动参数 3.3 触发客户端初始化 4. 查看机器列表以及健康情况 5. 监控 5.1 "簇点链路"中显示刚刚调用的资源&#xff08;单机实时&#xff09; …

猿创征文|分享一下我的日常开发工具和常用软件

1、Eclipse IDE for Java Developers 这个软件&#xff0c;个人已经用了很多年的免费 Java 开发软件。 1&#xff09;配置JDK 2&#xff09;新建项目 3&#xff09;运行使用 这里注意到有 Run As 和 Debug As ,区别就是后者是调试模式&#xff0c;你可以在代码任意处打断点跟…

element-ui中获取el-divider的组件的ref时为空

element-ui中的el-divider组件是函数式组件,所以当我尝试获取其ref时总是获取不到,因为函数式组件没有this. ![在这里插入图片描述](https://img-blog.csdnimg.cn/496711bf5c2a4dd1bee168e4e2d638d4.png)此时打印this.$refs,控制台输出: 没有h2,翻看el-divider源码发现是函数式…

C++入门学习3-指针与字符数组,函数,指针数组

c入门学习3char型指针的使用p*p*p与p与[整型指针指向整型数组]的区别指针与函数的使用指向函数的指针空指针调用函数从函数中返回指针一维数组和二维数组的类比CHAR型指针数组关于&achar型指针的使用 char型指针可以直接指向一个字符串&#xff0c;如下 char s[]{a,b,c};…

YOLO V7源码解析

1.命令行参数介绍 YOLO v7参数与YOLO v5差不多&#xff0c;我就直接将YOLO v5命令行参数搬过来了&#xff0c;偷个懒 --weights:初始权重--cfg:模型配置文件--data:数据配置文件--hyp:学习率等超参数文件--epochs:迭代次数-imgsz&#xff1a;图像大小--rect&#xff1a;长方…

多目标蜉蝣优化算法(MOMA)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

统计信号处理基础 习题解答6-6

题目 在本题中&#xff0c;我们扩展标量BLUE的结果。假定 其中θ 是待估计的未知参数&#xff0c;β 是已知常数&#xff0c;数据矢量x 的协方差矩阵是C 。在本题我们定义修正的线性估计量为 证明BLUE为&#xff1a; 另外求最小方差。 解答&#xff1a; 首先确保线性估计量是…

TFT-LCD显示中英文

TFT-LCD显示中英文 在前面编写了屏幕显示ASCII字符和字符串后&#xff0c;本次实现屏幕显示中文字符和中文字符串 中文字符取模 阴码&#xff0c;逐行式&#xff0c;逆向&#xff0c;十六进制数&#xff0c;C51格式&#xff0c; 输入要显示的中文字符&#xff0c;字体选择宋…

【数据结构】搜索二叉树(C++实现)

目录 一、二叉搜索树的概念 二、二叉搜索树的实现 2.1 节点的定义及构造 2.2 树的结构及功能展示 2.3 树的 Insert 2.4 树的中序遍历 2.4 树的 Find 2.5 树的 Erase 2.6 拷贝构造、赋值运算符重载、析构函数 三、递归实现树的增删查 3.1 递归实现 FindR 3.2 递归实…

Vue | Vue.js Composition API(二)

&#x1f5a5;️ Vue.js专栏&#xff1a;Vue.js 初级知识 Composition API(二) &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀…