在neo4j中将属性类型从字符串更改为整数

时间:2015-11-04 14:14:53

标签: windows neo4j cypher

我正试图在我的电影图中使用余弦相似性黑白用户来获取电影推荐。

密码查询是:

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>

2 个答案:

答案 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)