neo4j - 使用 Neo4j 获取一棵树

标签 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]]
}

如果相关的话,我将 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/

相关文章:

Neo4j:简单节点结构的递归查询

neo4j - uri 具有权限组件

shell - Neo4j - 通过 Neo4jShell 将密码查询文件结果导出到 .csv 或 .txt 文件

neo4j - 如何在 Neo4j 的 MERGE ON CREATE SET 查询中添加新关系

neo4j - 在数据浏览器选项卡中显示所有节点和关系

java - 如何获取插入NEO4J的最后一个内部ID?

java - Neo4j 密码查询 : Sum the results of two queries

neo4j - 如何隐藏 Neo4j 中节点之间不需要的关系

node.js - 哪个数据库用于基于 gps 的跟踪

neo4j - 如何避免路径中的循环或循环 Neo4j Cypher