Пример подсчета агрегатов в онлайн-курсе: порекомендуйте 3 актеров, с которыми Киану Ривз должен работать (но не работал)

Пример в онлайн-курсе требует 3 рекомендуемых актеров, с которыми Киану Ривз должен работать, но не работает, решение в этом примере продемонстрировано как:

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->()<-[:ACTED_IN]-(c),
      (c)-[:ACTED_IN]->()<-[:ACTED_IN]-(coc)
WHERE coc <> keanu  AND NOT((keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(coc))
RETURN coc.name, count(coc)
ORDER BY count(coc) DESC
LIMIT 3;

Результаты вышеперечисленного

Tom Hanks   4
Stephen Rea 3
John Hurt   3

Тем не менее, Том Хэнкс по выборке сыграл в 12 фильмах. Кроме того, есть кинозвезды с более высоким рейтингом, такие как Мег Райан, которых нет в этом списке.

Моим решением был этот шифр

match (other:Person)-[:ACTED_IN]->(movie),
(keanu:Person {name:'Keanu Reeves'})
WHERE
NOT (keanu)-[:ACTED_IN]->(movie)
return other.name, count(movie)
order by count(movie) desc
limit 3;

Что приводит к следующему:

Tom Hanks   12
Meg Ryan    5
Jack Nicholson  4

Я что-то упускаю? Или приведенный пример решения не является точным.

Я новичок в Neo4j, так что простите меня, если я совсем не в себе.


person denisbetsi    schedule 01.02.2015    source источник


Ответы (2)


Предлагаемое решение называется коллаборативной фильтрацией, т.е. что понравилось людям, которым понравилось то, что понравилось мне. Этот подход основан на поиске себе «группы сверстников».

Вы предлагаете метрику, основанную на популярности или частоте.

Реальные рекомендации основаны на ряде аспектов в зависимости от ваших требований и вариантов использования.

См. введение в эту презентацию: http://de.slideshare.net/bachmanm/recommendations-with-neo4j-fosdem-2015

person Michael Hunger    schedule 01.02.2015

Вообще-то вы не правильно поняли задачу (и я в первый раз понял!)

Автор вопроса на самом деле задал: найдите трех актеров, которые снимались в кино С актерами, которые снимались в фильмах с Киану Ривзом и до сих пор НЕ снимались ни в одном фильме с самим Киану.

И вы решили задачу: найдите трех самых снимаемых актеров, которые еще не снимались в одном фильме с Киану Ривзом.

Конечно, стыдно автору вопроса за двусмысленную формулировку!

Кстати, хочу представить вам свое альтернативное решение, которое выглядит немного короче, чем предложено автором:

MATCH (actor:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(keanu:Person {name: "Keanu Reeves"}),
(other:Person)-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(actor)
WHERE NOT (movie)<-[:ACTED_IN]-(keanu:Person {name: "Keanu Reeves"})
RETURN other.name, COUNT(*) as Movies
ORDER BY Movies DESC
LIMIT 3;
    ╒═══════════════╤════════╕
    │"other.name"   │"Movies"│
    ╞═══════════════╪════════╡
    │"Tom Hanks"    │4       │
    ├───────────────┼────────┤
    │"Jim Broadbent"│3       │
    ├───────────────┼────────┤
    │"Halle Berry"  │3       │
    └───────────────┴────────┘
person Kamal Barshevich    schedule 08.02.2021