向具有其他不同类型关系的节点添加新关系会删除旧关系

问题描述 投票:0回答:1

我在向具有现有关系的节点添加新关系时遇到问题,例如,在下面显示的代码片段中,如果已经添加了已添加课程关系的学生,则尝试添加部门关系会删除/取消设置现有课程来自学生。

@Getter
@Setter
@NoArgsConstructor
@Node
public class Student {
    @Id
    @GeneratedValue
    private String elementId;
    private String name;
   
    @Relationship(type="TAKES", direction = Direction.OUTGOING)
    private Course course;
    
    @Relationship(type="TAKES", direction = Direction.OUTGOING)
    private Department dept;
}

@Getter
@Setter
@NoArgsConstructor
@Node
public class Department {
    @Id
    @GeneratedValue
    private String elementId;
    private String name;
}

@Getter
@Setter
@NoArgsConstructor
@Node
public class Course {
    @Id
    @GeneratedValue
    private String elementId;
    private String name;
}

public interface StudentRepository extends Neo4JRepository<Student, String>{}

public interface CourseRepository extends Neo4JRepository<Course, String>{}

public interface DeptRepository extends Neo4JRepository<Department, String>{}


public class StudentService {
     private StudentRepository studentRepository;
     
 ...
     public void addCourse(String name, Course c) {
          Student s = studentRepository.findByName(name);
          s.setCourse(c)
          studentRepository.save(s);
     }

     public void addDepartment(String name, Department d) {
          Student s = studentRepository.findByName(name);
          s.setDepartment(d);
          studentRepository.save(s);
     }
}


看来我必须做一些类似下面的事情来缓解这个问题。然而,当节点有很多(如果是 6 个)现有关系时,事情就会变得困难。

public void addDepartment(String name, Department d) {
          Course c = courseRepository.findByName();
          Student s = studentRepository.findByName(name);
          s.setCourse(c)    // Without this, it will remove it from the graph
          s.setDepartment(d);
          studentRepository.save(s);
     }

如何解决这个问题? Neo4J 是否有一些机制来缓解这个问题?当需要解决一系列关系时,事情会变得更加困难。谢谢你。

java spring spring-boot neo4j spring-data-neo4j
1个回答
0
投票

neo4j spring 中更新动态关系存在一些问题。在 neo4j 社区 中有一个关于它的线程,其中提到了关系具有

@GeneratedValue
注释时的问题。 GitHub 上提出了一个问题,不久前合并了更改。不知道最新版本是否解决了所有问题。

所以,我想,你可以尝试一些不同的方法:

  • 检索记录,重新设置现有关系并添加新关系,然后保存。
  • 按照链接线程中的建议,按原样加载实体(没有所有关系)并通过 Neo4jTemplate#saveAs(entity, YourProjection.class) 保存它。
  • 删除
    @GeneratedValue
    注释。
  • (检查他们在后续版本中添加的修复程序是否解决了这个问题)
© www.soinside.com 2019 - 2024. All rights reserved.