Попытка получить максимальное количество последовательных побед в футбольной базе - PullRequest
0 голосов
/ 25 ноября 2018

Так что я пытаюсь получить самую длинную серию побед из моей футбольной базы данных.Я знаю, что есть много похожих вопросов о переполнении стека, но большинство решений просто заканчиваются добавлением общего выигрыша для каждой команды, а это не то, что я пытаюсь получить.

Моя цель - получить самую длинную серию побед, какую когда-либо имела команда.В сущности, если команда 1 сыграла 10 игр и в течение этих 10 игр выиграла 6 раз подряд, а затем проиграла 1 и выиграла 3 подряд, команда последовательных побед должна вернуть, что команда1 имеет максимальную серию побед 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

1 Ответ

0 голосов
/ 26 ноября 2018

Если у вас есть процедуры 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

Некоторые примечания по этому вопросу.

Я использую НЕ ... XORреализовать XNOR, который немного упрощает булеву логику (оба условия истинны или оба являются ложными), хотя нам нужно добавить одну последнюю проверку, чтобы убедиться, что мы не считаем связи.

Собирая логические значения для упорядоченных результатов (true, если победа, false в противном случае) и разделяя на false, мы получаем в каждом ряду список последовательных истин или последовательных побед, и, получая тот, который имеет наибольший размер, мы получаем максимальное числопоследовательных побед в команде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...