在 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
.
我刚刚开始使用 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
.