2014-02-20 5 views
6

Представьте схему фотоальбома ж/пользователей, альбомов и фотографии:Neo4j высчитывать вложенный собирать

User -[owns]-> Album -[contains]-> Photo 

Могу ли я сделать вложенный собрать, чтобы получить фотографии, вложенные в альбомах, и альбомы вложенный в Пользователе? Я хотел бы результаты, похожие на:

{ "users": [ 
    { "name": "roger dodger", 
     "albums": [ 
     { "album": "album1", 
      "photos": [ 
      {"url": "photo1.jpg"}, 
      {"url": "photo2.jpg"} 
      ] 
     } 
     ] 
    } 
    ] 
} 

Это кажется близко, но я не мог изменить его в соответствии с моими потребностями: Nested has_many relationships in cypher (Может быть проблемой, что веб-консоль Neo4j 2.0 не поддерживает синтаксис JSON в том, что ? пример)

ответ

19

Попробуйте этот запрос:

MATCH (a:USER)-[:owns]->(b:ALBUM)-[:CONTAINS]->(c:PHOTO) 
WITH a,b,{url: c.name} as c_photos 
WITH a,{album: b.name , photos: collect(c_photos)} as b_albums 
WITH {name: a.name, albums: collect(b_albums)} as a_users 
RETURN {users: collect(a_users)} 

Редактировать

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

MATCH (a:User) 
WITH {user: str(a)} as users 
RETURN {users: collect(users)} 
+0

Это замечательно! 2 вопроса: 1) Откуда вы узнали об этом пользовательском синтаксисе json cypher - можете ли вы указать мне на документацию? 2) Есть ли способ включить все свойства узла без прямого назначения json-полей свойствам узла? –

+0

для первого ... Я столкнулся с таким синтаксисом на той же самой ссылке stackoverflow, которую вы поделили в вопросе. Второй вопрос: В настоящее время вы не можете перечислить все свойства узла для перебора. Но работать было бы, чтобы получить строковое представление узла. Check my edit .. –

+0

Для сбора всех свойств узел, который вы можете просто собрать полный узел, поэтому изменение '... {album: b.name}' to '{album: b}' должно выполнять эту работу, вы могли бы сделать то же самое для других, но лично я предпочел бы больше запрос с реквизитом, который вам нужно использовать, а не возвращать все (за вычетом данных) – bart

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