【问题标题】:Changing property type from string to integer in neo4j在 Neo4j 中将属性类型从字符串更改为整数
【发布时间】: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,它会节省一些内存。

标签: windows neo4j cypher


【解决方案1】:

上面的 cmets 几乎是在正确的轨道上。最好是添加一个条件来跳过那些已经转换的关系:

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 - 这意味着没有进一步的关系需要处理。

【讨论】:

  • 请致电where r.rating = toString(r.rating)。 +1。我想你可能不打算有两个 return 声明!
【解决方案2】:

查询的正确格式如下。 对@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)

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 2015-08-02
    • 1970-01-01
    • 2015-12-11
    • 2023-03-20
    • 2023-03-16
    • 1970-01-01
    • 2018-03-21
    • 2020-11-10
    相关资源
    最近更新 更多