2015-11-08 48 views
2

我有我想要使用cypher查询的类别层次结构 - 一个将返回项目列表的查询,他们之间的关系作为子列表。Cypher的项目树

我创造这样我的项目:

CREATE (C1:Category {name:"Sport"}) 
CREATE (C1A:Category {name:"NHL"}) 
CREATE (C1B:Category {name:"NBA"}) 
CREATE (C1C:Category {name:"NFL"}) 
CREATE (C1)-[:SUB_CATEGORY]->(C1A) 
CREATE (C1)-[:SUB_CATEGORY]->(C1B) 
CREATE (C1)-[:SUB_CATEGORY]->(C1C) 

CREATE (C2:Category {name:"Music"}) 
CREATE (C2A:Category {name:"Rock"}) 
CREATE (C2B:Category {name:"Pop"}) 
CREATE (C2C:Category {name:"Classic"}) 
CREATE (C2)-[:SUB_CATEGORY]->(C2A) 
CREATE (C2)-[:SUB_CATEGORY]->(C2B) 
CREATE (C2)-[:SUB_CATEGORY]->(C2C) 

我希望查询返回类似:

{categories:[{name:music,id:1,categories:[{name:rock,id:2},{name:pop,id:3}]]...{name:sport,id:10,categories:[{name:nhl...} 

,我可以用它来填充下拉菜单选择一个类别/子类别。 (我想通过一个在这一点上查询整个树在一个查询,而不是一个)

的另一个问题(对于情况下,我想查询树的部分零部件)

如何能得到所有主要类别(不属于另一类别的子类别的那些...)

回答

2

所以没有一个完美的答案...您可以返回所有数据,但它将以表格格式显示,您需要把它变成自己的分层格式:

MATCH path=(root:Category)-[:SUB_CATEGORY*1..10]->(descendent:Category) 
WHERE NOT(()-[:SUB_CATEGORY]->(root)) 
RETURN nodes(path) AS nodes 

Alt ernatively可以减少数据的,你需要寻找所有的父母和孩子,然后将它们存储与您选择的编程语言相结合,返回量:

MATCH (parent:Category)-[:SUB_CATEGORY]->(child:Category) 
RETURN parent, child 

您还可以创建一个Neo4j的非托管扩展(基本上是你的Neo4j数据库的插件),它可以让你编写一些Java代码来返回它。

至于你的最后一个问题,它几乎回答了有关,但更直接的是这样的:

MATCH (root:Category) 
WHERE NOT(()-[:SUB_CATEGORY]->(root)) 
RETURN root 

编辑:

我才意识到,你可能没有一个任意深度的尝试。如果它只有三个级别(并且它总是正好三级),你可以这样做:

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