2016-02-11 78 views
0

我正在使用spring-data-neo4j V4並尋找解決方案如何獲取不直接連接到已加載實體的實體。解釋:Spring數據Neo4j獲取關係

我在我的neo4j數據庫中有3個實體。

@NodeEntity(label="membership") 
public class Membership extends AbstractEntity{ 

    public Membership(){ } 

    private String membershipId; 

    @Relationship(type = "IN_YEAR", direction = Relationship.OUTGOING) 
    private Set<Year> year = new HashSet<>(); 

    //getter+setter 

} 

@NodeEntity(label="year") 
public class Year extends AbstractEntity{ 

    public Year(){} 

    private String name; 
    private String membershipId; 

    @Relationship(type = "IN_MONTH", direction = Relationship.OUTGOING) 
    private Set<Month> month = new HashSet<>(); 

    //getter+setter 
} 

@NodeEntity(label="month") 
public class Month extends AbstractEntity{ 

    private String name; 

    //getter+setter 
} 

當我打電話給我的MembershipRepository和加載Membership通過編號:

membershipRepository.findByMembershipId(id); 

year實體將是牽強,但month實體沒有。 任何人都可以告訴加載membership實體時加載month實體的最佳或推薦方式是什麼?正如http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/中所述,@Fetch自從版本4開始已經過時,所以我需要另一種解決方案。

編輯: 我http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/閱讀獲取解決方法,只是用從Neo4jTemplateload方法。 所以我通過加載個月,每年:

Set<Year> fetchedYear = new HashSet<>(); 
for(Year year : ms.getYear()){ 
    fetchedYear.add(neo4jTemplate.load(Year.class, year.getId(), 1)); 
} 
ms.setYear(fetchedYear); 

但有一個更好的解決辦法?

回答

1

第一種選擇是使用loadByProperty和加載深度設置爲2

例子:

neo4jTemplate.loadByProperty(Membership.class, "membershipId", value, 2); 

這是適用於SDN-4.1.0-快照

但如果你不想加載深度爲2的成員,因爲你的圖表太多會被加載(來自其他關係),那麼我認爲你可以構造一個密碼查詢(使用OPTIONAL MATCH),用neo4jTemplate執行它並檢索Object然後將是自動的由於「smartObjectMapping」而被映射。

例子:

String query = "MATCH (n:Membership{membershipId:{id})-[r]-(m) OPTIONAL MATCH (m:Year)-[e]-(x) RETURN n,r,m,e,x"; 
Map<String,Object> map = new HashMap<>(); 
map.put("id",value); 
Result result = neo4jTemplate.query(query,map); 

現在N的結果應該包含所有映射關係