Neo4j Cypher - получение узлов на нескольких путях отдельно и по порядку

Я использую в своем приложении Neo4j (версия 3.4.1) и Spring-data-neo4j (5.0.10.RELEASE). Я тоже использую OGM.

У меня есть следующие отношения между моими узлами:

введите описание изображения здесь

Я хочу найти все узлы на каждом пути от узла A до узла F (в порядке обхода)

Например: для пути A -> B -> F мне нужны узлы A, B, F (в этом порядке)

Для пути A -> C -> D -> F мне нужны узлы A, C, D, F (в этом порядке) и т. Д.

Я хочу захватить узлы, пройденные на каждом пути отдельно.

Шифровальный запрос, который я придумал, выглядит следующим образом:

@Query("MATCH p=((u:User{name:{nameOne}})-[:RELATED*1..3]-(v:User{name:{nameTwo}})) RETURN p")
List<User> getRelationBetweenUsers(@Param("nameOne") String nameOne, @Param("nameTwo") String nameTwo);

Я также попытался использовать List<List<User>> в качестве возвращаемого типа, чтобы получить узлы на каждом пути в виде отдельного списка, как показано ниже.

 @Query("MATCH p=((u:User{name:{nameOne}})-[:RELATED*1..3]-(v:User{name:{nameTwo}})) RETURN p")
    List<List<User>> getRelationBetweenUsers(@Param("nameOne") String nameOne, @Param("nameTwo") String nameTwo);

Однако это возвращает все узлы, пройденные по нескольким путям вместе, тогда как я хочу их по каждому пути.

 i.e result is List <A,B,C,D,F> where as what I want is
List<List<A,B,F>, List<A,C,D,F>, List<A,D,F>>.

Надеюсь, вы уловили идею.

Может ли кто-нибудь дать несколько указателей / предложений о том, как я могу достичь ожидаемых результатов.

С уважением, Варун


person LearnToLive    schedule 09.01.2019    source источник
comment
A,B,C,D,F не является допустимым путем, учитывая отношения на вашем рисунке. Кроме того, результатом является список списков (узлов), но вы говорите, что получаете только список узлов. Правильно ли обрабатываете результат?   -  person cybersam    schedule 09.01.2019
comment
Спасибо @cybersam. Приносим свои извинения, я ошибся в диаграмме, так как сделал ее вручную. Я исправил диаграмму. Также я попытался вернуть как List ‹Nodes›, так и List ‹List ‹Nodes››, я получил тот же результат по запросу. Я обновил вопрос, чтобы включить эту информацию   -  person LearnToLive    schedule 09.01.2019
comment
Ваша новая диаграмма еще больше сбивает с толку, поскольку я не знаю, как она должна приводить к заявленным вами желаемым результатам. Вы хотите найти пути, по которым все отношения будут идти в последовательном направлении? Если да, попробуйте изменить свой MATCH запрос так, чтобы в шаблоне взаимосвязи была стрелка, указывающая направление (например, -[:RELATED*1..3]->).   -  person cybersam    schedule 10.01.2019
comment
Приносим извинения за задержку с ответом @Cybersam. Я хотел получить узлы на всех путях, соответствующих заданным отношениям, которые находились на расстоянии от 1 до 3 шагов. Также узлы должны быть в порядке перехода.   -  person LearnToLive    schedule 12.01.2019


Ответы (1)


Я смог найти ответ на свой вопрос. Я понял намек из другого ТАК-ответа. Spring Data | Neo4J | Запрос пути в правильном порядке

Вот что я сделал, чтобы получить желаемый результат

@Query("MATCH p=((u:User{name:{nameOne}})-[:RELATED*1..3]-(v:User{name:{nameTwo}})) RETURN nodes(p) as users")
org.neo4j.ogm.model.Result getRelationBetweenUsers(@Param("nameOne") String nameOne, @Param("nameTwo") String nameTwo);

В моем классе обслуживания, где я вызываю вышеуказанный метод, у меня есть следующая реализация:

List<List<User>> usersOnDifferentPaths = new ArrayList<>();
Iterable<Map<String, Object>> queryResults = userRepository.getRelationBetweenUsers(nameOne, nameTwo).queryResults();
queryResults.forEach(queryResult -> {
            List<User> usersOnSinglePath = (List<User>) queryResult.get("users");
            usersOnDifferentPaths.add(usersOnSinglePath);
        });

Надеюсь, кто-то сочтет это полезным.

PS: Обратите внимание, что я намеренно пропускаю связи в запросе, так как меня интересуют только узлы.

С уважением,

V

person LearnToLive    schedule 12.01.2019