我正试图在我的电影图中使用余弦相似性黑白用户来获取电影推荐。
密码查询是:
public static void main(String[] args){
MyClass myObject = new MyClass();
...
int[] temp = myObject.getvariable();
// use of temp
...
}
它抛出错误:
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)
我认为neo4j将评级设置为字符串而不是int,所以我运行了这个查询 -
Don't know how to Multiply(x.rating,y.rating) `4` with `4`
但即使在此次更新后,我也会遇到与之前相同的错误。
我知道我可以为每个变量添加 toInt 修饰符,但是如何在没有它的情况下将我的关系中的rating字段相乘,或者换句话说如何将等级设置为Integer?< / p>
答案 0 :(得分:3)
上述评论几乎都在正确的轨道上。最好是添加条件以跳过已经转换的关系:
match (:User)-[r:HAS_RATED]->(:Movie)
where r.rating = toString(r.rating) // make sure we only work string ratings
with r limit 100000
set r.rating = toInt(r.rating)
return count(r)
您运行该语句,直到返回的值为0 - 这意味着没有其他关系要处理。
答案 1 :(得分:0)
正确的查询格式如下。 对@Stefan Armbruster 代码的小修改
match (:User)-[r:HAS_RATED]->(:Movie)
where r.rating = toString(r.rating) // make sure we only work string ratings
with r limit 100000
set r.rating = toInteger(r.rating)
return count(r)