【问题标题】:Cypher query with group by inside aggregation使用 group by 内部聚合进行 Cypher 查询
【发布时间】:2020-10-14 01:10:30
【问题描述】:

我创建了一个密码查询,它返回国家/地区的人员列表和一些平均计算:

Match (people:People)-[:LOCATED_IN]->(address:Address), (people)-[:SOME]->(calc)
RETURN address.country as name, count(*) as count, avg(calc.value) as value

例如返回:

name, count, value
PL  , 5    , 10
UK  , 3    , 20
US  , 6    , 30
DE  , 3    , 40

我现在想要实现的是将其中一些分组到一些自定义组中。 例如,如果国家/地区是 PL 和 UK,则按自定义返回:

name   , count, value
Custom , 8    , 15
US     , 6    , 30
DE     , 3    , 40

我能够通过创建两个单独的查询来实现它,其中一个是我指定的: WHERE address.country IN ['PL','UK'] 和第二个否定,然后我将它结合起来。 有没有更简单的解决方案?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以使用CASE 语句解决此问题:

    Match (people:People)-[:LOCATED_IN]->(address:Address), (people)-[:SOME]->(calc)
    RETURN CASE WHEN address.country in ['PL','UK'] THEN 'Custom' ELSE address.country END as name, 
      count(*) as count, avg(calc.value) as value
    

    【讨论】:

    • 谢谢,这看起来像是一个很棒的游戏改变了。我会在一小时内进行测试,如果一切正常,我会接受答案。 :)
    【解决方案2】:

    您可以使用自定义名称映射和COALESCE 函数。如果自定义名称映射可以更改,您甚至可以将(可能为空的)映射传递为 parameter(而不是静态定义)。

    WITH {PL: 'Custom', UK: 'Custom'} AS cMap
    MATCH (calc)<-[:SOME]-(people:People)-[:LOCATED_IN]->(address:Address)
    RETURN
      COALESCE(cMap[address.country], address.country) as name, 
      COUNT(*) AS count,
      AVG(calc.value) AS value
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 2017-02-24
      • 2021-04-20
      相关资源
      最近更新 更多