【问题标题】:Load all related entities with Neo4jSessionFactory.queryForObject (or similar)使用 Neo4jSessionFactory.queryForObject (或类似)加载所有相关实体
【发布时间】:2015-09-15 18:49:44
【问题描述】:

使用 neo4j-ogm,我编写了以下代码,其中包含两个数据库调用。我希望它只有一个数据库调用。

public Member loadMemberByDomainSpecificId(String domainSpecificId) {
        String query = "match (m:Member {domainSpecificId: {domainSpecificId}}) return m;";
        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("domainSpecificId", domainSpecificId);
        Session neo4jSession = Neo4jSessionFactory.getInstance().getNeo4jSession();
        Member member = neo4jSession.queryForObject(Member.class, query, parameters);
        return super.find(member);
}

第一个数据库调用是

  1. neo4jSession.queryForObject(Member.class, query, parameters);

第二个数据库调用是

  1. return (Member)super(find(member);

superreturn session.load(Member.class, member.getId(), 1);

其中sessionneo4jSession

我进行第二次 API 调用是因为第一次 API 调用仅获取节点/对象,而不获取其相关节点/对象。第二个 API 调用刷新节点及其所有关系。

有谁知道我如何通过一次数据库调用有效地完成所有这些工作?

queryForObject 似乎不像许多其他 neo4jSession 方法那样支持可变深度。

【问题讨论】:

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


    【解决方案1】:

    几乎所有Neo4jSession 操作都将过滤器作为形式参数。

    过滤器允许您在一个或多个您有兴趣匹配的属性上选择指定类型(标签)的对象。这些操作将过滤器中的 所有 匹配节点及其相关节点返回到您指定的深度(默认深度 = 1)。所以:

    Collection&lt;Member&gt; members = session.loadAll(Member.class, new Filters().add("domainSpecificId", domainSpecificId))

    我认为应该做你需要的。

    【讨论】:

    • 工作就像一个魅力。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多