当前位置: 首页 > 知识库问答 >
问题:

Spring数据Neo4j Spring数据Rest:对所有CRUD操作使用自然键,而不是Neo4j节点Id

孙玮
2023-03-14

我正在编写一个基于SpringDataREST和SpringDataNeo4j的SpringRESTful微服务

我们不想在JSON响应的HAL链接中公开内部Neo4J节点标识符。原因是(据我所知),在节点删除的情况下,Neo4J会重用这些标识符。如果是这种情况,这将给我们带来数据完整性问题。所以我们宁愿使用一个自然键,例如UUID。如果我关于重用neo4J节点ID的假设是错误的,请纠正我。

我们想要实现的是为所有CRUD操作使用一个自然键,而不是节点Id(即:PUT)http://localhost:8080/apiname/5448ae86-fe87-4daf-bfb5-985522a1cf14(带一些阀体)。

我们的第一个方法是扩展NodeGraphRepositoryImp。例如。

protected Node getById(UUID id) {
    Node node = (Node) this.findByPropertyValue("uuid_id", id);
    return template.getNode(node.getId());
}

并通过在Neo4J配置中注入定制的Neo4jTemplate来实例化它。

但是,由于以下原因,这种方法不起作用:

1) 我无法定义与NodeEntity类中用@GraphId注释的idProperty不同的任何其他idProperty。结果,SpringDataREST最终尝试将自然密钥(例如UUID)分配给neo4j节点id字段(这是一个很长的字段),并且在类型转换上失败。

2) Spring数据Neo4J似乎没有使用扩展NodeGraphRepositoryImpl的自定义类,而是使用原始的未扩展NodeGraphRepositoryImpl类。

也许这种方法是错误的。你能推荐一种实现它的方法吗?

非常感谢你的帮助。

共有1个答案

薛飞星
2023-03-14

springdatarest引入了一个BackendIdConverter,用于覆盖/自定义在uri中公开的字段。

请看一下DATAREST-155(https://jira.spring.io/plugins/servlet/mobile#issue/DATAREST-155)

你能试试吗?

您还可以查看以下线程:

您如何使用neo4j定制spring data rest中的自我、家长和孩子链接

 类似资料:
  • 我正在使用Neo4j的最新Spring数据。在这个项目中,我有不同的组,它们可以通过url/group/{id}/project访问,该url/group/{id}/project应该返回用户有权访问的所有项目的列表。这东西工作得很好,但是如果用户输入了一个很大的数字作为groupId,而这个数字在数据库中并不存在,我会得到一个 组织。neo4j。图b。NotFoundException:未找到节

  • 我开始将Neo4J与Spring数据Rest一起使用。我有一个用于建模节点和边的节点实体和关系实体。我能够使用postman创建具有以下内容的新节点。 我不确定创建节点之间关系的JSON格式是什么。例如: 创建新节点并与现有节点关联 任何关于我需要使用什么JSON的例子都将不胜感激。 我的节点实体和关系实体如下:

  • 我使用的是Spring数据Neo4j 3.3。1.2与Neo4j服务器一起发布。3. 我的问题是有一些节点是我的实体的副本,但它只有索引属性。 我的班级看起来像这样 当一个新节点被创建时,我首先检查是否有一个现有的节点,如果它存在就更新它,否则创建一个新的节点。 存储库接口。 在Neo4j中,实体被创建到具有所有属性的节点。但是有些节点也有一个只包含productId的重复节点。问题是这并没有发生

  • 我试图在Neo4j中创建节点之间的关系。我正在使用Neo4J(2.1.8社区) 我试图创建以下关系。 创建一个新的员工(节点),它将向DB中的Manager(节点)报告(空关系)(按名称搜索)。我使用了下面的查询。 我得到了下面的错误。 谁能告诉我这个问题出了什么问题?另外,如果这不是使用GraphRespository创建关系的正确方法,那么我还可以使用什么来实现同样的目的呢。 提前感谢。 注意

  • 这是我想做的:将用户连接到他们观看的视频,就像用户- 我是如何做到的: CSV文件有2列,标题为用户和视频。用户下面是一个标识每个用户的数字,视频下面是一个标识每个视频的数字。一个用户对一个视频。有时用户的名字会在列表中再次出现在不同的视频中。有时视频编号会再次出现,因为它是由不同的用户观看的。 但是,这将返回关系用户在每个关系中查看1个视频。因此,每个用户和视频都有多个节点。 我想做的:创建更多

  • 我正在尝试使用spring boot作为后端,Angular作为前端,并使用Neo4j数据库作为应用程序,它是一个面向图形的NoSQL数据库。我的问题是,我不知道如何在节点中使用复杂的数据,我的意思是。我正在编程的应用程序将基于microservices体系结构,其中Angular(前端)中的应用程序将通过spring boot制作的后端Rest API插入并使用数据,该API将数据存储在运行Ne