Как сделать запрос дочерних узлов в сущности родительского узла neo4j? - PullRequest
0 голосов
/ 01 ноября 2018

Например, у меня есть такая сущность:

@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<>();
}

Затем мне нужно запросить 'Subject' по graphId;

@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 голосов
/ 01 ноября 2018

Вы можете попробовать вот так.

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

См. Соединение

0 голосов
/ 01 ноября 2018

Как предполагает ваша модель У субъекта есть несколько детей, поэтому, когда вы выбираете его по id, он возвращает декартово произведение вашего * ребенка. В этом случае вам нужно собрать своих детей (предметы, а затем вернуть)

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

или просто вы можете использовать findById () вашего хранилища, SDN создаст запрос самостоятельно

...