在 Cypher 中旋转数据

Pivoting data in 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    |
...

我想做的是对这些数据进行透视以提供一个简短的概括视图 table:

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

是否有使用 Cypher 执行此操作的简单方法?

为了让 Neo4j 工具(如 Neo4j 浏览器)从 Cypher 查询生成看起来像枢轴 table 的可视化,查询必须 硬编码 每个“列”的标题——因为 Cypher 查询无法动态生成值的名称 returns。也就是说,您的 RETURN 子句必须类似于 RETURN Group, label1, label2, label3.

现在,如果您碰巧事先知道所有可能的标签,那么您确实可以执行一个简单的查询,returns 您的枢轴 table。例如:

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 returns 从键和值列表生成的映射。如果 Group 没有特定标签,其单元格值将为 null.