Cypher项目树

时间:2015-11-08 08:18:39

标签: neo4j cypher graph-databases

我有一个类别的层次结构,我想用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...} 

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

另一个问题(对于我想查询树的部分部分的情况):

如何获得所有主要类别(不是另一类别的子类别......)

1 个答案:

答案 0 :(得分:2)

所以这不是一个完美的答案......您可以返回所有数据,但它将采用表格格式,您需要自己将其转换为分层格式:

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

或者,您可以通过查找所有父母和子女,然后将其与您选择的编程语言在内存中组合来减少您需要返回的数据量:

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