Gremlin查询:获取指定用户每位好友的最高评分review边
问题原因
你原来的查询是先取出所有好友的全部review边之后做全局排序,没有按好友维度做分组筛选,所以会返回每个好友的所有review。
解决方案
你需要对每一位好友节点单独处理其review边,按value降序排序后仅取第一条即可,需要用到Gremlin的匿名遍历__.来做局部处理,调整后的代码如下:
首先确认你已经引入了Gremlin的匿名遍历对象:
import * as __ from 'gremlin/lib/process/traversal'; // 替换为你项目实际对应的gremlin包引入路径
修改后的查询逻辑:
async function init() { const query = g .V(6) // 直接传入用户ID定位,等价于原写法V().hasId(6) .out("friend") // 直接out("friend")等价于outE("friend").inV(),写法更简洁 .hasLabel("user") .map( // 对每个好友节点单独处理其评论 __.outE("review") .order() .by("value", "desc") // 按评分降序排列 .limit(1) // 仅取最高评分的第一条 ); const dataRaw = await query.toList(); await dc.close(); const data = JSON.stringify(normalizeData(dataRaw as any), null, 1); console.log(data); }
补充说明
- 如果有好友没有发布过任何review,上面的查询会自动过滤掉该好友,如果你需要保留无review的好友,可以把
limit(1)替换为fold().coalesce(__.unfold(), __.constant(null)) - 如果你同时需要返回好友的基础信息和对应的最高评分review,可以把
map替换为project,示例:
.project("friendInfo", "topReview") .by(__.valueMap(true)) .by(__.outE("review").order().by("value", "desc").limit(1).valueMap(true).fold())
内容的提问来源于stack exchange,提问作者plutolaser
相关产品推荐
相关产品推荐

