7

Spring Data Neo4J を使用するプロジェクトがあります。重要なエンティティの 1 つを以下に示します。

@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 リポジトリ メソッドに配置できるサイファー クエリを作成する際に助けが必要です。

EDIT次のクエリ (関連付けられた 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);
4

2 に答える 2

15

これは私がサイファーで見つけた最も簡単な方法です: 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
于 2012-10-29T06:39:27.317 に答える