2016-09-30 84 views
0

我有以下标签: -的Neo4j - 用户的搜索历史记录基于推荐

  • 标签
  • 类型
  • 演员
  • 主任
  • 电影
  • 用户
  • UsersSerachHistory

我的应用程序用户拥有搜索栏,他们可以在其中键入和搜索任何内容,我在一段时间内将用户搜索的内容存储为将来的推荐内容。基于用户搜索历史记录的推荐查询是什么?我是否需要创建搜索历史关系?通过一些教程建议走后,我一点能够写出下面的查询 -

MATCH (m:Movie)<-[:LIKE]-(p:Person {personId : 1}) 
OPTIONAL MATCH (t:Tag) 
WITH collect(distinct t.tagName) as c1 

OPTIONAL MATCH (g:Genre) 
WITH collect(distinct g.name) + c1 as c2 

OPTIONAL MATCH (l:Language) 
WITH collect(distinct l.languageName) + c2 as c3 
RETURN c3 

这是不是一个完整的查询,但一个粗略的想法,我不知道是不是正确的方式?任何人都可以帮助我实现它吗?非常感谢!!

回答

3
与当前模型

好吧,我想你可以做喜欢的建议:

找人喜欢相同的电影,你,还有什么其他电影做他们 一样,你还不观看

MATCH (p:Person {personId: 1})-[:LIKE]->(movie)<-[:LIKE]-(other) 
WITH distinct other, p 
MATCH (other)-[:LIKE]->(reco) 
WHERE NOT (p)-[:LIKE]->(reco) 
RETURN reco, count(*) as score 
ORDER BY score DESC 

您可以应用相同类型的查询来查找具有相同流派等的电影,然后合并结果。

这是一个很好的博客帖子有很多例子查询的建议与Cypher支架:http://www.markhneedham.com/blog/2015/03/27/neo4j-generating-real-time-recommendations-with-cypher/

对于基于搜索的建议,一个简单的解决方案是将搜索字符串分割成元素,例如:

WITH split("action movie with arnold in 1997", " ") AS elements 
MATCH (m:Movie)<-[r]-(object) 
WHERE object.value IN elements 
RETURN m, count(*) as score 

这会假设,表示电影的属性的所有节点将有一个共同的value属性,因此:Tag(value):Year(value):Title(value)

这是一种基本的,基于搜索历史共同推荐系统,您将在历史模型就像一个时间表:

(user)-[:LAST_SEARCH]->(s)-[:PREV_SEARCH]->(s).. 
(s)-[:HAS_KEYWORD]->(keyword) 

enter image description here

然后你会不断地计算搜索历史之间的相似度为背景工作。常用算法是cosine similaritylikelihood function

然后,您可以根据与当前用户历史记录和其他用户历史记录的相似性找到潜在的相似搜索和返回的电影。

最后当然,您可以结合所有的推荐逻辑和计算最终得分。

并可根据您的评论:

用户的搜索关键字也能像电影片名,演员的名字,什么 标签etc.So例如,如果它是一个标签名字,那么我想提出 那些电影具有相同的标签

这是更多的模式匹配,并不真正落在建议的主题。

+0

感谢您的回复,但我已经有了LIKE,RATING和VIEW的推荐,而且他们工作的很好,但我希望基于搜索历史的推荐与youtube回复系统非常相似。用户搜索关键字可以是电影标题,演员名称,标签等。例如,如果它是一个标签名称,那么我想要展示那些具有相同标签的电影。 –

+0

已更新我的回答 –

+0

我已根据您的指示设置搜索记录,但我是Neo4j中的新手,不知道推荐的查询是什么。你能帮忙吗? –