Spring数据Neo4j提取关系

问题描述 投票:0回答:2

我正在使用spring-data-neo4j V4,并寻求解决方案,如何获取未直接连接到已加载实体的实体。解释:

我的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并通过ID加载Membership时:

membershipRepository.findByMembershipId(id);

year实体将被获取,但month实体则不会。加载month实体时,谁能说出加载membership实体的最佳或推荐方法是什么?如http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/中所述,@Fetch自版本4起已过时,因此我需要另一种解决方案。

编辑:我在http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/中读到了变通方法,只需使用load中的Neo4jTemplate方法即可。因此,我通过以下方式加载每年的月份:

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

但是有更好的解决方案吗?

java spring-data-neo4j spring-data-neo4j-4
2个回答
1
投票

第一个选项是使用loadByProperty并将加载深度设置为2。

示例:

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

可用于SDN-4.1.0快照

但是如果您不想加载深度为2的Membership,因为您的图太多(来自其他关系),那么我认为您可以构造一个密码查询(使用OPTIONAL MATCH),使用neo4jTemplate和检索由于“ 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应该包含所有映射关系


0
投票

我也有同样的问题,我该如何实现热切取回?

© www.soinside.com 2019 - 2024. All rights reserved.