假设我们有一个实体/节点结构:
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 密码中会是什么样子?
或者,
如果您不想用Root
标签标记任何节点,则可以内联完成所有操作,但它可能比Michael的版本慢一点
MATCH path = (e:Employee)<-[:REPORTS_TO*]-(e:Employee)
WHERE NOT (e)-[:REPORTS_TO]->()
RETURN path
limit 1000
我们有一个将罗斯文数据库转换为图形的示例,它具有类似的报告结构。可能值得一看。
我想你的意思是这样的:
// 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