2015-12-11 10 views
7

Aktualnie używam przykładowych danych na console.neo4j.org, aby napisać zapytanie, które generuje hierarchiczny JSON.Używanie Cyphera do przywracania zagnieżdżonego, hierarchicznego JSON z drzewa

Przykład danych jest tworzona z

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) 

Idealne wyjście jest następująco

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

Teraz używam następującą kwerendę

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

i coraz to

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

Jakieś wskazówki, aby to zrozumieć? Dzięki

Odpowiedz

5

W neo4j 3.x po zainstalowaniu APOC plugin na serwerze neo4j można wywołać procedurę apoc.convert.toTree w celu wygenerowania podobnych wyników.

Na przykład:

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

... zwróci wiersz wyniku, który wygląda następująco:

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

[Apoc repo] (https://github.com/neo4j-contrib/neo4j-apoc-procedures) podaje historię nazwy. – cybersam

+0

Tak. Miałem na myśli fakt, że próbka w tym pytaniu pochodzi również z matrycy. – flq

+0

Jest to zdecydowanie najmocniejsza funkcja (przynajmniej dla mnie) wtyczki APOC i bardzo łatwa do wprowadzenia do Dockera z obrazem Neo4j (patrz dokumentacja), jeśli używasz funkcji dokowania, użyj woluminów: - :/plugins, "kompilacja", a następnie "up". Dziękuję za udostępnienie tego @cybersamu, zmieniło moje życie i czas wolny! –

Powiązane problemy