2011-10-07 5 views
4

그래프 데이터베이스 Neo4J를 사용하여 지시 트리 구조를 모델링했습니다. 그래서 저는 다음과 같은 것을 가지고 있습니다 : http://ouwarovite.net/YAPC/220px-Binary_tree.svg.png (필수 이진수는 아닙니다)Neo4J를 사용한 지시 트리의 일반 탐색

내 데이터베이스의 사용자는 기존 노드의 자식 노드를 자유롭게 추가 할 수 있으므로 트리의 높이와 단일 노드의 정도는 알 수 없습니다.

이제 다음과 같이 트리를 쿼리하고 싶습니다. 노드 x로 시작하여 leave x의 자손 인 모든 잎을 제공하십시오.

Gremlin 또는 Cypher에서 이와 같은 종류의 쿼리를 수행 할 수 있습니까? 그렇다면 최대한의 성능을 얻는 방법은 무엇입니까? (나는 당신이 항상 최대 깊이를 지정해야하기 때문에 '일반'트리에 대한 쿼리를 수행 할 수있는 가능성을 발견하지 못했습니다.)

저는 REST/JSON 프레임 워크와 JAVA API를 사용하면 다음과 같이 표현할 수 있습니다.

이 더 나은 성능 어쩌면이 할 수있는 간단한/더 나은 방법이 있나요 -

POST /db/data/node/51/traverse/node 
{ 
"return_filter" : 
    { 
    "body" : "position.endNode().hasProperty('leave')" , 
    "language" : "javascript" 
    }, 
"relationships" : [ { "type" : "_default", "direction" : "out" } ] , 
"prune_evaluator" : { "name" : "none" , "language" : "builtin" } 
} 

(> 그래서 _default 내 잎 내 가장자리가 어떤 유형이 없다 '휴가'속성을 가지고)?

답변

4

사이퍼는 그렇게 볼 수 있었다 :

start root=node({rootId}) 
match root-[*]->child 
where child.leave 
return child 

rootId이 매개 변수 인에 전달 될

.