2015-12-11 20 views
7

Attualmente sto utilizzando i dati di esempio su console.neo4j.org per scrivere una query che emette JSON gerarchico.Utilizzo di Cypher per restituire JSON nidificato e gerarchico da un albero

i dati di esempio viene creato con

create (Neo:Crew {name:'Neo'}), (Morpheus:Crew {name: 'Morpheus'}), (Trinity:Crew {name: 'Trinity'}), (Cypher:Crew:Matrix {name: 'Cypher'}), (Smith:Matrix {name: 'Agent Smith'}), (Architect:Matrix {name:'The Architect'}), 
(Neo)-[:KNOWS]->(Morpheus), (Neo)-[:LOVES]->(Trinity), (Morpheus)-[:KNOWS]->(Trinity), 
(Morpheus)-[:KNOWS]->(Cypher), (Cypher)-[:KNOWS]->(Smith), (Smith)-[:CODED_BY]->(Architect) 

L'uscita ideale è la seguente

name:"Neo" 
children: [ 
    { 
    name: "Morpheus", 
    children: [ 
     {name: "Trinity", children: []} 
     {name: "Cypher", children: [ 
     {name: "Agent Smith", children: []} 
     ]} 
    ] 
    } 
] 
} 

In questo momento, sto utilizzando la seguente query

MATCH p =(:Crew { name: "Neo" })-[q:KNOWS*0..]-m 
RETURN extract(n IN nodes(p)| n) 

e ottenere questo

[(0:Crew {name:"Neo"})] 
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"})] 
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"}), (2:Crew {name:"Trinity"})] 
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"}), (3:Crew:Matrix {name:"Cypher"})] 
[(0:Crew {name:"Neo"}), (1:Crew {name:"Morpheus"}), (3:Crew:Matrix {name:"Cypher"}), (4:Matrix {name:"Agent Smith"})] 

Qualche consiglio per capirlo? Grazie

risposta

5

In neo4j 3.x, dopo aver installato APOC plugin sul server neo4j, è possibile chiamare la procedura apoc.convert.toTree per generare risultati simili.

Ad esempio:

MATCH p=(n:Crew {name:'Neo'})-[:KNOWS*]->(m) 
WITH COLLECT(p) AS ps 
CALL apoc.convert.toTree(ps) yield value 
RETURN value; 

... restituirebbe una riga del risultato che assomiglia a questo:

{ 
     "_id": 127, 
     "_type": "Crew", 
     "name": "Neo", 
     "knows": [ 
     { 
      "_id": 128, 
      "_type": "Crew", 
      "name": "Morpheus", 
      "knows": [ 
      { 
       "_id": 129, 
       "_type": "Crew", 
       "name": "Trinity" 
      }, 
      { 
       "_id": 130, 
       "_type": "Crew:Matrix", 
       "name": "Cypher", 
       "knows": [ 
       { 
        "_id": 131, 
        "_type": "Matrix", 
        "name": "Agent Smith" 
       } 
       ] 
      } 
      ] 
     } 
     ] 
    } 
+0

[Il repo APOC] (https://github.com/neo4j-contrib/neo4j-apoc-procedures) fornisce la cronologia del nome. – cybersam

+0

Sì. Mi riferivo al fatto che l'esempio in questa domanda proviene anche da Matrix. – flq

+0

Questa è di gran lunga la caratteristica più potente (almeno per me almeno) del plug-in APOC, e molto facile da portare in Docker con l'immagine Neo4j (vedi documentazione), se si usa docker-compose, usa i volumi: - :/plugins, "build" e poi "up". Grazie per aver condiviso questo @cybersam, cambiato la mia vita e il mio tempo libero! –