如何用Gremlin在AWS Neptune中生成符合分类的用户美食推荐?
Gremlin QL 实现用户食物推荐逻辑
需求回顾
针对用户(如User2)生成食物推荐,需满足:
- 推荐食物属于用户喜欢的菜系
- 该菜系与用户喜欢的菜系属于同一分类
节点与边模型说明
基于需求,默认存在以下节点和边关系:
User:用户节点,含userId属性(如User2)Cuisine:菜系节点,含name属性Category:分类节点,含name属性Food:食物节点,含name属性(推荐目标)- 边关系:
User→likes→Cuisine(用户关联喜欢的菜系)Cuisine→belongs_to→Category(菜系关联所属分类)Food→is_in→Cuisine(食物关联所属菜系)
Gremlin 查询语句
g.V() // 定位目标用户,可替换为具体userId参数适配多用户场景 .hasLabel('User').has('userId', 'User2') // 遍历用户喜欢的所有菜系 .out('likes').hasLabel('Cuisine') // 获取这些菜系对应的分类 .out('belongs_to').hasLabel('Category') // 反向遍历该分类下的所有菜系,确保同分类 .in('belongs_to').hasLabel('Cuisine') // 过滤出用户喜欢的菜系,确保属于用户偏好范围 .where(__.in('likes').hasLabel('User').has('userId', 'User2')) // 提取这些菜系下的所有食物 .out('is_in').hasLabel('Food') // 去重避免重复推荐 .dedup() // 返回结构化推荐结果 .project('foodName', 'cuisine', 'category') .by('name') .by(__.in('is_in').hasLabel('Cuisine').values('name')) .by(__.in('is_in').hasLabel('Cuisine').out('belongs_to').values('name'))
查询逻辑拆解
- 定位用户:先匹配目标用户节点,支持参数化替换
userId适配多用户场景。 - 关联偏好菜系:通过
likes边获取用户喜欢的所有菜系。 - 绑定分类维度:通过
belongs_to边拿到偏好菜系对应的分类。 - 双条件筛选:反向遍历同分类下的所有菜系,再过滤出用户喜欢的部分,同时满足“同分类”和“用户偏好菜系”两个核心要求。
- 输出推荐结果:提取符合条件的食物,去重后返回食物名称、所属菜系及分类信息。
内容的提问来源于stack exchange,提问作者sharpshine99
相关产品推荐
相关产品推荐

