输出JSON对象中的所有直接邻居

时间:2017-01-28 04:36:26

标签: neo4j cypher

是否可以在Cypher中编写查询以将以下查询的输出格式化为JSON对象?

MATCH (n:Artist{name:'Metallica'})-[r]->(m:Album)
RETURN {node: n, neighbours: { type(r): collect(m) }}

当然,这不是一个有效的Cypher查询。我试图看看有没有办法编写一个生成这里提出的概念的查询?另一个问题(type(r):除外)与m有关,需要按type(r)进行分组。

2 个答案:

答案 0 :(得分:3)

正如Gabor Szarnyas所说,在当前的密码实现中,不可能完全按照你的意愿去做。但您可以使用apoc.map.fromPairs库中的用户定义过程APOC来执行此操作:

MATCH (n:Artist {name:'Metallica'})-[r]->(m:Album)
WITH n, type(r) AS relType, collect(m) AS albums
WITH n, collect([relType, albums]) as pairs
CALL apoc.map.fromPairs( pairs ) YIELD value as neighbours
RETURN { node: n, neighbours: neighbours }

答案 1 :(得分:2)

您可以使用map literals构建地图。根据其文件:

  

从Cypher,您还可以构建地图。通过REST,您将获得JSON对象;在Java中,它们将是java.util.Map<String,Object>

但是,您必须事先在地图中指定键 - 您不能使用变量/表达式(例如type(r)的值)作为键。最接近我的要求如下:

MATCH (n:Artist {name:'Metallica'})-[r]->(m:Album)
WITH n, type(r) AS albumType, collect(m) AS albums
RETURN { node: n, works: collect({ type: albumType, albums: albums }) }

(查询在语法上是正确的,但我没有对任何数据进行测试。)

另请参阅此相关问题:Cypher query with literal map syntax & dynamic keys