2014-11-22 120 views
2

递归查询让我们说我们有一个实体/节点结构:Neo4j重点:简单的节点结构

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的暗号?

回答

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 
3

或者,如果你不想用Root标签来标记任何一个节点,你可以只是做了所有内联,但它可能会有点比迈克尔的版本

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

较慢我们有translating the Northwind database to a graph一个例子,它有一个类似的报告结构。也许值得一瞧。