Как я могу получить несколько списков в качестве вывода, когда я передаю несколько идентификаторов в запросе Neo4j Cypher? - PullRequest
0 голосов
/ 17 января 2020

Мой текущий запрос шифрования выглядит следующим образом

MATCH (p:xyz)-[:children *]->(c:xyz)
WHERE p.Code=100
WITH COLLECT (c) + p AS all 
UNWIND all as p MATCH (p)-[:children]->(c) 
RETURN collect(DISTINCT c.Code) as Children_Nodes

Это дает мне вывод типа

"Children_Nodes"                                                      │
╞══════════════════════════════════════════════════════════════════════╡
│[101,102,103,104,105]│

И если я передам два разных идентификатора, например

MATCH (p:xyz)-[:children *]->(c:xyz)
WHERE p.Code IN [100,200]
WITH COLLECT (c) + p AS all 
UNWIND all as p MATCH (p)-[:children]->(c) 
RETURN collect(DISTINCT c.Code) as Children_Nodes

Это вернет что-то вроде

"Children_Nodes"                                                      │
╞══════════════════════════════════════════════════════════════════════╡
│[101,102,103,104,105,201,202,203,204,205]│

Но на самом деле мне нужны два разных отдельных списка, а не один сопоставленный список, как указано выше

"Children_Nodes"                                                      │
╞══════════════════════════════════════════════════════════════════════╡
│[101,102,103,104,105] [201,202,203,204,205]│

Ответы [ 3 ]

0 голосов
/ 18 января 2020

Это должно вернуть строку для каждого p.Code вместе со списком кодов его потомков:

MATCH (p:xyz)-[:children*]->(c:xyz)
WHERE p.Code IN [100, 200]
RETURN p.Code AS pCode, COLLECT(DISTINCT c.Code) AS descendantCodes
0 голосов
/ 20 января 2020

Я нашел ответ на свой вопрос. Если кому-то нужно, они могут сослаться на ответ ниже. Я подправил данный запрос. Пожалуйста, ответьте, если у них есть лучшее решение моей проблемы.

MATCH path = (p:xyz)-[:children *]->(c:xyz) WHERE p.Code IN [100, 200]
WITH 
COLLECT(path) as paths, COLLECT (c) + p AS all UNWIND all as p
MATCH (p)-[:children]->(c) CALL apoc.convert.toTree(paths,true, {nodes: {xyz: 
['Code','Name']}}) yield  value as hierarchy RETURN hierarchy,collect(distinct c.Code) 
as code_list

Но когда я не использую

CALL apoc.convert.toTree(paths,true, {nodes: {xyz: 
['Code','Name']}}) yield  value as hierarchy

И просто

MATCH path = (p:xyz)-[:children *]->(c:xyz)WHERE p.Code IN 
[100,200] WITH COLLECT(path) as paths, COLLECT (c) + p AS all UNWIND all as p 
MATCH (p)-[:children]->(c) CALL apoc.convert.toTree(paths,true, {nodes: 
{xyz: ['Code','Name']}}) yield  value as hierarchy RETURN 
hierarchy,collect(distinct c.Code) as code_list

Выход я получаю снова, это сопоставленный список, а не отдельный.

0 голосов
/ 17 января 2020

Как насчет этого?

MATCH (p:xyz)-[:children *]->(c:xyz)
WHERE p.Code IN [100,200]
WITH p, COLLECT (DISTINCT c.Code) AS children
RETURN COLLECT(children) AS Children_Nodes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...