首页 > 解决方案 > 在 Cypher 中透视数据

问题描述

我刚刚开始使用 Neo4J 数据库,我很难找到一种很好的方法来旋转我正在使用的一些数据。

我有一个看起来像这样的基本查询: MATCH (n:DATA) WHERE n.status =~ "SUCCESS" return n.group as Group, n.label as Label, avg(toFloat(n.durationMillis)/60000) as Minutes,它产生像这样的高窄数据:

|Group  |Label  |Minutes|
|-------|-------|-------|
|group1 |label1 |1.0    |
|group1 |label2 |2.0    |
|group1 |label3 |5.0    |
|group2 |label1 |3.0    |
|group2 |label3 |2.0    |
...

我想做的是旋转这些数据以提供一个简短的宽视图作为汇总表:

| Group | label1 | label2 | label3 |
| ----- | ------ | ------ | ------ |
|group1 | 1.0    | 2.0    | 5.0    |
|group2 | 3.0    | -      | 2.0    |
...

有没有一种简单的方法可以用 Cypher 做到这一点?

标签: neo4jcypherneo4j-apoc

解决方案


为了让 Neo4j 工具(如 Neo4j 浏览器)生成看起来像来自 Cypher 查询的数据透视表的可视化,该查询必须对每个“列”的标题进行硬编码——因为 Cypher 查询不能动态生成名称它返回的值。也就是说,您的RETURN子句必须看起来像RETURN Group, label1, label2, label3.

现在,如果您确实事先知道所有可能的标签,那么您确实可以执行一个简单的查询来返回您的数据透视表。例如:

MATCH (n:DATA)
WHERE n.status =~ "SUCCESS"
WITH n.group as Group, n.label AS l, AVG(n.durationMillis/60000.0) AS m
WITH Group, apoc.map.fromLists(COLLECT(l), COLLECT(m)) AS lmMap
RETURN Group,
  lmMap['label1'] AS label1,
  lmMap['label2'] AS label2,
  lmMap['label3'] AS label3

APOC 函数apoc.map.fromLists返回从键和值列表生成的映射。如果 aGroup没有特定标签,则其单元格值为null


推荐阅读