使用 Neo4jSessionFactory.queryForObject(或类似)加载所有相关实体

Load all related entities with Neo4jSessionFactory.queryForObject (or similar)

使用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 调用仅获取节点/对象及其相关节点/对象的 none。第二个 API 调用刷新节点及其所有关系。

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

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

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

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

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

我认为应该做你需要的。