2015-12-11 1 views
7

zurückzugeben Ich verwende derzeit die Beispieldaten auf console.neo4j.org, um eine Abfrage zu schreiben, die hierarchische JSON ausgibt.Verwenden von Cypher, um geschachtelte, hierarchische JSON von einem Baum

Das Beispiel Daten mit

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) 

Der ideale Ausgangs erstellt wird, wird wie folgt

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

Gerade jetzt, ich bin die folgende Abfrage mit

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

und diese bekommen

[(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"})] 

Irgendwelche Tipps, um das herauszufinden? Danke

Antwort

5

In neo4j 3.x, nachdem Sie die APOC plugin auf dem Server neo4j installieren, können Sie die apoc.convert.toTree Prozedur aufrufen, um ähnliche Ergebnisse zu generieren.

Zum Beispiel:

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

... würde eine Ergebniszeile zurück, die wie folgt aussieht:

{ 
     "_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

[Die APOC Repo] (https://github.com/neo4j-contrib/neo4j-apoc-procedures) gibt die Geschichte des Namens an. – cybersam

+0

Ja. Ich bezog mich auf die Tatsache, dass die Probe in dieser Frage ebenfalls aus der Matrix stammt. – flq

+0

Dies ist bei weitem die mächtigste Funktion (gut für mich zumindest) des APOC-Plugin, und sehr einfach in Docker mit Neo4j Bild zu bringen (siehe Dokumentation), wenn Sie docker-komponieren verwenden, verwenden Sie Volumes: - :/plugins, "build" und dann "up". Danke für das Teilen dieses @ cybersam, hat mein Leben und Freizeit verändert! –