2016-07-25 127 views
1

你能帮我建立密码查询吗?我有以下图形数据库结构:neo4j Cypher分层树构建响应JSON

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

有了这个图数据我有深层次的树状层次结构。

我发现下面的代码上Stackoverfllow.com,改变了我的数据:

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)} 

但他只建了3个层次树的深度反应。我需要更大。我试图建立像这个例子的JSON响应:

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

Cypher可以进行递归调用?我认为这会更好。

谢谢。

P.S.我知道有类似的问题,但他们没有帮助我。

+0

是的,Cypher并没有真的做递归。当你返回一棵数据树时,你最好的选择是使用cybersam在下面建议的内容,或者将节点/关系作为表格返回,并将它们构建在内存中。 –

回答

4

Cypher不适合在叶子处于任意深度时倾出树形结构中的图形数据。

但是,使用neo4j 3.x,如果您能够在服务器上安装APOC plugin并使用apoc.convert.toTree过程,则可以接近您的要求。

首先,让我们来创建一些示例数据:

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'}); 

然后用此查询:

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

...你将得到N个结果行,其中N是根Category节点的数量。这里是一个示例结果的片段:

{ 
    ... 
     "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" 
       } 
       ] 
      } 
      ] 
     } 
     ], 
    ... 
}