OrientDB-计算用户相似度

OrientDB-计算用户相似度,orientdb,orientdb2.2,Orientdb,Orientdb2.2,我试图解决一个简单的问题:根据为产品评级计算的欧几里德距离计算用户对用户的相似度 我正在使用这样的查询 SELECT U1.UserId, U2.UserId FROM ( MATCH {class:User, as: U1, where: (UserId=12345) } -rate-> {class:Product, as:P}, {class:User, as: U2, where: (UserId<>12345)} -rate-> {as:OP},

我试图解决一个简单的问题:根据为产品评级计算的欧几里德距离计算用户对用户的相似度

我正在使用这样的查询

SELECT U1.UserId, U2.UserId
FROM (
  MATCH 
  {class:User, as: U1, where: (UserId=12345) } -rate-> {class:Product, as:P},
  {class:User, as: U2, where: (UserId<>12345)} -rate-> {as:OP},
  RETURN U1, U2, P, OP
)
所以我会计算Sqrt((5-2)^2+(10-8)^2)作为距离

使用OrientDB上的单个查询是否可以实现这一点。Neo4J提供WITH语句来操作Cypher查询中的连续实例

非常感谢您为我们提供的一切帮助

Thx
Roberto

首先,我重写了MATCH语句,以返回两个用户和一个产品的评级距离:

MATCH 
  {class:User, as: U1, where: (UserId=12345) }.outE("rate"){as:r1}.inV(){class:Product, as:P},
  {class:User, as: U2, where: (UserId<>12345)}.outE("rate"){as:r2}.inV(){as:P},
RETURN U1, U2, (r1.rating - r2.rating) * (r1.rating - r2.rating) as squareDistance, P
这里唯一的问题是OrientDB没有内置的sqrt()函数,因此必须用javascript编写自己的sqrt()。这很容易,因为在js函数中可以使用Java类,所以函数体将是

return java.lang.Math.sqrt(x);

嗨,路易吉,非常感谢你;这是否可能在查询结束时分配一个新的边缘taht来表示计算的相似性?
SELECT U1, U2, P, sqrt(squareSum) as distance from (
  SELECT U1, U2, P, sum(squareDistance) as squareSum from (
    MATCH...
  ) GROUP BY U1, U2, P
)
return java.lang.Math.sqrt(x);