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": []
}
]
}
]
}
我是 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": []
}
]
}
]
}