Циркулярная связь между вопросами производительности - PullRequest
0 голосов
/ 26 марта 2019

У меня возникают проблемы с производительностью при сохранении циклических отношений (3 объекта) при использовании neo4j OGM: https://i.imgur.com/OP43FTB.png

Правила:

  • 1 курс состоит из 1 предмета и 1 учителя
  • Учитель имеет несколько курсов и несколько предметов
  • В предметах есть несколько учителей и несколько курсов

Исходя из количества сохраненных экземпляров, время сохранения не является линейным, после определенного количества объектов операция «никогда» не завершается.

Используются следующие версии: neo4j-ogm-core и neo4j-ogm-bolt-driver версии 3.1.8

На основе класса сущности:

@NodeEntity
public abstract class Entity {

    @Id
    @GeneratedValue
    private Long id;

    @Index(unique = true)
    private String uuid;

    public Entity() {
        uuid = UUID.randomUUID().toString();
    }

    public Long getId() {
        return id;
    }

    public String getUuid() {
        return uuid;
    }

    @Override
    public int hashCode() {
        return Objects.hash(uuid);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Entity)) {
            return false;
        }

        Entity other = (Entity) obj;

        return Objects.equals(getUuid(), other.getUuid());
    }
}

@NodeEntity
public class Course extends Entity {

    private String name;

    @Relationship(type = "SUBJECT_TAUGHT")
    private Subject subject;

    @Relationship(type = "TEACHES_CLASS", direction = Relationship.INCOMING)
    private Teacher teacher;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Subject getSubject() {
        return subject;
    }

    public void setSubject(Subject subject) {
        this.subject = subject;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

}

@NodeEntity
public class Subject extends Entity {

    private String name;

    @Relationship(type = "TAUGHT_BY")
    private Set<Teacher> teachers = new HashSet<>();

    @Relationship(type = "SUBJECT_TAUGHT", direction = "INCOMING")
    private Set<Course> courses = new HashSet<>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Teacher> getTeachers() {
        return teachers;
    }

    public void setTeachers(Set<Teacher> teachers) {
        this.teachers = teachers;
    }

    public Set<Course> getCourses() {
        return courses;
    }

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }

}

@NodeEntity
public class Teacher extends Entity {

    private String name;

    @Relationship(type = "TEACHES_CLASS")
    private Set<Course> courses = new HashSet<>();

    @Relationship(type = "TAUGHT_BY", direction = Relationship.INCOMING)
    private Set<Subject> subjects = new HashSet<>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Course> getCourses() {
        return courses;
    }

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }

    public Set<Subject> getSubjects() {
        return subjects;
    }

    public void setSubjects(Set<Subject> subjects) {
        this.subjects = subjects;
    }

}

Список курсов создается и сохраняется таким образом:

    public T createOrUpdate(T entity) {
        session.save(entity);
        return find(entity.getId());
    }

Когда генерируется 10 экземпляров каждого класса (10 курсов, 10 учителей, 10 предметов), метод сохранения никогда не заканчивается.

Спасибо.

...