#neo4j
#neo4j
Вопрос:
Я должен сделать запрос, который вернет мне клуб или клубы, в которых играет наибольшее количество игроков, не представляющих страну, из которой находится клуб.
Мой запрос работает нормально, но я хочу отфильтровать, поэтому мой результат-ТОЛЬКО клубы такого размера.
На данный момент самый большой размер-4, и у меня есть 4 клуба, в которых есть 4 игрока, которые должны были там быть.
Единственное, что приходит мне в голову, чтобы отфильтровать это, было использование LIMIT 1
в конце, но затем я вырезал три трефы, которые также заполняют предикат.
MATCH (c: Club)lt;-[r: PLAYS_FOR]-(p: Player)-[r2: REPRESENTS]-gt;(n: NationalTeam) WHERE c.countrylt;gt;n.country WITH c,collect(p.name) as list_players,n.country as country,size(collect(p.name)) as size RETURN c,list_players,country,size ORDER BY size DESC LIMIT 1
Редактировать:
Мне удалось сделать что-то подобное, не знаю, оптимально ли это, но это работает:
MATCH (c: Club)lt;-[r: PLAYS_FOR]-(p: Player)-[r2: REPRESENTS]-gt;(n: NationalTeam) WHERE c.countrylt;gt;n.country WITH c,collect(p.name) as list_players,n.country as country,size(collect(p.name)) as size WITH c,list_players,country,size ORDER BY size DESC LIMIT 1 WITH size MATCH (c: Club)lt;-[r: PLAYS_FOR]-(p: Player)-[r2: REPRESENTS]-gt;(n: NationalTeam) WHERE c.countrylt;gt;n.country WITH size,c,collect(p.name) as list_players,n.country as country,size(collect(p.name)) as size2 WHERE size(collect(p.name)) = size RETURN c,list_players,country,size
Ответ №1:
Если вы устанавливаете процедуры APOC, существует функция агрегирования, которую вы можете использовать для получения элементов, связанных с максимальным значением, и это работает, даже если для этого значения привязано несколько элементов: apoc.agg.maxItems()
Проблема теперь в том, что все данные, относящиеся к конкретному клубу, должны быть инкапсулированы в сам элемент, поэтому вам нужно будет добавить их на карту и использовать карту в качестве элемента, а размер коллекции людей в качестве значения.
Также ваша агрегация не совсем верна. Вы собираете имена игроков, но у вас есть страна игрока как часть ключа группировки (при агрегировании все термины, не связанные с агрегацией, образуют ключ группировки), и это вряд ли вам нужно. Может быть, вместо этого вы хотели страну клуба?
Попробуйте работать с этого:
MATCH (c: Club)lt;-[r: PLAYS_FOR]-(p: Player)-[r2: REPRESENTS]-gt;(n: NationalTeam) WHERE c.countrylt;gt;n.country WITH c,collect(p) as list_players WITH apoc.agg.maxItems({club:c, players:list_players}, size(list_players)) as maxResults UNWIND maxResults.items as result WITH result.club as c, [player IN result.players | player.name] as list_players, maxResults.value as size RETURN c,list_players,size