java - Spring 数据 Neo4j : Complex relationships not persisting

标签 java neo4j spring-data spring-data-neo4j-4

同时添加节点之间的多个关系时,只会创建其中的一些关系。在下面的示例中,对 makeUser(...) 的调用仅填充部分关系。

主要

@Transactional
void clearDatabase() {
    session.execute("MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r");
}

void createPeople() {

    Person mark = new Person("Mark");
    mark.password = "mark123";
    people.save(mark);

    Organisation noxRentals = new Organisation("Nox Rentals");
    organisations.save(noxRentals);

    makeUser(noxRentals, mark, "Administrator", Right.ADMINISTRATE);
    makeUser(noxRentals, richard, "Administrator", Right.ADMINISTRATE);
    makeUser(classicVillas, mark, "Administrator", Right.ADMINISTRATE);
    makeUser(classicVillas, richard, "Administrator", Right.ADMINISTRATE);
    makeUser(classicVillas, charlotte, "Reservations", Right.LOGIN, Right.SEND_QUOTES);

}

@Transactional
void makeUser (Organisation organisation, Person person, String role, Right...rights) {
    IsUser account = organisation.addUser(person, role);
    account.addRights(rights);
    organisations.save(organisation);
}

void run() {
    clearDatabase();
    createPeople();
}

结果(注意 Nox 没有关系):

Missing Relationships

组织.java

@NodeEntity
public class Organisation extends NitroBaseEntity {

    @Relationship(type = "IsUser", direction = Relationship.INCOMING)
    Set<IsUser> users = new HashSet<>();

    public IsUser addUser(Person person, String role) {
        IsUser user = new IsUser(person, this, role);
        this.users.add(user);
        return user;
    }
}

Person.java

@NodeEntity
public class Person extends NitroBaseEntity {

    @Property
    String password;

    @Relationship(type = "IsUser", direction = Relationship.OUTGOING)
    Set<IsUser> users = new HashSet<>();

    public Set<IsUser> getUserAccounts() {
        return this.users;
    }

}

IsUser.java

@RelationshipEntity
public class IsUser {

    @GraphId
    Long id;

    @StartNode
    public Person person;

    @EndNode
    public Organisation organisation;

    @Property
    public String role;

    @Property
    public Set<Right> rights = new HashSet<>();

    public IsUser (Person person, Organisation organisation, String role) {
        this.person = person;
        this.organisation = organisation;
        this.role = role;
    }
}

完整源代码:https://bitbucket.org/sparkyspider/neo4j-sandbox-4/src/22eb3aba82e33dfe473ee15e26f9b4701c62fd8e/src/main/java/com/noxgroup/nitro/config/DatabaseInitializer.java?at=master

最佳答案

缺少两件事 -

  1. 还必须在 @RelationshipEntity 上指定类型,例如 @RelationshipEntity(type = "IsUser")
  2. Organization.addUser() 中,也将 IsUser 添加到 Person,例如 person.users.add(user);。这些实体必须可以从两端进行导航。

关于java - Spring 数据 Neo4j : Complex relationships not persisting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30594397/

相关文章:

Java 包 Log4J2 : MapFilters

java - 聚合中与下划线 id 不同的字段投影

java - 使用 Spring Data 时避免读取-修改-写入反模式的方法?

java - 检查可选对象是否不为空且为空

Java:使用字符串作为源代码的一部分

Java 循环优化

java - 使用 Neo 时出现问题

neo4j - 如何要求 Neo4j 考虑周期

java - Neo4J Spring relateTo 函数无法解析

mysql - spring-data-jpa @Query 支持正则表达式语法吗?