2016-02-11 48 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的结果应该包含所有映射关系