Я пытаюсь реализовать алгоритм рекомендаций использование Neo4j, который похож на осуществление на этой page.Удвоение результатов рекомендаций в Neo4j
Прямо сейчас у меня есть простой социальный пример, в котором Пользователь может:
- следовать другой пользователь
- игра игра
- жить в стране
Идея состоит в том, чтобы сделать алгоритм предложения друзей, основанный на том, дружат ли друзья друзей, играют в одну и ту же игру, живут в одной стране и/или следуют за пользователем.
За исключением последнего, было бы довольно легко реализовать, используя пример страницы выше, как это:
MATCH (origin)-[r1:FOLLOWS|PLAYS|LIVES_IN]-(c)-[r2:FOLLOWS|PLAYS|LIVES_IN]-(candidate)
WHERE type(r1)=type(r2) AND NOT (source)-[:FOLLOWS]->(candidate)
RETURN candidate, SUM(ROUND(r2.weight) AS boost
ORDER BY boost DESC LIMIT 10
Однако единственно возможный способ сделать все это сразу бы сделать соединение с другим запросом и обработать результат. Что-то вдоль этих линий:
THE_QUERY_ABOVE
UNION
MATCH (origin)<-[r:FOLLOWS]-(candidate)
RETURN candidate, r.weight as boost
WITH candidate, boost
RETURN DISTINCT candidate, SUM(boost)
ORDER BY boost DESC LIMIT 10
Но, насколько я знаю, после обработки UNION
результат не представляется возможным с Cypher еще ...
Поэтому мой вопрос: это возможно достичь в одном запросе? и как?
И если это так, есть ли возможное решение, в котором мне не нужно указывать вес в отношениях, чтобы избежать необходимости менять все отношения, когда я хочу изменить приоритеты?
Cheers!
Hi @cybersam. Спасибо за быстрый ответ. Однако решение, которое вы предоставили, не совсем то, что я ищу. Это только найдет кандидатов, которые последуют за происхождением, и все остальное ...То, что я ищу, является OR, что означает, что я хочу, чтобы любой пользователь, который мог следить за происхождением, чтобы повысить его оценку рекомендации. – mrstif
См. Мой обновленный ответ. – cybersam
Почти там @cybersam ... Но я также хочу вернуть пользователям, что ** только ** следует за происхождением и ничего больше ... То, как вы это делали, возвращает только тех пользователей, если они сопоставляются как кандидаты в первом ' необязательный матч' ... Я попытался изменить второй «кандидат» на «кандидат2», но он возвращает некоторые странные результаты ... Я могу поделиться с вами консолью, если вы предпочитаете ... – mrstif