首页 > 解决方案 > 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 的新手

标签: neo4jcypher

解决方案


这样的事情可能会起作用,在 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_teamand: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

推荐阅读