鉴于Neo4j REST服务器中有一片树林,我试图在给定根顶点的情况下返回一棵树。
由于每棵树都很大,我需要一个去重复的所有顶点和边的列表,以便能够在客户端重建完整的树。
我在MATCH (r:root)-[*]->()
周围尝试了多个组合,但是它们从根开始返回任何路径,因此有很多重复:
MATCH p = (r:root)-[*]->(x)
RETURN nodes(p) AS Vertices, rels(p) AS Edges";
这将返回如下所示的每个路径,每次都重复每个节点:
a->b
a->b->c
a->b->c->d
等...
相反,我需要一个结果
{
Vertices: [a, b, c, d],
Edges: [[a, b], [b, c], [c, d]]
}
我使用带有Seraph的Node.js,如果相关,但我并没有严格限制在该库中。
答案 0 :(得分:5)
首先,您可能需要添加WHERE
子句以确保您的路径始终以叶子结尾:
MATCH p = (r:root)-[*]->(x)
WHERE NOT(x-->())
RETURN nodes(p) AS Vertices, rels(p) AS Edges";
第二,如果你想一次性获得所有节点和关系,你可能需要执行两个查询:
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);
更新(迈克尔)
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
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
如果您还想包含根节点,请使用*0..