使用Neo4j获取树

时间:2015-06-19 14:16:09

标签: neo4j

鉴于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,如果相关,但我并没有严格限制在该库中。

1 个答案:

答案 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..