Neo4j Cypher - Получить узлы на нескольких путях отдельно и по порядку - PullRequest
0 голосов
/ 09 января 2019

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

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

enter image description here

Я хочу найти все узлы в каждом пути от узла 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>>.

Надеюсь, вы поняли идею.

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

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

1 Ответ

0 голосов
/ 12 января 2019

Мне удалось найти ответ на свой вопрос. Я понял намек из другого ТАКОГО ответа. 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

...