如何查询neo4j的父节点实体中的子节点?

时间:2018-11-01 04:11:41

标签: neo4j spring-data-neo4j

例如,我有一个这样的实体:

@Data
@NodeEntity(label = "Subject")
public class Subject {
     @GraphId
     private Long id;
     private String name;

     @Relationship(type = "HAVE_S", direction = Relationship.OUTGOING)
     private Set<Subject> children = new HashSet<>();
}

然后我需要通过graphId查询'Subject';

@Query("MATCH (s:Subject)-[r:HAVE_S*1]->(c:Subject) WHERE ID(s) = {graphId} RETURN s, r, c;")
Subject findById(@Param("graphId") Long graphId);

我想要的结果就像下面的json:

{
    "id": 62
    "name": "Java"
    "children": [
        {
            "name": "Collection",
            "id": 105
        },
        {
            "name": "MultipleThreads",
            "id": 0
        }
    ]
}

但是当我通过Spring Data执行上面的密码时,出现错误并说“结果不是预期的大小。预期1行,但发现3”。

希望我能帮助我解决这个问题,

2 个答案:

答案 0 :(得分:0)

正如模型所建议的,一个对象有多个孩子,因此当您通过id来获取它时,它将返回您的孩子*的笛卡尔乘积。在这种情况下,您需要收集孩子(对象然后返回)

@Query("MATCH (s:Subject)-[r:HAVE_S*1]->(c:Subject) WHERE ID(s) = {graphId} RETURN s,  collect(c) as childrens;")

或者只是您可以使用SDN将自行创建查询的存储库中的findById()

答案 1 :(得分:0)

您可以尝试这样。

MATCH (k:LabelsTree {name:'465afe3c118589de357745a709c0441f'}) CALL apoc.path.spanningTree(k,{labelFilter:'+LabelsTree', maxLevel:3, optional:true, filterStartNode:true}) yield path return path

Refer to the connection