如何使用Neo4j查询恢复表格数据?

时间:2015-08-28 17:56:23

标签: graph neo4j cypher graph-databases

我已将数据表格数据存储为Neo4j数据库中的关系属性。我想以表格形式恢复数据。

例如,一个节点存储如下:

MATCH (g:GNE),(p:EXP)
WHERE g.etr='5313' AND p.NExp='Bos_RM'
CREATE UNIQUE (p)-[r:Was_norm
    {Method:'NULL', time_t_35: '6.04',time_t9: '6.587',time_t14: '5.708',time_t31: '6.89',time_t224: '4.842'}
  ]->(g)

我尝试了这样的查询:

MATCH (g:GNE)-[r1:Was_sel]-(e:EXP)-[r2:Was_norm]-(g)
WHERE e.NExp = 'Bos_SM'
RETURN g.etr,r2

但我想以表格形式恢复数据,并且顺序正确。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:3)

鉴于Cypher的当前功能,可能无法使用当前的数据模型执行所需的操作。部分问题是,如果没有硬编码(在您的查询中)属性的名称,则无法获取属性值。问题的另一部分是属性键不一定以原始顺序(或以任何可预测的顺序)返回。

相反,您可以通过更改存储表格数据的方式来解决这些问题。

例如,假设您以这种方式存储节点(注意集合以所需顺序存储):

MATCH (g:GNE),(p:EXP)
WHERE g.etr='5313' AND p.NExp='Bos_RM'
CREATE UNIQUE
  (p)-[r:Was_norm {
    Method:'NULL',
    times: [    9,    14,   31,  224],
    values:[6.587, 5.708, 6.89, 4.842]
  }]->(g)

鉴于上述数据模型,您可以轻松地将表格数据作为2个独立的数组返回:

MATCH (g:GNE)-[r:Was_norm]->(p:EXP)
WHERE g.etr='5313' AND p.NExp='Bos_RM'
RETURN g.etr, r.times, r.values;

或者,如果您想将数据恢复到一个数组中:

MATCH (g:GNE)-[r:Was_norm]->(p:EXP)
WHERE g.etr='5313' AND p.NExp='Bos_RM'
RETURN g.etr,
  REDUCE(s =[], i IN RANGE(0,LENGTH(r.times)-1) | s + { time: r.times[i], value: r.values[i]}) AS table;

上述查询(see this console)的结果如下所示:

+-------------------------------------------------------------------------------------------------------+
| g.etr  | table                                                                                        |
+-------------------------------------------------------------------------------------------------------+
| "5313" | [{time=9, value=6.587},{time=14, value=5.708},{time=31, value=6.89},{time=224, value=4.842}] |
+-------------------------------------------------------------------------------------------------------+