在Neo4J中实现双向Rich关系

时间:2016-07-15 11:56:38

标签: neo4j spring-data-neo4j-4 neo4j-ogm

我正在尝试使用Neo4J SDN构建以下场景。 有一个实体Person有一个Item实体列表。每个Item实体可以有一个或多个子项。我希望Person和项列表之间存在双向关系,以及Parent Item和Child Items之间的另一个双向关系。到目前为止,父项可以具有另一组子项的列表,但每个子项下面没有任何子项。

我尝试将域对象和关系构建为

@NodeEntity
public class Person {

    @GraphId 
    private Long id;
    private String name;
    private String email;
    @Relationship(type = "ITEM_CREATED_BY",direction = Relationship.INCOMING)
    List<PersonItemRelation> personItemRelations = new ArrayList<PersonItemRelation>();
}


@NodeEntity
public class Item {

    @GraphId
    Long id;
    String uuid;
    String name;
    @Relationship(type = "ITEM_CREATED_BY",direction = Relationship.OUTGOING)
    private PersonItemRelation personItemRelation ;
    @Relationship(type = "IS_CHILD_ITEM_OF",direction = Relationship.OUTGOING)
    private ItemParentChildRelation parentItemRelation;
    @Relationship(type = "IS_CHILD_ITEM_OF",direction = Relationship.INCOMING)
    private List<ItemParentChildRelation> subItemRelations = new ArrayList<ItemParentChildRelation>();
}

@RelationshipEntity(type = "IS_CHILD_ITEM_OF")
public class ItemParentChildRelation {

    @GraphId
    Long id;
    @DateLong
    Date creationDate;
    @StartNode
    Item childItem;
    @EndNode
    Item parentItem;
}


@RelationshipEntity(type = "ITEM_CREATED_BY")
public class PersonItemRelation implements Serializable {

    @GraphId
    Long id;
    @Property
    String uuid;
    @StartNode
    Item item;
    @EndNode
    Person person;
    @Property
    String status;
    @DateLong
    Date date;
}

以上所有实体都要求具有适当注释的getter和setter。

我的第一个问题是,这是实施模型的正确方法。

如果是这样,我将面临一些问题。 如果我想更新subItem(即,作为父项的子项的Item),则有时,父项和子项之间的关系将丢失。

我执行更新的方式如下

public void deactivateItem(String itemUuid){
    Item item=itemRepository.findActiveByUuid(itemUuid);
    if(item != null){
        item.setStatus("INACTIVE");
        itemRepository.saveItem(item);
    }
}

函数findActiveByUuid(String itemUuid)在ItemRepository中实现为

@Query("MATCH (p:Item {status:'ACTIVE'}) "
        + "where "
        + "(p.uuid={0}) "
        + "return p")
Item findActiveByUuid(String uuid);

我注意到的另一件事是,如果我使用cypher获取数据,如上所示,查询的深度为0.这表示当我试图从Item获取subItemRelations的大小时对象,结果为零。

但是,如果我使用像

这样的spring-data内置函数
Item findByUuid(String uuid);

然后subItemRelations的大小正确(在Item有一个或多个子项的情况下,&gt; 0)

我使用的是spring-data-neo4j 4.1.2.RELEASE和Neo4J 3.0.3社区版

0 个答案:

没有答案