首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OrientDB -计算用户相似度

OrientDB -计算用户相似度
EN

Stack Overflow用户
提问于 2017-02-01 04:21:53
回答 1查看 76关注 0票数 0

我正在尝试解决一个简单的问题:基于为产品评级计算的欧几里德距离来计算用户到用户的相似度。

我正在使用这样的查询

代码语言:javascript
运行
复制
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
)

现在,我将为每一对(用户U1,用户U2)计算一个结果,该结果表示常见产品的评分之间的距离。

面向用户的常用产品示例

代码语言:javascript
运行
复制
U1,Product,Rating
1, xxx, 5 
2, xxx, 2
1, yyy, 10 
2, yyy, 8

因此,我将Sqrt((5-2)^2 + (10-8)^2)计算为距离

在OrientDB上执行一次查询就可以做到这一点吗?Neo4J提供了WITH语句来操作Cypher查询中的连续实例。

非常感谢您能为我们提供的所有帮助。

Thx Roberto

EN

回答 1

Stack Overflow用户

发布于 2017-02-01 17:29:11

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

代码语言:javascript
运行
复制
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

然后,您可以使用一些外部选择来进行计算:

代码语言:javascript
运行
复制
SELECT U1, U2, P, sqrt(squareSum) as distance from (
  SELECT U1, U2, P, sum(squareDistance) as squareSum from (
    MATCH...
  ) GROUP BY U1, U2, P
)

这里唯一的问题是OrientDB没有内置的sqrt()函数,所以您必须用javascript编写自己的sqrt()。这非常简单,因为在js函数中可以使用Java类,所以函数体只是

代码语言:javascript
运行
复制
return java.lang.Math.sqrt(x);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41966792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档