NEO4j Возвращает вложенный иерархический JSON из БД
У меня есть модель дерева на БД, как это показано на картинке
- Узел города связан с узлом региона с помощью IS_A_City_BELONGING_TO
- Секторный узел связан с узлом региона с помощью IS_A_SECTOR_BELONGING_TO_THAT_REGION
- Секторный узел связан с городским узлом IS_A_SECTOR_BELONGING_TO_THAT_CITY
Иерархический вложенный идеальный вывод json выглядит следующим образом
требуется иерархическое дерево файлов json code>
Indexes
ON :TTL(ttl) ONLINE
ON :City(cityName) ONLINE (for uniqueness constraint)
ON :Region(region) ONLINE (for uniqueness constraint)
ON :Sector(sectorName) ONLINE (for uniqueness constraint)
Constraints
ON ( city:City ) ASSERT city.cityName IS UNIQUE
ON ( region:Region ) ASSERT region.region IS UNIQUE
ON ( sector:Sector ) ASSERT sector.sectorName IS UNIQUE
Как сгенерировать файл json из базы данных, используя запрос cypher.
Большое спасибо вам.
1 ответ
Итак... Ваша иерархия довольно сложна для чтения... поэтому я сосредоточусь на ответной части 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), чтобы уменьшить время отклика. (Возвращайте только то, что вам нужно, когда вам это нужно). В этой заметке может быть лучше объединить данные на стороне клиента, так как вы, вероятно, будете возвращать некоторые сектора для каждого города.