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 cypher?
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
Или если вы не хотите отмечать какой-либо из узлов меткой
Root
, Вы можете просто сделать все это встроенным, но это может быть немного медленнее, чем версия МайклаMATCH path = (e:Employee)<-[:REPORTS_TO*]-(e:Employee) WHERE NOT (e)-[:REPORTS_TO]->() RETURN path limit 1000
У нас есть пример перевода базы данных Northwind в граф, и он имеет аналогичную структуру отчетности. Может быть, стоит посмотреть.