Рекомендация вещей, которые можно сделать с Neo4j

Я разрабатываю простую социальную сеть с Java и Neo4j.

Пользователи могут отправлять вещи, которые они уже сделали, и помечать их некоторыми тегами. Также пользователи могут добавлять некоторые интересы (которые тоже являются тегами). Система должна рекомендовать пользователю то, что он еще не сделал. Я читал несколько статей о совместной фильтрации, где вычисляется сходство между пользователями. После того, как похожие пользователи будут найдены, некоторые из действий, которые они сделали, но еще не сделали зарегистрированный пользователь, будут идеально соответствовать рекомендациям.

Вот модель данных:

(me)-[:HAS_DONE]->(thing)-[:IS_TAGGED_WITH]->(tag)<-[:IS_TAGGED_WITH]-(theirThing)<-[:HAS_DONE]-(people)

(me)-[:HAS_DONE]->(thing)-[:IS_TAGGED_WITH]->(tag)<-[:IS_INTERESTED_IN]-(people)

(me)-[:IS_INTERESTED_IN]->(tag)<-[:IS_TAGGED_WITH]-(theirThing)<-[:HAS_DONE]-(people)

(me)-[:IS_INTERESTED_IN]->(tag)<-[:IS_INTERESTED_IN]-(people)

Совместная фильтрация обычно работает с некоторыми оценками.

Для случая с тегами сделаем следующие обозначения:

U={u_1, u_2,..., u_n} - users

I={i_1, i_2,..., i_m} - interests

T={t_1, t_2,..., t_k} - things

UIsim(u_i, u_j) - сходство интересов двух пользователей. Он рассчитывается путем деления количества общих интересов на максимальное количество интересов, добавленных одним пользователем.

UTsim(u_i, u_j) - сходство вещей двух пользователей. Он рассчитывается путем деления количества общих тегов для вещей на максимальное количество тегов, добавленных одним пользователем.

Окончательное сходство между двумя пользователями будет равно w1*UIsim(u_i, u_j)+w2*UTsim(u_i, u_j), где w1+w2=1.

Можно ли реализовать эту формулу с Cypher? Я имею в виду, есть ли функция max? И будет ли UNION подходящим для группировки четырех случаев?


person brain_damage    schedule 31.01.2015    source источник


Ответы (1)


Да, в Cypher есть функция max, см. здесь: http://neo4j.com/docs/stable/query-aggregation.html#aggregation-max

Однако в зависимости от размера вашего графика использование java API может быть более эффективным.

UNION можно использовать для возврата всех результатов.

Существует также плагин neo4j reco, который предоставляет расширенные возможности для фильтрации и процесса рекомендаций:

https://github.com/graphaware/neo4j-reco

Слайды можно найти здесь: http://www.slideshare.net/bachmanm/recommendations-with-neo4j-fosdem-2015

И есть вебинар об этом плагине в четверг: http://info.neo4j.com/0205-register.html?_ga=1.197373423.1723877819.1422809612

person Christophe Willemsen    schedule 01.02.2015