2016-07-25 7 views
1

Können Sie mir helfen, cypher Abfrage zu erstellen? ich habe folgende Diagramm db Struktur:neo4j Cypher hierarchische Baum Build-Antwort auf JSON

(parent:Category)-[:subcategory]->(child:Category) 

Mit diesen Graph Daten i hierarchischen Baum mit tiefer Ebene.

fand ich folgenden Code auf Stackoverfllow.com und geändert für meine Daten:

MATCH (root:Category)-[:subcategory]->(parent:Category)-[:subcategory]->(child:Category) 
WITH root, {category: parent, children: collect(child)} AS parent_with_children 
WHERE NOT(()-[:subcategory]->(root)) 
RETURN {category: root, children: collect(parent_with_children)} 

Aber er ist die Antwort für die Tiefe mit 3 Ebenen des Baumes nur bauen. Ich brauche größer. Ich versuche json Reaktion wie in diesem Beispiel zu bauen:

[ 
    category: { 
     name: "PC" 
     children: { 
     category: { 
      name: "Parts" 
      children: { 
      category: { 
       name: "CPU" 
       ... 
      } 
      } 
     }, 
     category: { 
      name: "Accessories" 
      ... 
     } 
     } 
    }, 
    category: { 
     name: "Laptop" 
     ... 
    } 
    ] 

Die Cypher rekursive Aufrufe machen? Ich denke, das wird besser.

Danke.

P.S. Ich weiß, dass es ähnliche Fragen zu SO gibt, aber sie haben mir nicht geholfen.

+0

Ja, Cypher tut nicht wirklich Rekursion. Wenn Sie einen Baum von Daten zurückgeben, ist Ihre beste Wette, mit dem zu gehen, was cybersam unten vorschlägt oder die Knoten/Beziehungen als eine Tabelle zurückbringt und sie im Gedächtnis aufbaut. –

Antwort

4

Cypher ist nicht gut geeignet, um Diagrammdaten in einer Baumstruktur auszugeben, wenn Blätter in beliebigen Tiefen liegen.

Mit neo4j 3.x, können Sie jedoch näher an das, was Sie wollen, wenn Sie die APOC plugin auf Ihrem Server installieren und die apoc.convert.toTree-Prozedur verwenden können.

Lassen Sie uns zunächst einige Beispieldaten erstellen:

CREATE 
    (c1:Category {name: 'PC'}), 
    (c1)-[:subcategory]->(c2:Category {name: 'Parts'}), 
     (c2)-[:subcategory]->(c3:Category {name: 'CPU'}), 
     (c3)-[:subcategory]->(c4:Category {name: 'CacheRAM'}), 
    (c1)-[:subcategory]->(c5:Category {name: 'Accessories'}), 
     (c5)-[:subcategory]->(c6:Category {name: 'Mouse'}), 
     (c5)-[:subcategory]->(c7:Category {name: 'Keyboard'}), 
    (c10:Category {name: 'Laptop'}), 
    (c10)-[:subcategory]->(c20:Category {name: 'Parts'}), 
     (c20)-[:subcategory]->(c30:Category {name: 'CPU'}), 
    (c10)-[:subcategory]->(c40:Category {name: 'Accessories'}), 
     (c40)-[:subcategory]->(c50:Category {name: 'Stylus'}); 

Dann mit dieser Abfrage:

MATCH p=(n:Category)-[:subcategory*]->(m) 
WHERE NOT()-[:subcategory]->(n) 
WITH COLLECT(p) AS ps 
CALL apoc.convert.toTree(ps) yield value 
RETURN value; 

... Sie N Ergebniszeilen erhalten werden, wobei N die Anzahl der Wurzel Category Knoten ist . Hier ist ein Ausschnitt von Beispiel-Ergebnissen:

{ 
    ... 
     "row": [ 
     { 
      "_id": 150, 
      "_type": "Category", 
      "name": "PC", 
      "subcategory": [ 
      { 
       "_id": 154, 
       "_type": "Category", 
       "name": "Accessories", 
       "subcategory": [ 
       { 
        "_id": 156, 
        "_type": "Category", 
        "name": "Keyboard" 
       }, 
       { 
        "_id": 155, 
        "_type": "Category", 
        "name": "Mouse" 
       } 
       ] 
      }, 
      { 
       "_id": 151, 
       "_type": "Category", 
       "name": "Parts", 
       "subcategory": [ 
       { 
        "_id": 152, 
        "_type": "Category", 
        "name": "CPU", 
        "subcategory": [ 
        { 
         "_id": 153, 
         "_type": "Category", 
         "name": "CacheRAM" 
        } 
        ] 
       } 
       ] 
      } 
      ] 
     } 
     ], 
    ... 
     "row": [ 
     { 
      "_id": 157, 
      "_type": "Category", 
      "name": "Laptop", 
      "subcategory": [ 
      { 
       "_id": 158, 
       "_type": "Category", 
       "name": "Parts", 
       "subcategory": [ 
       { 
        "_id": 159, 
        "_type": "Category", 
        "name": "CPU" 
       } 
       ] 
      }, 
      { 
       "_id": 160, 
       "_type": "Category", 
       "name": "Accessories", 
       "subcategory": [ 
       { 
        "_id": 161, 
        "_type": "Category", 
        "name": "Stylus" 
       } 
       ] 
      } 
      ] 
     } 
     ], 
    ... 
}