首页 > 解决方案 > 尝试获取足球数据库中的最大连续获胜次数

问题描述

所以我试图从我的足球数据库中获得最长的连胜纪录。我知道关于堆栈溢出有很多类似的问题,但大多数解决方案最终都会增加每个团队的总胜利,这不是我想要得到的。

我的目标是获得一支球队有史以来最长的连胜纪录。本质上,如果 team1 打了 10 场比赛,并且在这 10 场比赛中连续赢了 6 次,然后输了 1 次并连续赢了 3 场,那么连续获胜命令应该返回 team1 的最大连胜数为 6。

我拥有的代码显示了每个玩家的总获胜次数,这不是我想要得到的。

MATCH (T1:Team)-[m:Match]-(:Team)
with T1, m
ORDER BY m.round ASC
WITH T1,
REDUCE(initial = {wins: 0, max_wins: 0}, matches IN COLLECT(m) | 
CASE WHEN (T1 = startNode(matches) AND (matches.ft_home_score > matches.ft_away_score))
OR (T1 = endNode(matches) AND (matches.ft_away_score > matches.ft_home_score))
THEN {wins: initial.wins + 1, max_wins: CASE WHEN initial.wins + 1 > initial.max_wins THEN initial.wins + 1 ELSE initial.max_wins END}
ELSE initial
END).max_wins AS successive_wins
return T1.name AS Team, successive_wins ORDER BY successive_wins DESC

上面代码的结果是:

Team    successive_wins
"Manchester City FC"    32
"Manchester United FC"  25
"Tottenham Hotspur FC"  23
"Chelsea FC"    21
"Liverpool FC"  21
"Arsenal FC"    19
"Burnley FC"    14
"Everton FC"    13
"Newcastle United FC"   12
"Leicester City FC" 12

我认为我的 REDUCE 声明做错了,但不完全确定到底是什么:D

标签: neo4jcypher

解决方案


如果您有 APOC 程序,则可以使用集合拆分程序来提供帮助。

MATCH (T1:Team)-[m:Match]-()
with T1, m
ORDER BY m.round ASC
WITH T1, collect(NOT (T1 = startNode(m) XOR (m.ft_home_score > m.ft_away_score)) AND NOT m.ft_home_score = m.ft_away_score) as results
CALL apoc.coll.split(results, false) YIELD value
WITH T1, max(size(value)) as successive_wins
RETURN T1.name AS Team, successive_wins 
ORDER BY successive_wins DESC

关于这个的一些注释。

我正在使用 NOT ... XOR 来实现 XNOR,这只是使布尔逻辑更容易一些(两个术语都为真或两个术语都为假),尽管我们确实需要进行最后一次检查以确保我们不计算关系。

通过收集有序结果的布尔值(如果获胜则为真,否则为假)并在假时拆分,我们在每一行上获得一个连续真或连续获胜的列表,并通过获得最大尺寸的一个,我们得到最大数量的每队连续获胜。


推荐阅读