Neo4j 从图中获取嵌套对象数组的响应

Neo4j get response of nested array of objects from graph

我是 neo4j 和 cypher 的新手,在使用 'WITH' 和 'Collect' 对查询进行分组时遇到问题, 所以我有如下图所示的图表:

我想要的是这样的回复:

processes:[
     {
      node,
      subprocesses:[
                    {node , events: [
                                     {node}
                                    ] 
                    },
                    { //
                    }
                   ]
     },
     {
      node,
      subprocesses:[
                    {node , events: [
                                     {node}
                                    ] 
                    },
                    { //
                    }
                   ]
     }
]

我目前的要求:

match (n:Group)-[r:DID_PROCESS]->(n2:Process) 
optional match (n2)-[r2:SUB_PROCESS]->(n3:Process) 
optional match (n3)-[he:HAS_EVENT]->(e:Event) 
where id(n)=21 with n , [n2,type(r2),n3,[type(he),e]] as rela 
return {group: n , tree:collect(rela)}

希望我对问题的解释清楚,在此先感谢!!

给定下图:

CREATE (g:Group {id: 21})
CREATE (p1:Process {id: 1})
CREATE (p2:Process {id: 2})
CREATE (p3:Process {id: 3})
CREATE (p4:Process {id: 4})
CREATE (e:Event {id: 1})
CREATE (g)-[:DID_PROCESS]->(p1)
CREATE (g)-[:DID_PROCESS]->(p2)
CREATE (p1)-[:SUB_PROCESS]->(p3)
CREATE (p1)-[:SUB_PROCESS]->(p4)
CREATE (p4)-[:HAS_EVENT]->(e)

并使用模式理解(https://neo4j.com/docs/cypher-manual/current/syntax/lists/#cypher-pattern-comprehension):

正在检索组及其进程:

MATCH (g:Group {id: 21})
RETURN {
processes: [(g)-[:DID_PROCESS]->(process) | process{.*}]
}

---

{
  "processes": [
    {
      "id": 2
    },
    {
      "id": 1
    }
  ]
}

以相同的方式扩展,以包含其子流程的流程:

MATCH (g:Group {id: 21})
RETURN {
processes: [(g)-[:DID_PROCESS]->(process) | 
    {
     node: process{.*}, 
     subprocesses: [(process)-[:SUB_PROCESS]->(sub) | sub{.*}]
    }
  ]
}


---

{
  "processes": [
    {
      "node": {
"id": 2
      },
      "subprocesses": []
    },
    {
      "node": {
"id": 1
      },
      "subprocesses": [
        {
          "id": 4
        },
        {
          "id": 3
        }
      ]
    }
  ]
}

最后,为子流程扩展它以检索它们的事件:

MATCH (g:Group {id: 21})
RETURN {
processes: [(g)-[:DID_PROCESS]->(process) | 
    {
     node: process{.*}, 
     subprocesses: [(process)-[:SUB_PROCESS]->(sub) | 
          {node: sub{.*}, events: [(sub)-[:HAS_EVENT]->(event) | event{.*}]}
       ]
    }
  ]
}

---

{
  "processes": [
    {
      "node": {
"id": 2
      },
      "subprocesses": []
    },
    {
      "node": {
"id": 1
      },
      "subprocesses": [
        {
          "node": {
"id": 4
          },
          "events": [
            {
              "id": 1
            }
          ]
        },
        {
          "node": {
"id": 3
          },
          "events": []
        }
      ]
    }
  ]
}