Пример подсчета агрегатов в онлайн-курсе: порекомендуйте 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, так что прости меня, если я полностью оторвался от своего рокера.

2 ответа

Решение

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

То, что вы предлагаете, - это показатель, основанный на популярности или частоте.

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

Смотрите эту презентацию для ознакомления: http://de.slideshare.net/bachmanm/recommendations-with-neo4j-fosdem-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       │
    └───────────────┴────────┘
Другие вопросы по тегам