为Neo4j节点实体生成分层数据

时间:2016-12-15 10:24:25

标签: java neo4j spring-data cypher spring-data-neo4j

以下详细信息将描述我的问题。
框架: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'
       }

     ]
   }
 ] 

1 个答案:

答案 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格式。我希望这可以帮到你。