保留一个不是 NodeEntity 的 RelationshipEntity 属性

Persist a RelationshipEntity that is not a NodeEntity property

在 SDN4 中,我希望保留 @RelationshipEntity 而不是 @NodeEntity 的 属性。 示例:

@NodeEntity
public class User{
    Long id;
}

@RelationshipEntity(type="FOLLOWS")
public class Follows{
    @GraphId   private Long relationshipId;
    @StartNode private User follower;
    @EndNode   private User followee;
    @Property  private Date from;

    public Follows(){}
    public Follows(User u1, User u2){
         this.follower = u1;
         this.followee = u2;
    }
}

@Repository
interface FollowsRepository extends GraphRepository<Follows>{}

然后像这样坚持 Follows @Relationship

...
followsRepository.save(new Follows(user1, user2));
...   

但是这样做时,Relationship 并没有持久化!!

遗憾的是 如已接受的答案所述,这(尚)无法完成(SDN 4.0.0.RELEASE)

解决方法 1

可以在 GraphRepositories 中使用 @Query 坚持 @RelationshipEntities

@Query("Match (a:User), (b:User) WHERE id(a) = {0} 
                     AND id(b) = {1} CREATE (a)-[r:FOLLOWS {date:{2}}]->(b) RETURN r ")

解决方法 2

这也可以通过将 Follows 视为 @NodeEntity 来完成,这可能不是最有效的做法 但是 不会影响任何域的 @NodeEntities,也不是服务层 AND 在加载和持久化实体时,您不必弄乱深度因子

@NodeEntity
public class User{
    Long id;
}

@NodeEntity
public class Follows{
    private Long Id;
    @Relationship(type="FOLLOWER")
    private User follower;
    @Relationship(type="FOLLOWEE")
    private User followee;
    private Date from;

    public Follows(){}
    public Follows(User u1, User u2){
         this.follower = u1;
         this.followee = u2;
    }
}

....
//Placed in userService
Follows createFollowsRelationship(User u1, User u2){
   return followsRepository.save(new Follows(user1, user2));
}
.....

目前,当关系实体未被参与节点实体引用时,您不能直接保留它。 您必须保存起始节点并确保它具有对关系实体的引用。

将对关系实体的持久化方式进行一些改进,但在下一个版本中不会。