如何在Gremlin查询中按条件对groupCount()结果加权相乘
社交网络图中Profile排序的Gremlin查询实现
需求说明
社交网络图包含profile和post节点,profile节点支持4种边操作:关注其他profile(边类型follows_profile)、观看post、点赞post、发布post。需要给指定的target_profile对一组profile列表做排序:
- 统计每个
profile与target_profile的相似活动次数(即target执行过的操作,该profile也执行过的次数) - 若
target_profile关注了该profile,则将其活动次数乘以3加权 - 最终按加权后的结果降序排列
已实现的基础查询
- 获取
target_profile关注的指定列表内的profile:
g.V(TARGET_PROFILE).out('follows_profile').hasId(PROFILES_LIST)
- 统计每个指定profile的相似活动次数:
g.V(TARGET_PROFILE).out().in().hasId(PROFILES_LIST).groupCount().by(T.id)
整合加权逻辑的完整查询
g.V(TARGET_PROFILE).as('source') // 先收集目标关注的指定profile的ID列表 .out('follows_profile').hasId(PROFILES_LIST).id().fold().as('followedIds') // 统计相似活动次数 .select('source').out().in().hasId(PROFILES_LIST) .groupCount().by(T.id).as('activityCounts') // 合并数据并计算加权值 .select('followedIds', 'activityCounts') .unfold().select('activityCounts').unfold() .map( project('id', 'weightedCount').by(keys).by( choose(contains('followedIds', keys), values().multiply(3), values()) ) ) // 按加权次数降序排序 .order().by('weightedCount', desc)
逻辑说明
- 第一步先把
target_profile关注的、在指定列表内的profile ID收集到followedIds列表中 - 第二步统计每个指定profile与target的相似活动次数,得到键值对形式的
activityCounts - 遍历
activityCounts的每一项,判断当前profile ID是否在followedIds里:- 如果是,就把活动次数乘以3作为加权值
- 如果不是,直接用原活动次数
- 最后按加权后的次数从高到低排序
内容的提问来源于stack exchange,提问作者jvmunhoz
相关产品推荐
相关产品推荐

