2015-09-15 38 views
1

使用neo4j-ogm,我寫了下面的代碼,它包含兩個數據庫調用。我希望它只有一個數據庫調用。用Neo4jSessionFactory.queryForObject(或類似的)加載所有相關實體

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);

第二數據庫呼叫是

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

    其中sessionneo4jSession

    我做了第二個API調用,因爲第一個API調用只提取節點/對象,而沒有其相關的節點/對象。第二個API調用刷新節點及其所有關係。

    有誰知道我怎麼能有效地做到這一切只有一個數據庫調用?

    queryForObject似乎不像許多其他neo4jSession方法那樣支持可變深度。

    回答

    3

    幾乎所有的Neo4jSession操作都將過濾器作爲形式參數。

    過濾器允許您在一個或多個您感興趣匹配的屬性上選擇指定類型(標籤)的對象。這些操作將全部匹配的過濾器節點及其相關節點返回到您指定的深度(默認深度= 1)。所以:

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

    應該做你需要什麼,我想。

    +0

    工作就像一個魅力。謝謝! –