用Neo4j提取一棵树

Dar*_*nnu 2 neo4j

给定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,但是我并没有严格地绑定到该库。

Bri*_*ood 5

因此,首先,您可能想添加一个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..