Итак ... Ваша иерархия довольно сложна для чтения ... поэтому я сосредоточусь на части ответа JSON. Хотя Neo4j не имеет Map как тип свойства, он действителен в Cypher.
Чтобы объединить результаты в карту , вы можете использовать этот формат
MATCH (c:City)<--(s:Sector)
RETURN {city_node:c, city_properties:PROPERTIES(c) name:c.name, sectors:COLLECT(s)} as city
В основном {} as varname
определяет вашу карту, а содержимое {}
определяет пары ключ-значение.
И вы можете объединить 2 карты с оператором +, например WITH map1 + map2 as mymap
. В случае конфликта значение на второй карте имеет приоритет.
Если вам нужны только свойства узла, а не всего узла, вы можете использовать PROPERTIES(c)
функцию вместо передачи в узел.
Одна вещь, которую вы быстро заметите, это то, что она не будет работать рекурсивно. Похоже, в вашем случае он зафиксирован на 2-х уровнях глубины. Так что это ограничение не должно быть проблемой.
В дополнение к этому, если это предназначено для масштабирования, вы можете сделать ваш Cypher разбитым на страницы (LIMIT + SKIP), чтобы уменьшить время отклика. (Возвращайте только то, что вам нужно, когда вам это нужно). В этой заметке может быть лучше объединить данные на стороне клиента, поскольку вы, вероятно, будете возвращать некоторые сектора для каждого города.