2017-07-05 2 views
3

Neo4jデータベースには、ファミリーツリーの関係が含まれています。Neo4jはネストしたJSONを返す

私はそうのようなネストされたJSON形式でそのデータを抽出したいと思います。それを可視化するために

{ 
"firstname":"Jon", 
"lastname":"Smith", 
"parents":[ 
    { 
    "firstname":"Anna", 
    "lastname":"Smith", 
    "parents":[ 
     { 
      "furstname":"Peter", 
      "lastname":"Doe", 
      "parents":[ 
       { 
       "firstname":"Jessica", 
       "lastname":"Doe" 
       }, 
       { 
       "firstname":"Clayton", 
       "lastname":"Doe" 
       } 
      ] 
     }, 
     { 
      "firstname":"Nell", 
      "lastname":"Gordon", 
      "parents":[ 
       { 
       "firstname":"Jessica", 
       "lastname":"Roberts" 
       }, 
       { 
       "firstname":"Randy", 
       "lastname":"Roberts" 
       } 
      ] 
     } 
    ] 
    } 
] 
} 

。そのようpy2neoライブラリと

MATCH path = (p:Person)-[r:PARENT_OF*1..3]-(k:Person) 
WHERE k.id = '1887' 
UNWIND r as rel 
RETURN StartNode(rel).firstname, rels(path), EndNode(rel).firstname 

dumps(graph.run(query).data()) 

を私は希望のようなJSONはネストされませんでした

私は、次のクエリを試してみました。

私はこれを実現するか、私は他のプログラミング言語でのネスティングを行う必要があります役立つだろうクエリがありますか?コメントでsaydたよう

+1

https://neo4j.com/blog/cypher-graphql-neo4j-3-1-preview/これは、ネストされたJSONを返す方法を理解するのに役立ちます。 –

+2

https://stackoverflow.com/questionsを確認してください/ 38578114/neo4j-cypher-hierarchy-tree-build-response-to-json ... apocには手続きがあります。 –

答えて

2

、あなたはAPOC Procedureapoc.convert.toTreeを使用することができます。見て:

1 - あなたの質問に基づいて、サンプルデータセットの作成: - :

MATCH path = (jon:Person {firstname:'Jon', lastname:'Smith'})-[:PARENT_OF*]-(:Person) 
WITH collect(path) as paths 
CALL apoc.convert.toTree(paths) yield value 
RETURN value; 

3 - 結果:

{ 
    "_type": "Person", 
    "_id": 9, 
    "firstname": "Jon", 
    "lastname": "Smith", 
    "parent_of": [ 
    { 
     "_id": 10, 
     "_type": "Person", 
     "firstname": "Anna", 
     "lastname": "Smith", 
     "parent_of": [ 
     { 
      "_id": 11, 
      "_type": "Person", 
      "firstname": "Peter", 
      "lastname": "Doe", 
      "parent_of": [ 
      { 
       "_id": 12, 
       "_type": "Person", 
       "firstname": "Jessica", 
       "lastname": "Doe" 
      }, 
      { 
       "_id": 13, 
       "_type": "Person", 
       "firstname": "Clayton", 
       "lastname": "Doe" 
      } 
      ] 
     }, 
     { 
      "_id": 14, 
      "_type": "Person", 
      "firstname": "Nell", 
      "lastname": "Gordon", 
      "parent_of": [ 
      { 
       "_id": 15, 
       "_type": "Person", 
       "firstname": "Jessica", 
       "lastname": "Roberts" 
      }, 
      { 
       "_id": 16, 
       "_type": "Person", 
       "firstname": "Randy", 
       "lastname": "Roberts" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

クエリを実行

CREATE (jonsmith:Person {firstname:"Jon", lastname:"Smith"}) 
CREATE (annasmith:Person {firstname:"Anna", lastname:"Smith"}) 
CREATE (peterdoe:Person {firstname:"Peter", lastname:"Doe"}) 
CREATE (jessicadoe:Person {firstname:"Jessica", lastname:"Doe"}) 
CREATE (claytondoe:Person {firstname:"Clayton", lastname:"Doe"}) 
CREATE (nellgordon:Person {firstname:"Nell", lastname:"Gordon"}) 
CREATE (jessicaroberts:Person {firstname:"Jessica", lastname:"Roberts"}) 
CREATE (randyroberts:Person {firstname:"Randy", lastname:"Roberts"}) 

CREATE (jonsmith)-[:PARENT_OF]->(annasmith) 
CREATE (annasmith)-[:PARENT_OF]->(peterdoe) 
CREATE (annasmith)-[:PARENT_OF]->(nellgordon) 
CREATE (peterdoe)-[:PARENT_OF]->(jessicadoe) 
CREATE (peterdoe)-[:PARENT_OF]->(claytondoe) 
CREATE (nellgordon)-[:PARENT_OF]->(jessicaroberts) 
CREATE (nellgordon)-[:PARENT_OF]->(randyroberts) 

2あなたが使用しているNeo4jのバージョンに従ってAPOC手順をインストールすることを忘れないでください。 version compatibility matrixをご覧ください。

+0

私は 'apoc.convert.toTree'を手にしています。 (M:人) n.id = '1887 - 'MATCHのP =(N:::人) - [PARENT_OF * R]あなたは罰金作品を提供しますが、私はこのように私のデータでそれをしようとする例' WITH COLLECT(p)AS ps CALL apoc.convert.toTree(ps)降伏値 戻り値; クエリは永遠に実行されます。 'MATCHのP =(N::人)私はそうのようなグラフを指示した場合 - [R:PARENT_OF *] - > 1887'と彼を:(M:人)' その後、私は、ID 'と人の子だけを取得します子供の子供たちは、私はその人の両親を取得しません。私はすべての 'PARENT_OF'ノードをネストする方法が必要です。 – Porjaz

+0

@Porjaz最初のクエリは永遠に実行されます。これは、ノードから始まるすべての方向と深さでグラフを移動しているためです。つまり、グラフに対して非常に高価な操作です。深さを制限しようとすると( '[PARENT_OF * 1..3]'のような)何か? –

+0

これは '[:PARENT_OF * 1..2]'のみで動作しますが、この方法ではすべての関係を取得できません。私はたぶん関係を正しくネストするカスタムスクリプトを書いています – Porjaz

関連する問題