给定 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]]
}
如果相关的话,我将 Node.js 与 Seraph 一起使用,但我并没有严格绑定(bind)到该库。
最佳答案
因此,首先,您可能需要添加一个 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
更新2(迈克尔)
我找到了一种更紧凑的方式
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..
关于neo4j - 使用 Neo4j 获取一棵树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30940411/