使用Neo4jSessionFactory.queryForObject(或类似)

时间:2015-09-15 18:49:45

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

使用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);
  2. 第二次数据库调用是

    1. return (Member)super(find(member);
    2. superreturn session.load(Member.class, member.getId(), 1);

      其中sessionneo4jSession

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

Collection<Member> members = session.loadAll(Member.class, new Filters().add("domainSpecificId", domainSpecificId))

应该做我认为需要的事情。