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

时间:2014-11-22 23:44:20

标签: neo4j cypher recursive-query

我们假设我们有一个实体/节点结构:

Emp: e_id, e_name, e_bossid

在Neo4j中,我有这种结构和关系e_bossid->[reports_to]->e_id的节点。 我想在neo4j中构造一个递归查询,它等同于下面的sql递归查询:

 WITH RECURSIVE Emp_CTE AS (
        SELECT e_id, e_name, e_bossid, w_id, w_s1, w_s2, w_s3, w_s4, w_s5
        FROM empfull
        WHERE e_bossid IS NULL
        UNION ALL
        SELECT e.e_id, e.e_name, e.e_bossid, e.w_id, e.w_s1, e.w_s2, e.w_s3, e.w_s4, e.w_s5
        FROM empfull e
        INNER JOIN Emp_CTE ecte ON ecte.e_id = e.e_bossid
)

SELECT *
FROM Emp_CTE LIMIT 1000 OFFSET 1
;

Neo4j cypher中的查询效果如何?

2 个答案:

答案 0 :(得分:3)

或者,如果您不想标记带有Root标签的任何节点,您可以直接执行所有内联,但它可能比Michael的版本慢一点

MATCH path = (e:Employee)<-[:REPORTS_TO*]-(e:Employee)
WHERE NOT (e)-[:REPORTS_TO]->()
RETURN path
limit 1000

我们有translating the Northwind database to a graph的示例,它有类似的报告结构。可能值得一看。

答案 1 :(得分:2)

我认为你的意思是这样的:

// Mark the root (aka `e_bossid IS NULL`)
MATCH (e:Employee) WHERE NOT (e)-[:REPORTS_TO]->()
SET e:Root

// find all paths of arbitrary length from he root
MATCH path = (b:Root)<-[:REPORTS_TO*]-(e:Employee)
RETURN path
limit 1000