【问题标题】:Spring data Neo4j fetch relationshipsSpring数据Neo4j获取关系
【发布时间】:2016-02-11 11:04:41
【问题描述】:

我正在使用 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 实体不会。 在加载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/ 中阅读了获取的解决方法,只需使用Neo4jTemplate 中的load 方法。 所以我通过以下方式加载每年的月份:

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


    【解决方案1】:

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

    例子:

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

    这适用于 SDN-4.1.0-Snapshot

    但是,如果您不想加载深度为 2 的成员资格,因为将加载太多图表(来自其他关系),那么我认为您可以构造一个密码查询(使用 OPTIONAL MATCH),使用 neo4jTemplate 执行它并检索将由于“智能对象映射”而自动映射的对象。

    例子:

    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 应该包含所有映射关系

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-26
      • 2021-04-16
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多