Пример подсчета агрегатов в онлайн-курсе: порекомендуйте 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 │
└───────────────┴────────┘