2017-02-19 72 views
1

我有以下查詢:檢查用戶是否喜歡這個崗位

MATCH (user:User)-[:CREATED]->(post:Post) 
WITH user, post 
ORDER BY post.createdAt DESC 
OPTIONAL MATCH (post)<-[:BELONGS_TO]-(comment:Comment)<-[:COMMENTED]-(:User) 
WITH user, post, liked, comment 
ORDER BY comment.timestamp DESC 
WITH user, post, liked, COLLECT(comment)[0..4] AS comments 
RETURN post, 
     { username: user.username, 
      firstName: user.firstName, 
      lastName: user.lastName, 
      profilePicture: user.profilePicture 
     } AS createdBy, 
     size((post)<-[:LIKES]-(:User)) AS likes, 
     liked, 
     comments 
SKIP {skip} 
LIMIT {limit} 

的查詢獲取職位列表,並計算出其他的東西,如: GET發表評論,得到是誰創造的帖子的用戶,得到的總數喜歡。

我還需要計算,如果我喜歡這個帖子或不是,這將導致:userLiked(true | false)。

我想的是一樣的東西:

OPTIONAL MATCH (post)<-[userLiked:LIKES]-(:User {uuid: {userUUID}}) 

回答

1

如果你只需要一個真/假,那麼EXISTS()是一個更好的選擇。

您還可以通過將SKIP和LIMIT從查詢末尾移動到ORDER BY後創建帖子來提高性能。

如果您使用的是Neo4j 3.1.x或更高版本,則可以使用地圖投影來更輕鬆地將createdBy地圖上所需的字段返回。

這裏是所有這些事情包括您的查詢:

MATCH (user:User)-[:CREATED]->(post:Post) 
WITH user, post 
ORDER BY post.createdAt DESC 
OPTIONAL MATCH (post)<-[:BELONGS_TO]-(comment:Comment)<-[:COMMENTED]-(:User) 
WITH user, post, comment 
ORDER BY comment.timestamp DESC 
WITH user, post, COLLECT(comment)[..4] AS comments 
SKIP {skip} LIMIT {limit} 
RETURN post, 
     user { .username, .firstName, .lastName, .profilePicture } AS createdBy, 
     size((post)<-[:LIKES]-(:User)) AS likes, 
     exists((post)<-[:LIKES]-(:User{uuid: {userUUID}})) AS userLiked, 
     comments 
+0

對於這個SKIP和LIMIT - 如果我想分頁結果不起作用。 –

+1

啊,如果你想先按評論時間戳排序,這是有道理的。我將SKIP和LIMIT移到了返回之前,這應該仍然可以避免對您計劃返回的頁面中未包含的結果進行不必要的操作。 – InverseFalcon

+0

基本上,我希望最新的帖子首先包含每篇帖子的最新評論。看起來你編輯的文章工作正常。謝謝! –

相關問題