2017-02-19 59 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

基本上,我希望最新的帖子首先包含每篇帖子的最新评论。看起来你编辑的文章工作正常。谢谢! –

相关问题