3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Database for AI - Grakn.aiことはじめ part 3 - ポケモングラフマスター

Posted at

##はじめに
前回のDatabase for AI - Grakn.aiことはじめ part 2 - AzureにGrakn.aiをインストールしてグラフを愛でるでAzureにGraknをインストールした際にポケモンのテストデータを入れてみた。今回はこのテストデータに対してVisualizerをいじって基本操作を説明してみる。

英語が読める方へ

本家ブログとさほど内容は変わらないので、そちらをどうぞ。

Virtual Boxを使用する場合

Database for AI - Grakn.aiことはじめ part 2 .1 - Oracle Virtual Boxで学ぶGrakn Academyで記載したようにOracle Virtual Boxにて試される場合、Grakn Academyにも同じサンプルが用意されているので、VMにログイン後:

grakn/graql console -f grakn/example/pokemon.gql -k pokemon

とすれば良。
##キースペースハンドラー
GraknにはKeyspaceというネームスペースの概念があり、作業対象のネームスペースを特定して作業を実施する必要がある。(デフォルトはgrakn)これはクエリの実行だけでなく、データ投入等でも同様。コマンドラインでは-k pokemonという形式で指定するが、Visualizerでは
keyspace_selector.PNG
コンソール右上にあるハンドラーで切り替える。
##メニュー
主にGraphとConsoleを切り替えて作業を行うが、いずれにおいてもクエリを実行する事が可能。
####コンソール:
console.PNG
####グラフ:
graph.PNG
##クエリ
####クエリウィンドウ
クエリウィンドウにクエリを記述してから▶ボタンで実行する。もしくはEnterで実行。クエリウィンドウはマルチラインに対応しているので、Shift+Enterでウィンドウ内での改行を行うことが出来る。コピペで複数行のコマンドをペーストした際には自動的に複数行化される。
multiline.PNG
####キャンセルボタン
お察しの通りXボタンでクエリをクリアする事が出来る。但しクリアされるのはクエリだけであって実行結果はクリアされない。実行結果もクリアしたい場合にはShiftを押しながらXボタンの押下が必要。
####クエリオプション
クエリのオプション変更は歯車ボタン:
option.PNG
Activate InferenceはデフォルトOffになっているが、Inference(演繹)、つまり明示的でない関連性をクエリで表現するか否かを切り替える事が出来る。そもそものGraknの用途を考えるとOnにしておいて良い。
####タイプ
エンティティやリレーションを特定し、その全件(もしくはオプションで指定した上限数)を取得するクエリを生成し実行する。
type.PNG
ここで一番右のAll(Types)を選択すると、オントロジーにおける全エンティティ/リレーションを一気に取得する事が出来る。つまりこれを選択するとオントロジーを可視化出来る。ちなみにPokemonオントロジーは以下のようになっている:
pokemon_ontology.PNG
オブジェクト指向的に見ると、Entity、Relationship、ならびにAttributeは全てThingのサブクラス(?)である事が分かる。ただし、どのEntityがどのattributeを持っているか、どのEntity同士がrelationshipで繋がっているかは見えない。あくまでオントロジーの構成要素のみ。(アグリゲーション/コンポジションを表現するものではない。)
##グラフ
さて、当然コンソールをVisualizerで使うことも出来るが、Visualizerと言われるくらいなのでグラフをいじってナンボ。ここではグラフの基本的な扱い方について説明する。
####クエリの構成要素
まずは水タイプのポケモンを取得してみる:

match
($x, $y) isa has-type;
$x isa pokemon;
$y isa pokemon-type has name "water";
get;

結果はこうなる:
pokemon_water.PNG
上のクエリのmatchが条件文の開始、getの行が実行行となる。その間の3行が条件文にあたるが、これらは順不同である。また、ここでhas name "water"としている箇所がフィルタリングの条件で、SQLにおけるWHEREとほぼ同意。代わりにhas name $pokemon_nameという風に変数を指定する事も出来、後に続くgetに指定すればこれのみ抽出する事も可能。

今回の実行結果ではgetするものを指定しなかったので、クエリ結果に該当する全てのThingが抽出されている。よって、Entityではなくクエリ内にrelationship(pokemonとpokemon-type)も含まれているのでこれらを繋ぐ線も表示されているが、例えば上のクエリを

match
($x, $y) isa has-type;
$x isa pokemon;
$y isa pokemon-type has name "water";
get $x, $y;

とするとエンティティだけが抽出される。ある属性(Attribute)に$で変数定義すると、これらを抽出する事も可能。これはEntityもRelationshipもAttributeも全てThingを継承したクラスであり、Thingであればグラフで表現できるからこうなる。
####グラフの表示を変更する
さて、抽出できたがデフォルトの表示ではIDしか表示されずあまり使えない。(真ん中のpokemon-typeは一つだけなので"water"なんだろうと推測は出来るが。)そこで表示をカスタマイズしたいんだが、これは表示されているエレメントをクリックしたまま(1秒くらい)すると出てくる属性をいじれば変更する事ができる:
pokemon_label.PNG
まずは表示したいAttributeを選ぶことによってようやくデータ探索として使える程度になる。また色を変えることも可能。表示属性の変更はEntityにもRelationshipにも適用する事が可能で、種類が多いと非常に便利。ちょっといじると:
pokemon_after_change.PNG
こうなった。これで最低限名前が見れる。
####関連性を拡張する
現在はクエリ結果を表示している状態なので、各ポケモンに対する他の関連性は見えてこない。これは、Entityをダブルクリックする事によって特定ノードのRelationshipを引き出すことが出来る。グラフに表示されているラプラスをダブルクリックしてみると:
pokemon_lapras.PNG
今度はpokemon-type:iceも抽出された。これはラプラス(読み方あってると良いが)には水属性と氷属性の両方が備わっている事を意味する。(実際に正しいかどうかは知らないが)

ひとつここで注意しておきたいが、今回pokemon-type:iceが発見できたが、この作業は実行されたクエリのドメイン内においてのみ抽出される。ラプラスに例えば先祖その他Relationshipが貼られていても、このクエリでは抽出されない。

match
$x isa pokemon has name "Charmeleon";
$a ($x, $a1) isa has-type;
$c ($c1, $x) isa evolution;
$b ($x, $b1) isa evolution;
get;

ポケモンタイプと先祖-子孫のRelationshipを定義することにより、以下のように抽出される。ここでは同じevolutionに対し、先祖側、子孫側の両方にCharmeleonを定義しているのがポイント。
image.png
##さいごに
今回をもって、「Grakn.aiことはじめ」は締めくくりたいと思う。

まだまだ色々紹介できていない事は沢山あり、特にGrakn最大の強みであるInference(演繹)については触れていないが、今後個別のトピックとして扱っていこうと思う。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?