其他分享
首页 > 其他分享> > Neo4j与Spring-最佳存储库设计

Neo4j与Spring-最佳存储库设计

作者:互联网

目前,我正在基于Spring数据Neo4j进行项目.在大多数节点中,可能存在多种类型的不同关系,如下面的示例所示.

节点定义

    @NodeEntity(label = CollectionNames.User)
    public class User{

        @GraphId
        private Long id;

        //Different Parameters, removed because these are irrelevant
        @Relationship(type = RelationshipNames.HAS_CONTACT, direction = Relationship.OUTGOING)
        private Set<HasContact> contactList;

        @Relationship(type = RelationshipNames.HAS_INVITED, direction = Relationship.OUTGOING)
        private Set<HasInvited> invitedContacts;

        @Relationship(type = RelationshipNames.HAS_FAVORITE, direction = Relationship.OUTGOING)
        private Set<HasFavorite> favoriteMerchants;

    //And so many others such relationships

    //Constructor and Getters() & Setters()
}

储存库定义

@Repository
public interface UserRepository extends GraphRepository<User>{

    List<User> findByUsernameIn(Set<String> username, @Depth int depth);//Here for exp, I just want to load user with his/her 'contactList' entries only
    User findByUsername(String username, @Depth int depth);
}

尽管此存储库在以给定深度加载给定用户时可以正常工作,但是主要问题是此查询将以给定深度加载所有现有关系.正如我在这里只对某种/或一种特定类型的关系感兴趣,那么使用Spring Named Query方法怎么可能呢?使用命名查询方法加载时,可以为每个关系指定深度吗?还是我必须使用@Query注释为每个此类关系编写自定义查询?我们希望最大程度地减少自定义查询的使用!

那么,对于这种情况,Spring Data Neo4j中最好的存储库设计是什么?
建议将不胜感激!

解决方法:

从SDN版本4.2.x开始,@ Query中的自定义密码查询或使用session.query是避免加载所有相关实体的最佳选择.

在即将发布的版本中,将进行更细粒度的加载.看到这个github issue.

标签:spring-boot,neo4j,spring-data-neo4j,spring,spring-repositories
来源: https://codeday.me/bug/20191111/2018224.html