2012-10-29 4 views
5

우리는 Spring Data Neo4J를 사용하는 프로젝트를 가지고 있습니다. 중요한 기관 중 하나는 다음과 같습니다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 

"사무실 용 테이블"을 반환해야 "가구"에 대한 검색, "홈 테이블", "라운지 의자"와 "사무실 의자". 마찬가지로 "Computing"에 대한 검색은 "Desktop", "Laptop", "Tablet"및 "Netbook"을 반환해야합니다.

스프링 데이터 저장소 메소드에 배치하여 지정된 노드에서 모든 리프 노드를 제공 할 수있는 사이퍼 쿼리를 만드는 데 도움이 필요합니다.

편집 (관련 봄 데이터 저장소 방법) 다음 쿼리는 웨스 도움 후 일 :

@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); 

답변

11

이 내가 사이퍼에서 발견 한 가장 간단한 방법입니다 : 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 사이퍼를 사용하는 업데이트)

match (n) 
where not (n)-->() 
return distinct n 
-1

당신이 관계 방향 그래프의 부모/자식 관계의 한 요소가 (없는 경우 사이퍼 3.0
http://console.neo4j.org/r/leaf-nodes

match (n)-[r]-() with n, count(r) as c where c = 1 return n

+0

이 단지 작품을 모든 리프 노드을 찾기 위해 찾고 있다면 여기서 2 노드 서브 그래프의 두 노드는 모두 리프 노드로 간주됩니다). 그렇지 않으면 쿼리가 2 노드 하위 그래프의 상위 노드 (하위 노드는 물론)에서도 일치하므로이 작업이 수행되지 않습니다. 정의에 의해 리프 노드는 하위 노드가 없지만 적어도 하나의 상위 노드가있는 노드이며이 쿼리가 검사하지 않습니다. 또한이 쿼리는 들어오는 관계가 여러 개 있지만 나가는 관계가없는 비 트리 그래프의 리프 노드를 식별하지 못합니다. – InverseFalcon

+0

무향 그래프의 경우 예 – Scott