Neo4j Cypher Query для получения фида пользователей

Предположим, что мой проект — это Facebook. Я хочу отобразить канал, который состоит из обновлений моего статуса и обновлений статуса моих друзей.

Вот отношения;

  • пользователь ЗНАЕТ пользователя
  • статус пользователя UPDATES_STATUS

Вот как я получаю обновления статуса моих друзей;

START me = node(1) MATCH me-[:KNOWS]-()-[:UPDATES_STATUS]->friendsStatusUpdates RETURN friendsStatusUpdates

И вот как я получаю свои собственные обновления статуса;

START me = node(1) MATCH me-[:UPDATES_STATUS]->myStatusUpdates RETURN myStatusUpdates

Оба запроса работают нормально, но мне нужен один запрос, который объединяет эти два.


person Sarpdoruk Tahmaz    schedule 22.01.2013    source источник


Ответы (3)


Вот ответ, который я получил из групп Google;

START me = node(1) MATCH me-[:KNOWS*0..1]-()-[:UPDATES_STATUS]->statusUpdate RETURN DISTINCT statusUpdate

Единственное, что мне нужно было сделать, это добавить индикатор глубины *0..1 к отношению, чтобы получить результаты глубины как 0, так и 1 уровня.

Редактировать: мне пришлось добавить DISTINCT, потому что без него запрос включает узлы 0 уровня 2 раза, что приводит к дублированию.


Альтернативный запрос, который возвращает те же результаты, используя оператор WITH;

START me = node(1) 
MATCH me-[:KNOWS*0..1]-friend
WITH DISTINCT friend
MATCH friend-[:UPDATES_STATUS]->statusUpdate 
RETURN DISTINCT statusUpdate
person Sarpdoruk Tahmaz    schedule 22.01.2013
comment
Ваши запросы возвращают сообщения только от друга пользователя, как в этом случае он дает сообщения самого пользователя (меня) ??????? - person Ravinder Payal; 15.10.2015

Создайте отношение между пользовательским узлом и самим собой, чем запрос: START me = node(1) MATCH me-[:KNOWS|HIMSELF]-()-[:UPDATES_STATUS]->friendsStatusUpdates RETURN friendsStatusUpdates

person Bahadır Özavcı    schedule 22.01.2013
comment
я не уверен, является ли создание мультиграфа хорошим стандартным решением в neo4j. - person ulkas; 22.01.2013

http://docs.neo4j.org/chunked/milestone/introduction-pattern.html

START me = node(1) 
MATCH me-[:UPDATES_STATUS*1..2|KNOWS]-myStatusUpdates 
RETURN myStatusUpdates

в случае, если *1..2 не будет работать с командой |, сделайте следующее:

START me = node(1) 
MATCH friendsStatusUpdates2-[?:UPDATES_STATUS]-me-[:KNOWS]-()-[:UPDATES_STATUS]->friendsStatusUpdates 
RETURN distinct myStatusUpdates,friendsStatusUpdates2

просто отредактируйте оператор RETURN с некоторой функцией агрегирования, чтобы вы получали один статус на строку

person ulkas    schedule 22.01.2013