2013-12-19 11 views
1

У меня есть вложенные отношения has_many, которые я пытаюсь сопоставить с результатом json.Вложенные отношения has_many в cypher

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

MATCH (a:Person { name: "Andres" })-[:FATHER_OF]->(child) 
    RETURN 
    {name:a.name, kids:collect(child.name)} as document 

То, что я хочу, а не что-то вроде этого

MATCH (a:Person { name: "Andres" })-[:FATHER_OF]->(child)-[:has_read]->(book)-[:has_chapter]->(chapter) 
    RETURN 
    {name:a.name, kids:collect({"name":child.name, has_read:collect(book)})} as document 

В этом случае я хотел бы вернуть объект json такой структуры:

{ 
    "name": "Andres" 
    "kids": [ 
      { 
      "name":"Bob" 
      "has_read": [ 
          { 
          "name":"Lord of the Rings", 
          "chapters": ["chapter1","chapter2","chapter3"] 
          }, 
          { 
          "name":"The Hobbit", 
          "chapters": ["An unexpected party","Roast mutton"] 
          } 
         ] 
      }, 
      { 
      "name":"George" 
      "has_read": [ 
          { 
          "name":"Lord of the Rings", 
          "chapters": ["chapter1","chapter2","chapter3"] 
          }, 
          { 
          "name":"Silmarillion", 
          "chapters": ["chapter1","chapter2"] 
          } 
         ] 
      } 

      ] 
} 

ответ

3

Вы можете попробовать:

Если вы держите матч в главе, вам понадобятся различные collect(distinct book.title) иначе нет.

MATCH (a:Person { name: "Andres" })-[:FATHER_OF]->(child), 
     (child)-[:has_read]->(book)-[:has_chapter]->(chapter) 
WITH a,child,collect(distinct book.title) as books 
RETURN 
    {name:a.name, 
    kids:collect({name:child.name, 
       has_read:books})} as document 

Ох, и если вы хотите, чтобы включить главы в результатах тоже, а затем просто добавить еще с :)

MATCH (a:Person { name: "Andres" })-[:FATHER_OF]->(child), 
     (child)-[:has_read]->(book)-[:has_chapter]->(chapter) 
WITH a,child, {title: book.title, chapters: collect(chapter.title)} as book_doc 
WITH a,child, collect(book_doc) as books 
RETURN 
    {name:a.name, 
    kids:collect({name:child.name, 
       has_read:books})} as document 

см: http://console.neo4j.org/r/kua2pi

+0

«собирать ({имя: ребенок. name, has_read: books}) «Я еще не видел этот синтаксис сбора. Документировано ли это где угодно? –

+0

@BobB - http://neo4j.com/docs/stable/query-aggregation.html#aggregation-collect – OpenDataAlex

Смежные вопросы