2012-10-29 12 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」が返されます。

指定されたノードからすべてのリーフノードを取得するために、Springデータリポジトリメソッドに配置できるCypherクエリを作成する際に助けが必要です。

EDIT(関連する春データリポジトリ方式で)次のクエリは、ウェスから助けた後に働いた:

@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

これは私が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のサイファーを使ったアップデートがあります)

match (n) 
where not (n)-->() 
return distinct n 
-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

+0

にこれだけ作品を全てリーフノードを見つけるために探している場合ここでは2ノードのサブグラフ内の両方のノードがリーフノードとみなされる)。それ以外の場合は、クエリは2ノードのサブグラフ(およびその子)の親に対しても一致するため、これは機能しません。定義上、リーフノードは、子ノードのないノードである(少なくとも1つの親ノード)が、このクエリがチェックしているものではない。また、このクエリは、複数の着信関係があり、発信関係はない非ツリーグラフのリーフノードを特定することができません。 – InverseFalcon

+0

無向グラフの場合はYes – Scott

関連する問題