2015-12-11 8 views
7

Şu anda hiyerarşik JSON çıkaran bir sorgu yazmak için konsol.neo4j.org'daki örnek verileri kullanıyorum.İç içe, hiyerarşik JSON ağacından bir ağaçtan dönmek için Cypher'ı kullanma

örnek veri

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) 

ile oluşturulan İdeal çıkış aşağıdaki sorguyu

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

kullanarak ve bu alıyorum, şu anda

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

aşağıdaki gibidir

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

Bunu çözmek için herhangi bir ipucu var mı? Teşekkürler

cevap

5

Neo4j 3.x'te, neo4j sunucusunda APOC plugin yüklendikten sonra, benzer sonuçlar üretmek için apoc.convert.toTree prosedürünü çağırabilirsiniz. Örneğin

:

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

... şöyle bir sonuç satır döndürür:

{ 
     "_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-procedure) ismin tarihini verir. – cybersam

+0

Evet. Bu sorudaki örneklemin Matrix'ten geldiğine işaret ediyordum. – flq

+0

Bu, APOC eklentisinin en güçlü özelliği (en azından benim için en azından) ve Docker-compose kullanılıyorsa, Docker'a Neo4j görüntüsüyle (belgelere bakın) getirilmesi çok kolay, hacimleri kullanın: - < .jar>:/plugins, "build" ve sonra "up" yazın. Bu @cybersam'i paylaştığınız için teşekkürler, hayatımı ve boş zamanımı değiştirdim! –

İlgili konular