Neo4j Cypher排序并添加具有多个重复项的列表的结果

时间:2018-11-19 16:02:33

标签: neo4j cypher

因此,我得到了这个图形数据库,该数据库中有20个足球队,位于称为“ Team”的节点中,唯一的属性是其名称和确保唯一性的约束。 Ive在称为“比赛”的节点上又获得了350多次足球比赛,其属性包括日期,球队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

到达这一点后,我被卡住了。我不能完全确定从这里出发。问题是,由于一支球队将在一月份参加多场比赛,因此他们既可以在家也可以不在场,因此他们的结果分布在两列之间。我不确定要如何提取并将其结果与球队名称相关联,然后显示获胜比赛的最高分。任何帮助是极大的赞赏!

P.S。我是Cypher / Neo4j的新手

1 个答案:

答案 0 :(得分:1)

使用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