リレーションシップのプロパティに対するCAS操作
次にリレーションシップのプロパティに対するCAS操作をするコードです。GitHub上では以下のURLになります。
- https://github.com/brfrn169/codezine/blob/master/src/main/java/graphdb3/GraphDbServiceImpl.java#L107
- 指定のリレーションシップの現在の更新時間、プロパティを取り出す(133~151行目)
- expectedPropertiesと現在のプロパティを比較する。もし、値が違っていたらCAS操作が失敗となりfalseを返す(154~158行目)
- 新しい更新時間、新しいプロパティを生成(161~179行目)(新しい更新時間は必ず、現在の更新時間より後になるようにする)
- 更新時間に対するcheckAndPutを行う(187行目)。falseが返ってきたら、(1)に戻る(PutのTimestampには新しい更新時間を指定する)
- 最新順インデックスやセカンダリインデックスを作成する
こちらも基本的には、リレーションのプロパティの追加・更新・削除の処理と同じですが、CAS操作のためのプロパティ比較する2の処理が追加されています。
リレーションシップのプロパティに対するCAS操作が成功したら、最後に最新順インデックスやセカンダリインデックスを作成しています。
隣接リレーションシップ取得のカーソル機能
最後に隣接リレーションシップ取得のカーソル機能です。GitHub上では以下のURLになります。
- https://github.com/brfrn169/codezine/blob/master/src/main/java/graphdb3/Cursor.java
- https://github.com/brfrn169/codezine/blob/master/src/main/java/graphdb3/GraphDbServiceImpl.java#L286
- https://github.com/brfrn169/codezine/blob/master/src/main/java/graphdb3/GraphDbServiceImpl.java#L307
- https://github.com/brfrn169/codezine/blob/master/src/main/java/graphdb3/GraphDbServiceImpl.java#L338
getCorsorによってカーソルオブジェクトを取得できますが、それを表したものが以下のCursorクラスになります。
public class Cursor implements Serializable {
// カーソルのタイプ
public enum CursorType {
NEW_ORDER_INDEX, // 最新順
SECONDARY_INDEX // セカンダリインデックスを使用
}
// カーソルのタイプ
private CursorType cursorType;
// 方向
private Direction direction;
// ノードID
private String nodeId;
// ScanのstartRow
private byte[] startRow;
// ScanのstopRow
private byte[] stopRow;
// リレーションシップのタイプ
private String type;
// ... setterやgetterは省略
}
方向やノードID、リレーションシップのタイプはクエリの情報になります。
カーソルのタイプは最新順で取得するのか、セカンダリインデックスを使って取得するのかでロジックが異なるのでその切り分けをするために使います。
ScanのstartRowとstopRowがカーソル機能のポイントとなる部分です。
カーソルをfetchした際に、startRowに最後に取得できたRowをインクリメントしたバイト配列をセットします。
このようにすることで、次にScanする際にセットしたstartRowを使って、前のfetchした結果の次からScanすることができます。
CursorをSerializableにしているのは、例えばカーソルオブジェクトをシリアライズしてセッションDBなどに保存しておくことで、ページングなどの機能を実現できるからです。
まとめ
今回は、プロパティに対するCAS操作と隣接リレーションシップ取得のカーソル機能を追加しました。これらの機能を追加することにより、グラフDBの使い勝手を良くすることができました。
今回はスキーマを変更してはいませんが、HBaseのCAS操作などの機能を駆使することで実現できる機能の一例を紹介できたと思います。
次回は、HBaseでSQLが扱えるPhoenixというライブラリを紹介しようと思います。
また、株式会社サイバーエージェントでは、Hadoop/HBaseエンジニアを募集しています。ご興味のある方はこちらからエントリーしていただければと思います。エンジニア>R&Dエンジニア>R&Dエンジニアを選択しエントリーしていただければ幸いです。
