我不确定如何编写一个neo4j查询,该查询在最短路径中找到包括标签在内的所有节点,然后按标签将其分组为输出。
编辑:ShortestPath包括标签 -> files-> subdirs-> sourcedir之间的链接,我想要所有这些链接。
此neo4j语法在某个地方是错误的,但这基本上是我试图返回我的Java Spring Code
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查询给我预期的结果?
这可能对您有用:
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;
注意:一个节点可以具有多个标签,因此上述查询将检查每个标签的每个节点。