给定Neo4j REST服务器中的树木树林,我试图返回给定根顶点的一棵树。
由于每棵树都很大,因此我需要所有顶点和边的重复数据删除列表,以便能够在客户端重建完整的树。
我尝试了多种组合,MATCH (r:root)-[*]->()但是它们返回从根开始的任何路径,因此有很多重复项:
MATCH p = (r:root)-[*]->(x)
RETURN nodes(p) AS Vertices, rels(p) AS Edges";
Run Code Online (Sandbox Code Playgroud)
这将返回每个路径,如下所示,每次都重复每个节点:
a->b
a->b->c
a->b->c->d
Run Code Online (Sandbox Code Playgroud)
等等...
相反,我需要一个结果
{
Vertices: [a, b, c, d],
Edges: [[a, b], [b, c], [c, d]]
}
Run Code Online (Sandbox Code Playgroud)
如果相关的话,我正在使用带有Seraph的Node.js,但是我并没有严格地绑定到该库。
因此,首先,您可能想添加一个WHERE子句以确保您的路径始终以叶子结尾:
MATCH p = (r:root)-[*]->(x)
WHERE NOT(x-->())
RETURN nodes(p) AS Vertices, rels(p) AS Edges";
Run Code Online (Sandbox Code Playgroud)
因此,第二,如果要一次性获得所有节点和关系,则可能需要执行两个查询:
MATCH p = (r:root)-[*]->(x)
WHERE NOT(x-->())
UNWIND nodes(p) AS Vertex
RETURN DISTINCT Vertex;
MATCH p = (r:root)-[*]->(x)
WHERE NOT(x-->())
UNWIND rels(p) AS Edge
RETURN DISTINCT startNode(Edge), endNode(Edge);
Run Code Online (Sandbox Code Playgroud)
更新(迈克尔)
MATCH p = (r:root)-[*]->(x)
WHERE NOT(x-->())
UNWIND nodes(p) AS Vertex
WITH collect(DISTINCT Vertex) as nodes, p
UNWIND rels(p) AS Edge
RETURN nodes, collect(distinct Edge) as rels
Run Code Online (Sandbox Code Playgroud)
Update2(迈克尔)
我发现了一种更紧凑的方法
MATCH p = (:root)-[r*]->(x)
RETURN collect(DISTINCT id(x)) as nodes, [r in collect(distinct last(r)) | [id(startNode(r)),id(endNode(r))]] as rels
Run Code Online (Sandbox Code Playgroud)
如果您还想包括根节点,请使用 *0..