以下详细信息将描述我的问题。
框架:Spring boot
数据库:Neo4j嵌入式模式
存储库:GraphRepository
以下是我的组织POJO
@NodeEntity
public class Organization extends UserBaseEntity {
@NotNull(message = "error.Organization.name.notnull")
private String name;
private String email;
@Relationship(type = HAS_SUB_ORGANIZATION)
private List<Organization> children = new ArrayList<>();
// getter and setters
}
试了很久:
使用具有特定深度的findOne。
例如:
graphRepo.findOne(organizationId,3);
这将返回完整的组织网络。
我需要为Organization生成层次结构数据。
有没有办法进行递归查询以生成组织层次结构。
我只需要id,name,children(Sub-Organization)
示例格式
[
{
id: 1,
name: 'Organization 1',
children: [
{ id: 2, name: 'Organization 1 ' },
{ id: 3, name: 'Organization 2' }
]
},
{
id: 4,
name: 'Organization 2',
children: [
{
id: 5,
name: 'Organization 2 unit'
}
]
}
]
答案 0 :(得分:1)
我建议你在我的应用程序中实现的解决方案,如下所示: 首先,定义OrganizationDTO以映射数据。
Class OrganizationDTO {
private String code;
private String name;
private List<OrganizationDTO> children;
//Add setter and getter
}
然后,使用您的密码查询修改您的存储库:
@Repository
public class OrganisationRepositoryImpl implement OrganisationRepository {
private final Neo4jUtils neo4jUtils;
List<Organisation> findOrg(String orgCode) {
Map<String, Object> params = map("orgCode", orgCode);
String query = "MATCH (n:Organisation)-[r:HAS_SUB_ORGANIZATION*]->(m:Organisation) "+
" where n.code = {orgCode} return " +
" n.code, "+
" n.name, "+
" m is not null haschildren ," +
" m as children" +
return neo4jUtils.cypher(query, params)
.map(this::mapToOrganization)
.collect(toList());
}
private OrganizationDTO mapToOrganization(Map<String, Object> map) {
OrganizationDTO org = new OrganizationDTO(
map.get("n.code"), map.get("n.name"));
if((Boolean)map.get("haschildren")){
org.setChilren(m.get("children");
}
}
}
实现Rest API时,OrganizationDTO会按照您的预期响应JSON格式。我希望这可以帮到你。