neo4j - Neo4j Cypher 对具有多个重复项的列表的结果进行排序和添加
问题描述
所以我有这个图形数据库,它有 20 个名为“Team”的节点中的足球队,唯一的属性是他们的名字和一个确保唯一性的约束。我还在名为“Match”的节点中再次获得了超过 350 场足球比赛,具有日期、团队 1 得分、团队 2 得分等属性。比赛节点以这样的方式链接,球队 1 是 home_team,球队 2 是 away_team,所以关系是这样的:
MERGE (m)-[:away_team]->(t1)
MERGE (m)-[:away_team]->(t2)
到目前为止,我提到的所有内容都奏效了,但是现在我正试图展示一月份获胜次数最多的球队。我设法在每场比赛中与球队一起获得回报,以及他们的结果。它看起来像这样(代码在图像下方)
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 的新手
解决方案
这样的事情可能会起作用,在 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
and: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
推荐阅读
- node.js - 运行 .getAttribute() 命令时发生错误
: TypeError: _this2.client.assertion 不是函数 - r - 如何在ggplot中从一个数据框添加多个图层?
- python - 带有 Windows Aero 主题的 QWebEngineView 的比例错误
- highcharts - HighCharts/Highstock:如何以编程方式绘制鼠标线
- reactjs - css 转换被忽略,因为反应重新渲染
- ruby-on-rails - Ruby Activerecord:在多个字段中找到相同的值
- android - 如何在库的基本应用程序类中注入成员?
- office365 - 访问被拒绝 - Sharepoint URL 作为 O365 中的自定义磁贴
- linux - 无法使用命令 /usr/bin/xdpyinfo 执行自动检查显示颜色。检查是否设置了 DISPLAY 变量。失败<<<<
- google-apps-script - Google 表格的 SUMIFS 和 SUMIF 不适用于 DATE