NEO4j Возвращает вложенный иерархический JSON из БД - PullRequest
0 голосов
/ 02 июля 2018

ALLRELATED

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

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

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

imageneeded json file hierarchical tree">

enter image description here

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 из db с помощью запроса шифра.

Большое спасибо.

1 Ответ

0 голосов
/ 03 июля 2018

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

...