экспоненциальная стоимость производительности агрегированной функции - PullRequest
0 голосов
/ 13 июля 2020

У меня есть этот запрос

MATCH
(user:Users)-[watched:WATCH]->(movie1:MOVIES)<-[watches_too:WATCH]-(user2:Users)-[watches_other:WATCH]->(movie2:MOVIES)
where
 movie1.genre = "action" and
 movie1.title <> movie2.title and
 movie1.subgenre = movie2.subgenre and
 watched.date >= date({year: 2020, month: 06, day: 01}) and
 watches_too.date >= date({year: 2020, month: 06, day: 01})
RETURN
 user.id, movie2.title
LIMIT 100;

Этот запрос работает, но он просто возвращает заголовок фильма2 почти без значения, поэтому я попробовал другой подход

MATCH
(user:Users)-[watched:WATCH]->(movie1:MOVIES)<-[watches_too:WATCH]-(user2:Users)-[watches_other:WATCH]->(movie2:MOVIES)
where
 movie1.genre = "action" and
 movie1.title <> movie2.title and
 movie1.subgenre = movie2.subgenre and
 watched.date >= date({year: 2020, month: 06, day: 01}) and
 watches_too.date >= date({year: 2020, month: 06, day: 01})
RETURN
 user.id, movie2.title, count(movie2) as ocurrence
 ORDER BY user.id, ocurrence DESC
LIMIT 100;

Таким способом я попробовал чтобы получить наиболее просматриваемый mov ie другими пользователями, которые также смотрели тот же mov ie, но хотя первый запрос возвращает мне результаты в секундах, второй запрос занял почти 2 часа, чтобы завершить sh

Неправильно ли я выполняю агрегирование?

Кроме того, при этом результаты были такими, как 50 результатов для 1 пользователя и 50 для другого, если бы я хотел ограничить его до 2-3 фильмов на пользователя?

Спасибо за помощь

1 Ответ

0 голосов
/ 16 июля 2020

Я тоже не очень хорошо разбираюсь в neo4j, но я попробую. Не совсем уверен, почему результаты такие большие, но может быть из-за того, что второй имеет ORDER BY

Вот что я придумал

MATCH
    (user:Users)-[watched:WATCH]->(movie1:MOVIES)
    WHERE
        movie1.genre = "action" and
        watched.date >= date({year: 2020, month: 06, day: 01})
MATCH
    (user)-[watches_other:WATCH]->(movie2:MOVIES)
    WHERE
        movie1 <> movie2 and
        movie1.subgenre = movie2.subgenre and
        watches_too.date >= date({year: 2020, month: 06, day: 01})
WITH
    user.id AS id,
    COLLECT(movie2.title) as titles
RETURN
    id, titles
LIMIT 100;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...