はじめに
今回は、前回作成したグラフDBに、リレーションシップのプロパティによるセカンダリインデックス機能を追加します。
セカンダリインデックスを用いることで、隣接リレーションシップをフィルタリングをしたり、ソートした状態で取得することが可能です。
対象読者
- HBaseを使ってみたいけど、どう使ったらよいか分からない方
- MySQLなどのRDB以外のデータベースを使ってみたい方
要件定義
前回作成したグラフDBに、以下の機能を追加します。
- あるノードの隣接リレーションシップを、単一のリレーションシップのプロパティによるフィルタとソートを指定して取得できる。
リレーションシップのプロパティのセカンダリインデックスを作成することによって、上記の要件を満たすことが可能です。
今回は、すべてのリレーションシップのプロパティに対してセカンダリインデックスを作成する仕様にします。
論理設計
論理設計については前回と同様です。
物理設計
それでは、物理設計に入ります。
物理設計は、「クエリ設計」をした後に、HBase上にどうマッピングするかを設計する「スキーマ設計」を行います。
クエリ設計
まず、クエリから考えていきましょう。
要件定義からクエリを考えていくと、以下のようなメソッドを実装すれば良いと思います。
// 隣接リレーションシップの取得(セカンダリインデックスを使用) List<Relationship> select(String nodeId, String type, Direction direction, Filter filter, Sort sort, int length) throws IOException;
Filterクラスと、Sortクラスは以下のようになります。
public class Filter { // フィルタリングするプロパティ名 private String propertyName; // オペレータ private Operator operator; // フィルタリングする基準となる値 private String value; // ... setterやgetterは省略 }
public class Sort { // ソートするプロパティ名 private String propertyName; // 順序(昇順、降順) private Order order; // ... setterやgetterは省略 }
また、OperatorとOrderは以下になります。
public enum Operator { EQUAL, // 等しい GREATER, // 大きい GREATER_OR_EQUAL, // 大きいか等しい LESS, // 小さい LESS_OR_EQUAL // 小さいか等しい }
public enum Order { ASC, // 昇順 DESC // 降順 }
前回実装したselectとの違いは、FilterとSortの指定ができることです。
Filterを指定することで、隣接リレーションシップのプロパティの値とオペレータを基準にフィルタリングできます。
また、Sortを指定することで隣接リレーションシップのプロパティの値でソートされた状態で取得することができます。
FilterとSortを同時に指定することはできますが、propertyNameは同じものを指定しなくてはなりません。
今回は、複数プロパティに対応したセカンダリインデックスを対象としていないためです。