我正在尝试使用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社区版