在Neo4J数据库中查找叶节点

时间:2012-10-29 05:34:56

标签: neo4j spring-data spring-data-neo4j

我们有一个项目,我们使用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);

2 个答案:

答案 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