##はじめに
会社ではチャットボットの担当で、現在はアーキテクチャを念頭に置きつつも各ピース(ソリューション等)を評価している。色々試していると、どの技術もどのプラットフォームも方向性が似たり寄ったりで、かつボットを「賢く」するという点にはあまり注力していない。結局インテリジェンスはバックエンドサービスから来るもので、それはボットの責任範疇では無い、といってしまえばそれまでかも知れないけど。
データサービスはともかく、オペレーションやプロセスをボットでやろうとすると既存技術では案外上手く嵌らないことが多い。業務フローはルールエンジンやフローになるだろうし、条件の判定にはリレーショナルなデータストアへのクエリが合ってるし、じゃあどちらにもあてはまらないロジック的なものはどうしよう?となって構成が随分煩雑になってしまう。特にボットの様にユーザーのコンテキストがころころ変わったり(「いいや、やっぱやめて医療系の商品が知りたい」)、エンジンを跨いだコンテキストが出てきたり(「ところでさっき選んだ商品の年齢上限は?」)、雑多なコンテキスト管理をコントローラーで管理すると煩雑になりダイアログを追えなくなる。やっぱり柔軟で、ある程度何でも入れれるような「賢い箱」が欲しい。何かないものか…
という経緯で、グラフデータベース、中でもGrakn.aiというエンジンを試してみることになった。
##Grakn.aiとは
Grakn.aiはHaikal Pribadiさんが2015に開発したグラフデータベースで、オープンソースとして公開されている(GitHub)。ライセンスはGPL-3.0。開発母体はGraken Labs。データ構造はグラフモデルだが、普通(?)のグラフデータベースとは趣向がやや異なる。
「Database for AI」というコピーが付いているが、今はAIと付けていれば注目されるというのもあるので大目に見てやって欲しい。
####特徴
- データ層の上にオントロジー層を定義出来る。
- エンティティに継承が適用できる。(Customer extends Person的な)
- リレーションが1対1ではなく、複数定義出来る。(Marriage: husband / wife / priest / ring的な)
- 既存のリレーションから、暗に関連性を定義出来る。(country-state-cityの場合cityはcountryに属する、的な)
グラフというとセマンティックウェブのような集合知をグラフ化したものを想像しがちだが、Grakn.aiはそれとは異なる。あくまでデータストアであり、制約を駆使する事によって未知の関連性を導き出すことが(可能)というのが正しい。あらゆるタイプのメタデータを一元管理出来るというも本来の趣旨からは外れるが、メタデータをリレーショナルでは無い形で(しかもオブジェクト指向っぽく)モデリング出来るのって結構使える。
この1が結構キモで、これまでドメイン毎にグラフ設計にはそれなりの専門知識を要していたが、オブジェクト指向的な発想でモデリング出来る。(Grakn.aiの人も、「これはグラフ的に考えない方がいい」と言っていた。)実際には継承はあってもアグリゲーション/コンポジションの概念が無いのでモデリングの方法は異なる。振る舞いの概念も希薄なのでインターフェースの定義も無い。ただ「発想」は近くて、まずはエンティティの定義を継承の概念からするというのが正で、この段階である程度Inference(演繹)の当たりを付けながらモデリングしていく。
2と4を上手く組み合わせてオントロジーを構築すると、明示的に定義していない関連性が導かれる。まぁ平たく言うとこれが「ナレッジ」(Inference)とよばれるGrakn.aiの強みである。グラフ理論にはInference Graphというこの発想をメインに据えた概念もあるが、Grakn.aiは違う。あくまで「グラフをエンジニアリング出来る」というのが売り。
####システム構成
- Jetty / Groovy / Akka / Antlr / Jackson / etc.
- TinkerPop
- Cassandra
- Redis
- Kafka (0.17でコアから削除)
- Zookeeper(0.17でコアから削除)
基本的にJavaで書かれており、生データへのアクセスはTinkerPopに依存している。その下のデータ層が変わってもTinkerPopを載せ替える事はまずないだろうとの事。但しまだ0.xの状態であり、かつリファクタリングを超えたアーキテクチャ変更も結構頻繁になされているで先は不明。
####環境
全てのライブラリを含んだzipとして公開されている。(当然自分でビルドも可)基本的に展開してシェルを叩けば動かすことが出来る点はお手軽。サポート環境はMax OSとLinux。Windowsでは残念ながら動かないが、何とかしようかと検討中との事。起動時にはCassandra、Redis起動後にGraknを起動させるが、設定を変更させて既存Cassandraへの展開も(もちろん)可能。
ただしJAVA_HOMEは設定する必要あり。またJava 8のみサポートされている。(Java 9 はCassandraがサポートしていないので動かない。)
##次回
使える環境がWindowsしかないので、まずはAzureにLinuxのVMを立ち上げて設定、その後テストデータを読み込んでグラフを愛でるところまでをカバーしようと思う。