2017-01-28 6 views
3

Cypherでクエリを記述して、次のクエリの出力をJSONオブジェクトにフォーマットすることは可能ですか?JSONオブジェクトのすべての直接近傍を出力する

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

もちろん、これは有効なCypherクエリではありません。ここで提案されているコンセプトを生成するクエリを書く方法があるかどうか確認しようとしていますか?もう1つの問題(type(r):以外)はmであり、type(r)でグループ化する必要があります。

答えて

3

Gabor Szarnyasと言っているように、現在のサイファーの実装では、望む通りに正確に行うことは不可能です。しかし、あなたはAPOCライブラリからユーザ定義の手順apoc.map.fromPairsを使用してそれを行うことができます。

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 } 
+0

おかげで、それはそれはのNeo4j 3.1で、それは '返りapoc.map.fromPairs(ペア)' 'CALL'ずにしなければならないようだだけということです。 – Mehran

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

関連する問題