我们有一个项目,我们使用Spring Data Neo4J。其中一个重要实体如下所示:
@NodeEntity
public class Category {
@GraphId
Long id;
String name;
@RelatedTo(direction = Direction.INCOMING, type = "CHILD")
Category parent;
@RelatedTo(direction = Direction.OUTGOING, type = "CHILD")
Set<Category> children;
}
我们要求从名称已知的特定类别开始查找所有叶子类别(即没有任何子代的类别)。例如,给定如下所示的层次结构:
Electronics
Camera
Point and Shoot
SLR
Computing
Desktop
Laptop
Tablet
Netbook
Furniture
Tables
Office tables
Home tables
Chairs
Lounge chairs
Office chairs
搜索“家具”应返回“办公桌”,“家庭桌”,“休闲椅”和“办公椅”。同样,搜索“计算”应返回“桌面”,“笔记本电脑”,“平板电脑”和“上网本”。
需要帮助创建一个可以放在Spring Data存储库方法上的cypher查询,以便从指定节点开始为我提供所有叶子节点。
编辑以下查询(使用关联的Spring Data存储库方法)在Wes的帮助下工作:
@Query(
"START category=node:__types__(className='org.example.domain.Category') " +
"MATCH category-[:CHILD*0..]->child " +
"WHERE category.name={0} AND NOT(child-[:CHILD]->()) " +
"RETURN child")
List<Category> findLeaves(String name);
答案 0 :(得分:14)
这是我用cypher找到的最简单的方法: http://console.neo4j.org/r/cgrndo
start n=node(*) // you can specify a single node here if you want
match n-[r*]->m
where not(m-->()) // this limits m to be only leaf nodes
return distinct m; // this returns the distinct leaf nodes (not necessary if there are only simple paths)
编辑:(因为人们最近赞成这个......这是使用3.x cypher的更新)
match (n)
where not (n)-->()
return distinct n
答案 1 :(得分:-1)
如果您希望在cypher 3.0中找到所有叶节点 http://console.neo4j.org/r/leaf-nodes
match (n)-[r]-()
with n, count(r) as c
where c = 1
return n