【问题标题】:Neo4j Cypher Sorting and adding results of a list with multiple duplicatesNeo4j Cypher 对具有多个重复项的列表的结果进行排序和添加
【发布时间】:2018-11-19 16:02:33
【问题描述】:

所以我有这个图形数据库,它有 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

到达这一点后,我陷入了困境。我不完全确定从这里去哪里。问题是因为一支球队将在一月份进行多场比赛,他们可以是主场也可以是客场,所以他们的结果分布在两列之间,我不完全确定如何提取它并将球队结果与球队名称相关联,然后显示赢得比赛的最高分。任何帮助是极大的赞赏!

附:我是 Cypher/Neo4j 的新手

【问题讨论】:

    标签: neo4j cypher


    【解决方案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
    

    【讨论】:

    • 非常感谢您的帮助!这让我朝着正确的方向前进!
    猜你喜欢
    • 2022-01-04
    • 2021-07-14
    • 2012-03-21
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2018-06-03
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多