Я новичок в 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": []
}
]
}
]
}