Запрос Cypher для возврата графа как объекта, где каждый родительский узел содержит массив своих дочерних узлов? - PullRequest
0 голосов
/ 02 августа 2020

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

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

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

Пример:

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.

1 Ответ

1 голос
/ 05 августа 2020

Это должно вернуть объект 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
...