Neo4j Cypher Сортировка и добавление результатов списка с несколькими дубликатами - PullRequest
0 голосов
/ 19 ноября 2018

Итак, у меня есть эта графовая база данных, в которой есть 20 футбольных команд в узлах под названием «Команда», единственным атрибутом которых является их имя и ограничение, обеспечивающее уникальность.Я также получил более 350 футбольных матчей снова в узлах под названием «Match», с такими атрибутами, как дата, счет команды 1, счет команды 2.Узлы совпадений связаны таким образом, что команда 1 является командой home_team, а команда 2 - командой away_team, поэтому отношения выглядят так:

MERGE (m)-[:away_team]->(t1)
MERGE (m)-[:away_team]->(t2)

Пока все, что я упомянул, сработало, однако сейчасЯ пытаюсь показать команду с наибольшим количеством побед в январе.Мне удалось получить отдачу с командами в каждом матче и их результатом.Выглядит это так (код под изображением)

enter image description here

MATCH (m:Match)-[:home_team]->(home_team:Team), (m:Match)-[:away_team]->(away_team:Team)
WHERE m.date CONTAINS 'Jan'
WITH m as matches, [home_team, away_team] as teams
return teams, collect (matches.home_score) AS home_result, collect (matches.away_score) AS away_result

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

PS Я новичок в Cypher / Neo4j

1 Ответ

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

Примерно так может сработать, используя оба типа отношений в MATCH (он будет соответствовать обоим типам), затем используя некоторую логическую логику для фильтрации неинтересных результатов и получения верхней команды по количеству:

MATCH (t:Team)<-[r:home_team|away_team]-(m:Match)
WHERE m.date CONTAINS 'Jan'
WITH t, type(r) = 'home_team' as isHome, m.home_score > m.away_score as homeWin
WHERE (isHome AND homeWin) OR (NOT isHome AND NOT homeWin)
RETURN t, count(*) as matchesWon
ORDER BY matchesWon DESC
LIMIT 1

Это могло бы быть немного проще, если бы вы реорганизовали свой график для добавления won в качестве логического свойства отношений :home_team и :away_team (возможно, также tie, но это выходит за рамки этого запроса ).

Если бы такое свойство существовало (и было либо обновлено с помощью импорта данных, либо когда обновлялись оценки), тогда ваш запрос стал бы проще:

MATCH (t:Team)<-[:home_team|away_team {won:true}]-(m:Match)
WHERE m.date CONTAINS 'Jan'
RETURN t, count(*) as matchesWon
ORDER BY matchesWon DESC
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...