NEO4j Возвращает вложенный иерархический JSON из БД

ALLRELATED

У меня есть модель дерева на БД, как это показано на картинке

  • Узел города связан с узлом региона с помощью IS_A_City_BELONGING_TO
  • Секторный узел связан с узлом региона с помощью IS_A_SECTOR_BELONGING_TO_THAT_REGION
  • Секторный узел связан с городским узлом IS_A_SECTOR_BELONGING_TO_THAT_CITY

Иерархический вложенный идеальный вывод json выглядит следующим образом

code> требуется иерархическое дерево файлов json </ code требуется иерархическое дерево файлов json

введите описание изображения здесь

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), чтобы уменьшить время отклика. (Возвращайте только то, что вам нужно, когда вам это нужно). В этой заметке может быть лучше объединить данные на стороне клиента, так как вы, вероятно, будете возвращать некоторые сектора для каждого города.

Другие вопросы по тегам