是否可以在Cypher中编写查询以将以下查询的输出格式化为JSON对象?
MATCH (n:Artist{name:'Metallica'})-[r]->(m:Album) RETURN {node: n, neighbours: { type(r): collect(m) }}
当然,这不是一个有效的Cypher查询。我试图看看有没有办法编写一个生成这里提出的概念的查询?另一个问题(type(r):
除外)与m
有关,需要按type(r)
进行分组。
答案 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