2014-02-20 57 views
6

試想一個相冊模式W /用戶,專輯和照片: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 Web控制檯不支持的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密碼語法 - 你能指出我的文檔嗎? 2)有沒有一種方法可以包含節點的所有屬性,而不必明確地將json字段分配給節點屬性? –

+0

爲第一個...我遇到了這樣的語法在你在問題中共享相同的stackoverflow鏈接。 第二個問題:目前沒有辦法可以列出節點的所有屬性來迭代..但解決方法是獲取節點的字符串表示形式。 檢查我的編輯.. –

+0

要收集所有屬性你可以收集完整節點的節點,所以將'... {album:b.name}'改爲'{album:b}'應該可以完成這項工作,對其他人也可以這樣做,但是我個人更喜歡使用道具查詢您需要使用而不是返回所有內容(少返回數據) – bart