Как вернуть коллекции на основе меток узлов neo4j? - PullRequest
0 голосов
/ 27 июня 2019

Я не уверен, как написать запрос neo4j, который находит все узлы, включая метки, в кратчайшем пути и группирует их по меткам в выходных данных.

РЕДАКТИРОВАТЬ: ShorttestPath включает ссылки между тегами-> Файлы-> SubDirs-> SourceDir, и я хочу, чтобы все эти ссылки.

Этот синтаксис neo4j где-то неверен, но в основном это то, что я пытаюсь вернуть к своему коду Java Spring

MATCH (a:Tag),(b:File),(c:SourceDir),
path = shortestPath((a)-[*]->(c))
WHERE a.name=~('(?i).*'+"READ"+'.*')
FOREACH (n IN NODES(path) |
WHERE label(n) = "SubDir" as dir |
WHERE label(n) = "SourceDir" as src |
WHERE label(n) = "File" as file |
WHERE label(n) = "Tag" as tag)
RETURN COLLECT(dir) as dirs, src as source, COLLECT(file) as file, COLLECT(tag) as tags

Синтаксическая часть Java выглядит следующим образом и состоит из запроса neo4j и результата

 @Query("MATCH (a:Tag),(b:File),(c:SourceDir), "
             + "path = shortestPath((a)-[*]->(c)) "
             + "WHERE a.name=~('(?i).*'+{search}+'.*') "
             + "FOREACH (n IN NODES(path) | "
             + "WHERE label(n) = 'SubDir' as dir | "
             + "WHERE label(n) = 'SourceDir' as src | "
             + "WHERE label(n) = 'File' as file | "
             + "WHERE label(n) = 'Tag' as tag) "
             + "RETURN COLLECT(dir) as dirs, src as source, COLLECT(file) as files, COLLECT(tag) as tags)")
  public List<ResultData> findByTag(@Param("search") String search);

@QueryResult
public class ResultData
{
   Set<File> files;
   Set<Directory> dirs;
   Source source;
   Set<Tag> tags;
}

Какой правильный запрос neo4j даст мне ожидаемые результаты?

1 Ответ

0 голосов
/ 27 июня 2019

Это может работать для вас:

MATCH (a:Tag)
WHERE a.name=~('(?i).*'+"READ"+'.*')
MATCH p = shortestPath((a)-[*]->(c:SourceDir))
RETURN
  [n IN NODES(p) WHERE 'SubDir'    IN LABELS(n)] AS dirs,
  [n IN NODES(p) WHERE 'SourceDir' IN LABELS(n)] AS srcs,
  [n IN NODES(p) WHERE 'File'      IN LABELS(n)] AS files,
  [n IN NODES(p) WHERE 'Tag'       IN LABELS(n)] AS tags;

Примечание. Узел может иметь несколько меток, поэтому в приведенном выше запросе будет проверяться каждый узел на каждую метку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...