Spring 数据 Neo4j 获取关系
Spring data Neo4j fetch relationships
我正在使用 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/ 中阅读了 fetch 的解决方法,只需使用 Neo4jTemplate
中的 load
方法。
所以我通过以下方式加载每年的月份:
Set<Year> fetchedYear = new HashSet<>();
for(Year year : ms.getYear()){
fetchedYear.add(neo4jTemplate.load(Year.class, year.getId(), 1));
}
ms.setYear(fetchedYear);
但是有更好的解决方案吗?
第一个选项是使用 loadByProperty 并将加载深度设置为 2。
示例:
neo4jTemplate.loadByProperty(Membership.class, "membershipId", value, 2);
这适用于 SDN-4.1.0-Snapshot
但是如果您不想加载深度为 2 的成员资格,因为将加载太多图表(来自其他关系),那么我认为您可以构建一个密码查询(使用可选匹配),执行它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 应该包含所有映射关系
我正在使用 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/ 中阅读了 fetch 的解决方法,只需使用 Neo4jTemplate
中的 load
方法。
所以我通过以下方式加载每年的月份:
Set<Year> fetchedYear = new HashSet<>();
for(Year year : ms.getYear()){
fetchedYear.add(neo4jTemplate.load(Year.class, year.getId(), 1));
}
ms.setYear(fetchedYear);
但是有更好的解决方案吗?
第一个选项是使用 loadByProperty 并将加载深度设置为 2。
示例:
neo4jTemplate.loadByProperty(Membership.class, "membershipId", value, 2);
这适用于 SDN-4.1.0-Snapshot
但是如果您不想加载深度为 2 的成员资格,因为将加载太多图表(来自其他关系),那么我认为您可以构建一个密码查询(使用可选匹配),执行它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 应该包含所有映射关系