理解归理解 2024-05-15 09:46 采纳率: 0%
浏览 7
已结题

springboot集成Neo4j新增关系时,关系会被变成节点保存在数据库中

我在使用springboot集成neo4j进行关系插入时出现了些奇怪的问题:我在使用关系插入的时候关系会被识别成节点插入到数据库,会将关系里面的@StartNode和@EndNode注释的字段的字段名变为关系,效果图如下:

img

可以帮忙看下什么原因造成的吗

import lombok.Data;
import lombok.NoArgsConstructor;
import org.neo4j.ogm.annotation.StartNode;
import org.springframework.data.neo4j.core.schema.*;

@Node
@Data
@NoArgsConstructor
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    @Property
    private String name;
    public Person(String name) {
        this.name = name;
    }
}
package org.example.entity;

import lombok.Data;
import org.neo4j.ogm.annotation.EndNode;
import org.neo4j.ogm.annotation.RelationshipEntity;
import org.neo4j.ogm.annotation.StartNode;
import org.springframework.data.neo4j.core.schema.GeneratedValue;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Property;

@Data
@RelationshipEntity(type = "relation")
public class relation {
    @Id
    @GeneratedValue
    private Long id;
    @StartNode
    private Person startNode;
    @EndNode
    private Person endNode;
    @Property
    private String type;

    public relation(Person startNode, Person endNode, String type) {
        this.startNode = startNode;
        this.endNode = endNode;
        this.type = type;
    }
}
@Repository
public interface PersonRepository extends Neo4jRepository<Person, Long> {
}
@Repository
public interface relationRepository extends Neo4jRepository<relation,Long> {
}
    @Test
    public void test02() {
        Person person1 = new Person("张");
        Person person2 = new Person("李");
        Person person3 = new Person("王");
        Person person4 = new Person("赵");
        relation relation = new relation(person1, person2, "relation");
        relation relation1 = new relation(person1, person3, "relation");
        relation relation2 = new relation(person1, person4, "relation");
        List<relation>  relations = new ArrayList<>();
        relations.add(relation);
        relations.add(relation1);
        relations.add(relation2);
        relationRepository.saveAll(relations);
    }
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-15 09:46
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题

    您提问的目的是解决在使用Spring Boot集成Neo4j进行关系插入时,关系被错误地识别为节点并保存在数据库中的问题。

    图片内容

    您上传的图片显示了Neo4j数据库中的一个关系图,其中包含了几个节点和它们之间的关系。根据图片内容,似乎关系被错误地表示为节点,并且关系类型(如"relation")被用作了节点的名称。

    问题出现原因

    问题可能出现的原因可能与您在定义relation类时的注解使用有关。在relation类中,您使用了@RelationshipEntity注解,这是正确的,但是可能在关系类型名称或者实体映射上存在问题,导致Neo4j将关系当作节点处理。

    问题解决方案

    为了解决这个问题,您需要确保:

    1. relation类使用了正确的@RelationshipEntity注解,并且类型名称正确。
    2. 在创建关系时,确保您使用的是关系的类型名称,而不是节点的属性名称。
    3. 检查您的relationRepository是否正确地处理了关系实体的保存。

    提供代码

    以下是修改后的relation类和测试方法的示例代码:

    @Data
    @RelationshipEntity(type = "RELATION") // 使用大写类型名称
    public class Relation {
        @Id
        @GeneratedValue
        private Long id;
        @StartNode
        private Person startNode;
        @EndNode
        private Person endNode;
        @Property
        private String type;
    
        public Relation(Person startNode, Person endNode, String type) {
            this.startNode = startNode;
            this.endNode = endNode;
            this.type = type;
        }
    }
    
    @Test
    public void test02() {
        Person person1 = new Person("张");
        Person person2 = new Person("李");
        Person person3 = new Person("王");
        Person person4 = new Person("赵");
        Relation relation = new Relation(person1, person2, "RELATION");
        Relation relation1 = new Relation(person1, person3, "RELATION");
        Relation relation2 = new Relation(person1, person4, "RELATION");
        List<Relation> relations = new ArrayList<>();
        relations.add(relation);
        relations.add(relation1);
        relations.add(relation2);
        relationRepository.saveAll(relations);
    }
    

    代码运行方式

    运行您的代码需要以下环境:

    • Java开发环境
    • Spring Boot框架
    • Neo4j数据库及其OGM模块
    • Maven或Gradle作为构建工具

    您可以通过在IDE中运行测试方法或者通过构建工具执行单元测试来运行代码。

    代码预期运行结果

    预期的运行结果是,Relation对象将被正确地保存为Neo4j数据库中的关系,而不是节点。您应该能够在Neo4j的图形界面或者通过查询看到正确的关系结构。

    推荐相关链接

    请根据上述建议检查您的代码,并尝试运行修改后的代码。如果问题仍然存在,您可能需要进一步检查您的Neo4j配置或查询日志以确定问题的具体原因。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月22日
  • 创建了问题 5月15日

悬赏问题

  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办