Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
neo4j中带属性的协同过滤密码_Neo4j_Cypher_Graph Databases_Collaborative Filtering - Fatal编程技术网

neo4j中带属性的协同过滤密码

neo4j中带属性的协同过滤密码,neo4j,cypher,graph-databases,collaborative-filtering,Neo4j,Cypher,Graph Databases,Collaborative Filtering,我正在使用neo4j建立一个推荐系统。我有以下设置: 节点: 使用者 电影 电影属性(例如类型) 关系 MATCH (user:User) OPTIONAL MATCH (user)-[r:RATED]->(m:movie) OPTIONAL MATCH (m)-[r:RATED]->(a:Attribute) WHERE user.uid = "user4" RETURN user, collect ({ a:a.title }) (m:Movie)-[w:WEIGHT{W

我正在使用neo4j建立一个推荐系统。我有以下设置:

节点:

  • 使用者
  • 电影
  • 电影属性(例如类型)
关系

MATCH (user:User)
OPTIONAL MATCH (user)-[r:RATED]->(m:movie)
OPTIONAL MATCH (m)-[r:RATED]->(a:Attribute)
WHERE user.uid = "user4"
RETURN user, collect ({ a:a.title })
  • (m:Movie)-[w:WEIGHT{WEIGHT:10}]>(a:Attribute)
  • (u:User)-[r:rating{rating:5}]>(m:Movie)
下面是它的外观示意图:

我现在正试图找出如何应用协同过滤方案,其工作原理如下:

  • 检查
    用户
    喜欢哪些属性(暗指喜欢电影)
  • 查找类似的
    其他喜欢这些类似属性的用户
  • 用户
    推荐热门电影,该用户没有看过,但其他用户也看过类似的
  • 很明显,条件是每个属性对每部电影都有一定的权重。例如,《魔戒》中的冒险类型可以有10个,而《泰坦尼克号》中的冒险类型可以有5个

    此外,系统需要考虑每部电影的收视率。例如,如果
    其他用户
    将魔戒评为
    5
    ,则他/她的范围之王属性按
    5
    而不是
    10
    进行缩放。对隐式属性的评分也接近
    5
    用户
    应该得到推荐的这部电影,而不是其他对类似属性的评分更高的用户

    我一开始只是简单地推荐其他用户评价过的其他电影,但我不确定如何考虑评价和权重之间的关系。它也不起作用:

    MATCH (user:User)-[:RATED]->(movie1)<-[:RATED]-(ouser:User),
             (ouser)-[:RATED]->(movie2)<-[:RATED]-(oouser:User)
    WHERE user.uid = "user4"
    AND   NOT    (user)-[:RATED]->(movie2)
    RETURN oouser
    
    匹配(用户:用户)-[:额定值]->(电影1)(电影2)(电影2)
    返回oouser
    
    回答您的第一个问题:

    检查用户喜欢哪些属性(暗指喜欢电影)

    它是一个子查询结构,在其中查找用户分级的电影,然后查找电影的属性,最后返回喜欢的属性列表


    如果需要整个节点,可以将return语句修改为collect(a)as attributes,

    从数学上讲,您要查找的是两个用户之间的简化关系。也就是说,根据它们有多少共同点,它们有多相似。我说简化是因为我们没有考虑到他们不同意的电影。基本上,按照您的命令,它将是:

    1) 获取每个用户的每个属性的总权重。例如:

    MATCH (user:User{name:'user1'})
    OPTIONAL MATCH (user)-[r:RATED]->(m:Movie)->[w:WEIGHT]->(a:Attribute)
    WITH user, r.rating * w.weight AS totalWeight, a
    WITH user, a, sum(totalWeight) AS totalWeight
    
    我们需要最后一行,因为每个电影属性组合都有一行

    2) 然后,我们得到了具有相似品味的用户。这是一个性能危险区域,可能需要进行一些筛选。但是,通过强制执行,我们可以让用户在10%的错误范围内喜欢每个属性(例如)

    如前所述,棘手的部分是2),但在我们知道如何进行数学运算后,应该会更容易。哦,关于数学,为了让它正常工作,一部电影的总重量应该是1()。在任何其他情况下,电影总重量之间的差异都会导致不公平的比较

    我写这篇文章时没有进行适当的研究(纸、笔、方程、统计),也没有在样本数据集中尝试代码。我希望它能帮助你

    如果您希望在不考虑用户评级或属性权重的情况下使用此建议,则可以分别用r.rating或w.weight替换第1)行和第2)行中的数学。比率和权重关系仍将使用,因此,例如,冒险电影的狂热消费者将由冒险电影的消费者推荐电影,但不会像我们选择的那样,通过评级或属性权重进行修改


    编辑:编辑代码以修复评论中讨论的语法错误。

    Hmm,您在哪里包括权重和评级?您能否发布一些用例以澄清如何回答您的3个问题/业务逻辑?电影评级?你到底是什么意思?找到喜欢这些相似属性的相似用户:你的相似性标准是什么?如果一个用户喜欢一部具有“冒险”属性的电影,而另一个用户喜欢另一部具有相同属性的电影,那么这些用户是否相似?这些相似性取决于属性的权重?没错!因此,我们确实需要一个相似性标准,基于用户喜欢的电影的属性权重和用户对该属性的评级权重。例如,评级*属性。权重=用户的属性得分但基于此标准,如果一个“用户1”被评为2 a“电影a”,属性冒险=10(2x10=20),另一个“用户2”被评为10 a“电影b”,属性冒险=2(10x2=20),则认为这些用户非常相似。有意义吗?非常感谢;到目前为止,这是惊人的。现在,我正在与第2)行中的最后一行进行斗争。distinct似乎不起作用,实际上它表示语法不正确。未知功能“独特”这是我的错误。显然()在某些情况下,如果应用distinct没有任何区别,那么distinct就不起作用。我会尝试使用“WITH user,otherUser”,因为在一行上聚合应该是一个技巧,无论如何,我们不想在该行上按属性进行区分。如果存在重复的otherUser,则尝试“将user、distinct(otherUser)作为otherUser”,它应该可以工作。对于不确定的情况,我感到抱歉,有时我仍然在与Cypher上的这种用例作斗争!关于最后一个错误,将最后一行更改为通过totalRating DESC返回m,sum(r.rating)作为totalRating顺序。当我们修复这些最后的语法错误时,我将编辑答案。我不确定我是否理解。我想你在这里问第二个问题并给它分配赏金是没有问题的。如果你问我是否同意把我的回答作为其他人回答的起点,
    WITH user, a, totalWeight*0.9 AS minimum, totalWeight*1.10 AS maximum
    MATCH (a)<-[w:WEIGHT]-(m:Movie)<-[r:RATES]-(otherUser:User)
    WITH user, a, otherUser
    WHERE w.weight * r.rating > minimum AND w.weight * r.rating < maximum
    WITH user, otherUser
    
    MATCH (otherUser)-[r:RATES]->(m:Movie)
    WHERE NOT (user)-[:RATES]->(m)
    RETURN m, sum(r.rating) AS totalRating ORDER BY totalRating DESC