【问题标题】:Neo4j: Recursive query for simple node structureNeo4j:简单节点结构的递归查询
【发布时间】:2014-11-22 23:44:20
【问题描述】:

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

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 密码中看起来如何?

【问题讨论】:

    标签: neo4j cypher recursive-query


    【解决方案1】:

    或者,如果您不想使用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 的示例,它具有类似的报告结构。可能值得一看。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        • 2017-02-14
        • 2014-01-25
        • 2020-03-04
        相关资源
        最近更新 更多