Java 为Neo4j节点实体生成分层数据
以下详细信息将描述我的问题。Java 为Neo4j节点实体生成分层数据,java,neo4j,spring-data,cypher,spring-data-neo4j,Java,Neo4j,Spring Data,Cypher,Spring Data Neo4j,以下详细信息将描述我的问题。 框架:Spring boot 数据库:Neo4j嵌入式模式 存储库:GraphRespository 下面是我的组织POJO @NodeEntity public class Organization extends UserBaseEntity { @NotNull(message = "error.Organization.name.notnull") private String name; private String email;
框架:Spring boot
数据库:Neo4j嵌入式模式
存储库:GraphRespository 下面是我的组织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
}
我建议您使用我在应用程序中实现的解决方案,如下所示: 首先,定义用于映射数据的OrganizationDTO
Class OrganizationDTO {
private String code;
private String name;
private List<OrganizationDTO> children;
//Add setter and getter
类组织到{
私有字符串码;
私有字符串名称;
私人名单儿童;
//添加setter和getter
}然后,使用cypher查询修改存储库:
@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");
}
}
}
@存储库
公共类OrganizationRepositoryImpl实现OrganizationRepository{
私人最终Neo4jUtils Neo4jUtils;
列表findOrg(字符串或代码){
映射参数=映射(“orgCode”,orgCode);
String query=“匹配(n:ORGANIZATION)-[r:HAS\u SUB\u ORGANIZATION*]->(m:ORGANIZATION)”+
“其中n.code={orgCode}返回”+
“n.代码,”+
“n.name,”+
m不是空值,而是子项+
“我还是孩子”+
返回neo4jUtils.cypher(查询,参数)
.map(此::mapToOrganization)
.collect(toList());
}
私有组织到映射到组织(映射){
OrganizationDTO org=新组织DTO(
map.get(“n.code”)、map.get(“n.name”);
if((布尔)map.get(“haschildren”)){
org.setChilren(m.get(“儿童”);
}
}
}
当实现Rest API时,组织会按照您的预期响应JSON格式。我希望这能帮助您。您是否尝试过使用带有
@query
注释的自定义存储库查询?
@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");
}
}
}