【发布时间】:2021-05-16 23:06:05
【问题描述】:
我正在尝试在我的电影图中使用余弦相似度黑白用户来获得电影推荐。
密码查询是:
MATCH (p1:User)-[x:HAS_RATED]->(m:Movie)<-[y:HAS_RATED]-(p2:User)
WITH SUM(x.rating * y.rating) AS xyDotProduct,
SQRT(REDUCE(xDot = 0.0, a IN COLLECT(x.rating) | xDot + a^2)) AS xLength,
SQRT(REDUCE(yDot = 0.0, b IN COLLECT(y.rating) | yDot + b^2)) AS yLength,
p1, p2
MERGE (p1)-[s:SIMILARITY]-(p2)
SET s.similarity = xyDotProduct / (xLength * yLength)
它抛出错误:
Don't know how to Multiply(x.rating,y.rating) `4` with `4`
我认为 neo4j 将评级设置为 string 而不是 int,所以我运行了这个查询 -
match (:User)-[r:HAS_RATED]->(:Movie)
with r limit 100000
set r.rating = toInt(r.rating) return r
但即使在此更新之后,我也遇到与以前相同的错误。
我知道我可以为每个变量添加 toInt 修饰符,但是如何在没有它的情况下将我的关系中的评级字段相乘,或者换句话说,如何将评级设置为整数?
【问题讨论】:
-
我认为你的策略是正确的。降低查询的复杂性我已经能够复制问题并确实通过
SET r.rating = toInt(r.rating)修复它。您确定您的所有评级属性都已重置为整数吗?你的数据库中有多少关系?您的密码使用LIMIT 100000- 您是否可能没有捕捉到某些关系,因此仍然有字符串? -
我有 100 万条关系。我认为限制是针对单个请求执行的,因此数据库不会耗尽堆内存,而是最终会在整个图上运行?
-
没有。它将限制结果,因此仅在您匹配的 100000 上运行。您需要使用
SKIP 100000 LIMIT 100000重新执行查询,直到您匹配并因此重置所有评级属性。 -
可以打包在一个查询中吗? (事先不知道我总共有多少关系)
-
我必须承认我不确定...我不知道循环运行查询的方法。如果你没有返回
r,它会节省一些内存。