2017-02-19 9 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} 

Запрос получает список сообщений и вычисляет другие вещи, как: ПОЛУЧИТЬ оставлять комментарии, получить пользователь, который создал этот пост, получить общее количество нравится.

Мне также нужно рассчитать, понравилось ли мне сообщение или нет, что приведет к: userLiked (true | false).

Я думал что-то вроде:

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

ответ

1

Если вам просто нужно истина/ложь, то EXISTS() является лучшим вариантом.

Вы также можете улучшить производительность, перемещая SKIP и LIMIT с конца вашего запроса до вашего ORDER BY для создания сообщения.

Если вы используете Neo4j 3.1.x или выше, вы можете использовать проекцию карты, чтобы было легче вернуть поля, которые вам нужны, на созданную карту.

Вот ваш запрос со всеми этими вещами, включенными:

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

В основном я хочу, чтобы самые новые сообщения сначала содержат самые свежие комментарии для каждого сообщения. Похоже, ваш отредактированный пост отлично работает. Спасибо! –