Агрегирование нескольких совпадений перед упорядочением результатов - PullRequest
0 голосов
/ 25 августа 2018

У меня есть узел Activity (a), который ссылается на (:Something), которому может соответствовать прямое отношение :LIKE к :User 'me' ИЛИ отношение :LIKE к :FRIEND.

Первое отношение может быть описано как:

MATCH (a)-[:REF]->(:Something)<-[:LIKE]-(:User {user: 'me'})

В то время как второе отношение может быть описано как:

MATCH (a)-[:REF]->(:Something)<-[:LIKE]-(:User)<-[:FRIEND]-(:User {user: 'me'})

Как бы я сгруппировал всеразличные узлы активности (a), чтобы я мог отсортировать полный список по временным меткам?Это будет выглядеть примерно так:

MATCH
  (a)-[:REF]->(:Something)<-[:LIKE]-(:User {user: 'me'})
OR
  (a)-[:REF]->(:Something)<-[:LIKE]-(:User)<-[:FRIEND]-(:User {user: 'me'})
RETURN a
ORDER BY a.ts DESC

1 Ответ

0 голосов
/ 25 августа 2018

В вашем случае вы можете использовать шаблон переменной длины, соответствующий :

// u = node "me" or the node "friend"
MATCH
  (:User {user: 'me'})-[:FRIEND*0..1]->(u:User)
MATCH
  (a)-[:REF]->(:Something)<-[:LIKE]-(u)
RETURN DISTINCT a 
ORDER BY a.ts DESC

Обновление : если запросы совершенно разные, то вы можетесобрать результат первого запроса, затем результат второго запроса, суммировать и раскручивать:

MATCH 
  (a1)-[:REF]->(:Something)<-[:OWN]-(:User {user: 'me'})
WITH
  collect(DISTINCT a1) AS ac1
MATCH 
  (a2)-[:REF]->(:Something)<-[:INCLUDES]-(:SomethingElse)<-[:LIKE]-(:User {user: 'me'})
WITH
  ac1, collect(DISTINCT a2) AS ac2 
UNWIND 
  ac1 + ac2 AS a
RETURN DISTINCT a
ORDER BY a.ts DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...