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