如何基于图数据库中不同边的属性实现推荐系统计算?
计算用户对产品的偏好度
核心思路
通过关联用户-分类、产品-分类的RATING边,获取对应分类下的双方评分,代入公式完成计算:(Σ(用户分类评分 × 产品分类评分)) / (分类数量 × 最大评分)
具体Cypher查询
针对指定用户和产品的查询
MATCH (user:Person {name: 'Abigail'})-[ur:RATING]->(cat:Category), (product:Product {title: 'Product_Name'})-[pr:RATING]->(cat) WITH user, product, SUM(ur.rating * pr.rating) AS total_product, COUNT(DISTINCT cat) AS num_categories, 4 AS max_rating -- 按你的评分体系固定最大分值,也可改为MAX(ur.rating)动态获取 RETURN user.name AS username, product.title AS product_title, total_product / (num_categories * max_rating) AS preference_score
通用批量查询
如果需要计算所有用户对所有产品的偏好度,去掉节点属性过滤条件即可:
MATCH (user:Person)-[ur:RATING]->(cat:Category), (product:Product)-[pr:RATING]->(cat) WITH user, product, SUM(ur.rating * pr.rating) AS total_product, COUNT(DISTINCT cat) AS num_categories, 4 AS max_rating RETURN user.name AS username, product.title AS product_title, total_product / (num_categories * max_rating) AS preference_score
查询说明
- 关联评分关系:通过共同的
Category节点,精准匹配同一分类下用户与产品的评分边,确保数据对应性。 - 聚合关键数值:
SUM(ur.rating * pr.rating):计算所有分类下用户评分与产品评分的乘积总和COUNT(DISTINCT cat):统计参与计算的有效分类数量max_rating:根据你的评分规则设置,例子中固定为4,若评分体系可变可改用MAX(ur.rating)动态获取
- 计算最终偏好度:代入公式得到结果,数值越接近1(或对应最大评分比例),表示用户对该产品的购买意愿越强。
结果验证
针对你给出的实例,查询会返回:
username | product_title | preference_score Abigail | Product_Name | 0.3333333333333333
与手动计算的结果完全一致。
内容的提问来源于stack exchange,提问作者Matheus Farias
相关产品推荐
相关产品推荐

