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

标签 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);
这将返回完整的组织网络。

我需要为组织生成层次结构数据。
有没有办法进行递归查询来生成组织层次结构。


我只需要 ID、姓名、 child (子组织)
示例格式

[
    {
      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'
       }

     ]
   }
 ] 

最佳答案

我建议您使用我在应用程序中实现的解决方案,如下所示: 首先,定义一个用于映射数据的 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 格式。我希望这可以帮助你。

关于java - 为 Neo4j 节点实体生成分层数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41161810/

相关文章:

java - 在测试主题类中调用时,Mockbean 不会抛出错误

java - PageRequest 构造函数已被弃用

java - Spring数据MongoDB : search like on multiple fields

java - 如何使用 apache poi 和 java 对象填充 Excel 行

java - 如何在 Hibernate Search 中使用通配符和空格搜索字段

maven - 如何结合neo4j和elasticsearch

postgresql - Neo4j 代替关系数据库

java - RSocket 适用于生成的数据,但不适用于 Spring Reactive MongoDB

java - OSGI 容器中的数据源

javascript - neo4j 匹配具有未知属性列表的 Node