Neo4j を使ってみました

グラフ処理に特化したDBにNeo4jというのがあります。

Neo4jはオブジェクト同士の関係性を処理するのに特化したDBで、RDBMSでは困難な表現を処理するのに向いています。

例えば、

「高町なのは」は、「高町ヴィヴィオ」の母親で、「フェイト・T・ハラオウン」は「高町なのは」と「高町ヴィヴィオ」の後見人である。

「高町ヴィヴィオ」からみて「高町なのは」と「フェイト・T・ハラオウン」は「母親」である。

といった関係をCSVから読み込んで構成し、データとして配置する事が可能です。

というわけでさっそくテストデータを作成してみました。

魔法少女リリカルなのはキャラクターズ csv

nanoha_characters.csv

Neo4jは既に立ち上がっているものとして、実際に上記の CSV を流し込んでみます。

CSVで想定しているのは、

  • 声優 -> キャラクター
  • キャラクター -> キャラクター

という関係に絞り込んでいます。

まず、登録前にそれぞれのオブジェクトがユニークである事を保証するために、制約を設定します。

制約・キャラクターの重複を抑制

制約・声優の重複を抑制

制約の設定が終わったら以下の様な感じでCSVを流し込みます。

正常に取り込めていれば、

Added 38 labels, created 38 nodes, set 101 properties, created 83 relationships, returned 0 rows in 414 ms

といった表示が戻されるはずです。

ちなみにこんな構造になります。

graph_1 赤がキャラクターで青が声優です。

StrikerS のキャラクターを含めると、掛け持ちする声優が増えるのでもっと面白いグラフになりそう。

問い合わせには、CipherというNeo4j用の言語を使用します。データベースの問い合わせに使用するSQLに相当するものですが、SQLの基本が表の問い合わせを行うのに対して、Cipherはグラフの構造に対して問い合わせを行います。

基本は構造のマッチングによる問い合わせです。

例)

Aさんが持っているXを指している他の人たち。

Aさんの友達の友達。

基本的な問い合わせは、構造の定義(MATCH)を行ってから、条件(WHERE)の指定を行います。SQLで言うところのMATCHがFROM句でWHEREはそのままWHERE句に相当します。(WHERE句に指定する条件も似ています。)

問い合わせ例(その1)

父親のキャラクターは誰が演じていて、どのキャラクターにとっての父親かを検索。

result_1

うまく検索出来たようです。

問い合わせ例(その2)

自分が母親だと思っているのに、相手からは娘だと思われていないキャラクターを検索…って、調べるまでもなくフェイトちゃんですが。

result_2a

クロノくんと恭也さんまで出てきました。

この二人は母親からは「息子」だと思われているので間違いではない(娘ではないから)ですね。

条件が足りなかったようなので、修正。

result_2b

ちゃんと表示されました。

このままではあんまりなので、ちゃんと母親と娘という関係であるリンディさんが表示されるように検索してみます。

result_3

そういえば自分自身も母親でした。(劇中では後見人なのでちょっと違うかもしれないけど、フェイトママって呼んでいるため、ここでは母親にしてみました。)

データ件数が少ないので、実データを利用しての能力はわかりませんが機能的にはなかなか良さそうな感じです。

RapidMiner で魔導士ランクを予想してみる

魔法少女リリカルなのはの世界では、魔導士の能力を比較する為の基準値として魔導士ランクというのが設定されていて、例えばシャマルさんなら「総合AA+」といった具合に設定されています。

主要な登場人物には大抵設定されているのですが、StrikerS に登場する軌道六課に直接関係しないキャラクターには設定されていなかったりします。(少なくとも手持ちには)

具体的には以下の三人です。

  • クロノ・ハラオウン
  • カリム・グラシア
  • ヴェロッサ・アコーズ

ちょっと気になったので、三人の魔導士ランクを RapidMiner で予想してみる事にしました。

まず、わかる範囲で魔導士ランクが判明しているキャラクターの情報を集めて CSV にします。設定だとリンカーコアが魔力を生み出す源として描かれているようなのですが、はやての場合はスキルを考慮して設定されていたりします。

真面目に分析した方が面白そうなのですが、とりあえず以下の様な情報を集めてみました。

  • 魔法資質
    • 魔力光の色
    • 使用術式
  • 特徴
    • 種族
    • 出身地
    • 瞳の色
    • 性別
  • どのシリーズに登場しているか(レギュラーメンバーかどうかや、主人公補正的な意味あいから…)

nanoha_b01 ひとまず Naive Bayes で組んでみたもの。

いきなりモデルを生成して予想をしてみても良いのですけど、大抵はモデルを生成した後にそのモデルが妥当かどうかを調べたりします。大量にデータを所有していれば「構築用」と「検証用」に分離して利用するのですが、今回はデータ少ないため同じデータを使用しました。

nanoha_b02 Naive Bayes を使用して予想が当たっているかを調べてみたもの。

同じデータを使用しているため、事前に設定されたランクと RapidMiner が弾き出した結果を比較してみるだけなのですが…

あれ、かなり当たってる…というよりも予想以上の的中率。

(魔導士ランクは分類が細かすぎるため、単純化しています。)

ちょっと当たりすぎている気がしますので、評価内容を Weight や Distribution Table で調べた方が良いのかもしれませんが、ひとまずこのままのモデルを使って、三人の魔導士ランクを予想してみます。

nanoha_b03 ヴェロッサ…

結果が出ました。

  • クロノ -> 魔導士ランクS
  • カリム -> 魔導士ランクS
  • ヴェロッサ -> 魔導士ランクB

個人的な感想だと、ヴェロッサは B より上な気がするけど…

 

というわけで、 RapidMiner で遊んでみました。

 

今回使用したデータは以下になります。

CSV

nanoha_rank.csv