neo4j - 在 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 做到这一点?
解决方案
为了让 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
。
推荐阅读
- node.js - Express 4 空 JSON 查询
- hyperledger-fabric - Hyperledger Composer - 部署到多组织结构
- jquery - (Jquery、Ajax、Django、Cors、GET)没有“Access-Control-Allow-Origin”标头 - 忽略 Cors 白名单
- gremlin - TinkerPop: Gremlin revisiting visited edges
- javascript - Thinger.IO response timestamp (1486047553711) string to Date time
- python - macOS 上 VS Code 上的 Python 路径
- regex - Extracting 5 fields from logfile containing a string in Splunk
- ios - 核心数据和解码:在 json 中更进一步的层次结构
- jasper-reports - 条形图未显示所有类别 Jaspersoft Studio
- elasticsearch - match_phrase elasticsearch 中的可选术语