Шифровать запрос, чтобы вернуть граф как объект, где каждый родительский узел содержит массив своих дочерних элементов?

У меня есть график, подобный приведенному ниже:

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

Какой шифровальный запрос я должен использовать, чтобы вернуть граф как объект, где каждый родительский узел содержит массив своих дочерних узлов?

Пример:

state: {
  name: 'New York'
  publishingCompanies: [
    {
      name: 'Penguin'
      authors: [
        {
          name: 'George Orwell',
          books: [
            { name: 'Why I Write'},
            { name: 'Animal Farm'},
            { name: '1984' }
          ]
        },
        {
          name: 'Vladimir Nobokov'
          books: [
            { name: 'Lolita' }
          ]
        },
        ...
      ]
    },
    { 
      name: 'Random House',
      authors: [
        ...
      ]
    }
  ]
}

Я попытался использовать apoc.convert.toTree, но он вернул массив путей от State до Book.


person Dan    schedule 02.08.2020    source источник


Ответы (1)


Это должно вернуть объект state (при условии, что имя состояния передается через stateName параметр):

MATCH (s:State)
WHERE s.name = $stateName
OPTIONAL MATCH (s)-[:IS_STATE_OF]->(c)
OPTIONAL MATCH (c)-[:PUBLISHED_FOR]->(a)
OPTIONAL MATCH (a)-[:WROTE]->(b)
WITH s, c, a, CASE WHEN b IS NULL THEN [] ELSE COLLECT({name: b.name}) END AS books
WITH s, c, CASE WHEN a IS NULL THEN [] ELSE COLLECT({name: a.name, books: books}) END AS authors
WITH s, CASE WHEN c IS NULL THEN [] ELSE COLLECT({name: c.name, authors: authors}) END AS pcs
RETURN {name: s.name, publishingCompanies: pcs} AS state
person cybersam    schedule 05.08.2020
comment
Обновлено предложение, которое создает books, чтобы элементы соответствовали желаемым результатам. - person cybersam; 05.08.2020