【问题标题】:Neo4j Cypher Aggregating Value CountsNeo4j Cypher 聚合值计数
【发布时间】:2020-11-09 22:34:54
【问题描述】:

我返回的日期如下所示:

"Jonathan" | "Chicago" | 6 | ["Hot","Warm","Cold","Cold","Cold","Warm"]

其中第三列是第 4 列中值的计数。

我想从第 4 列的集合中提取值并根据这些值创建新列。我的预期输出是:

Hot | Cold | Warm 的值 1 | 3 | 2 表示每个值的计数。

我目前的查询是match (p)-[]->(c)-[]->(w) return distinct p.name, c.name, count(w), collect (w.weather)

我想这很简单,但我一辈子都想不通。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    Cypher 无法“透视”数据(如 here 所述)。这部分是因为它不支持 动态 生成返回值的名称(例如,“Cold”)——而正是这些名称在 Text 和Table neo4j 浏览器提供的可视化效果。

    但是,如果您知道只有 3 个可能的“天气”名称,您可以使用这样的查询,它将这些名称硬编码到 RETURN 子句中:

    MATCH (c:City)-[:HAS_WEATHER]->(w:Weather)
    WITH c, {weather: w.weather, count: COUNT(*)} AS weatherCount
    WITH c, REDUCE(s = {Cold: 0, Warm: 0, Hot: 0}, x IN COLLECT(weatherCount) | apoc.map.setKey(s, x.weather, x.count)) AS counts
    MATCH (p:Person)-[:LIVES_IN]->(c)
    RETURN p.name AS pName, c.name AS cName, counts.Cold AS Cold, counts.Warm AS Warm, counts.Hot AS Hot
    

    上述查询有效地一次(针对该城市的所有人)获取城市的天气数据,而不是每个人一次。

    APOC 函数apoc.map.setKey 是获取具有更新键值的地图的便捷方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多