You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Neo4j中用循环子查询获取子集并分析用户赛事胜率变化

解决Neo4j中计算用户赛事胜率进步的问题

核心思路

不用手动编写循环逻辑,利用Neo4j的集合操作与聚合函数即可实现需求:先按用户分组收集并排序赛事,拆分前后5场后分别计算胜率,最后对比胜率差值找出进步最显著的用户。

完整Cypher查询

MATCH (p:Person)-[:PlaysIn]->(e:Event)
WITH p, e
ORDER BY p.id, e.eventTime
WITH p, collect(e) AS events
WHERE size(events) >= 10
WITH p, 
     [i IN range(0,4) | events[i]] AS first5Events,
     [i IN range(size(events)-5, size(events)-1) | events[i]] AS last5Events
WITH p, first5Events, last5Events,
     reduce(winCount = 0, event IN first5Events | winCount + CASE WHEN event.eventOutcome = 'win' THEN 1 ELSE 0 END) AS firstWins,
     size(first5Events) AS firstTotal
WITH p, firstWins, firstTotal,
     reduce(winCount = 0, event IN last5Events | winCount + CASE WHEN event.eventOutcome = 'win' THEN 1 ELSE 0 END) AS lastWins,
     size(last5Events) AS lastTotal
WITH p, 
     toFloat(firstWins)/firstTotal AS initialWinRate,
     toFloat(lastWins)/lastTotal AS latestWinRate
WITH p, latestWinRate - initialWinRate AS improvement, initialWinRate, latestWinRate
WHERE improvement > 0
ORDER BY improvement DESC
RETURN p.id AS userId, initialWinRate, latestWinRate, improvement
LIMIT 10

关键步骤解释

  1. 收集并排序赛事:匹配用户与关联赛事后,按用户ID和赛事时间排序,用collect()将每个用户的赛事整理为有序列表。
  2. 过滤有效用户:仅保留赛事数量≥10的用户,确保能取出前后5场赛事进行对比。
  3. 拆分前后赛事组:通过列表索引切片,分别提取前5场(索引0-4)和最后5场(从倒数第5个元素到最后一个元素)。
  4. 计算胜率:用reduce()函数统计每组的胜场数,转换为浮点数计算胜率,避免整数除法导致的精度丢失。
  5. 筛选进步用户:计算胜率差值,只保留胜率提升的用户,按提升幅度降序排列后返回结果。

注意事项

  • 需确保event.eventOutcome的取值符合预期(示例中用'win'表示胜利),如果是其他标识(如布尔值1/0),需调整CASE语句的判断条件。
  • 若需要包含所有用户(包括胜率下降的),可删除WHERE improvement > 0这一行。
  • 可根据需求调整LIMIT的数值,获取更多进步显著的用户。

内容的提问来源于stack exchange,提问作者user14233932

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:21:38