Neo4j Cypher聚合值计数
我返回的日期如下所示:Neo4j Cypher聚合值计数,neo4j,cypher,Neo4j,Cypher,我返回的日期如下所示: “乔纳森”|“芝加哥”| 6 |[“热”、“暖”、“冷”、“冷”、“冷”、“暖”] 其中第三列是第4列中的值计数 我想从第4列中的集合中提取值,并基于这些值创建新列。我的预期产出是: Hot | Cold | Warm,值1 | 3 | 2表示每个值的计数 我当前的查询是match(p)-[]->(c)-[]->(w)返回不同的p.name、c.name、count(w)、collect(w.weather) 我想这很简单,但我一辈子都想不出来。Cypher没有办法“透视
“乔纳森”|“芝加哥”| 6 |[“热”、“暖”、“冷”、“冷”、“冷”、“暖”]
其中第三列是第4列中的值计数
我想从第4列中的集合中提取值,并基于这些值创建新列。我的预期产出是:
Hot | Cold | Warm
,值1 | 3 | 2
表示每个值的计数
我当前的查询是match(p)-[]->(c)-[]->(w)返回不同的p.name、c.name、count(w)、collect(w.weather)
我想这很简单,但我一辈子都想不出来。Cypher没有办法“透视”数据(如前所述)。这部分是因为它不支持动态生成返回值的名称(例如,“Cold”)——而正是这些名称在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函数是获取具有更新键值的地图的便捷方法