07グラフDBのNeo4jで関連キーワード検索を試してみる最近子供と風呂に入っては「肩まで浸かって指で6bit(63)まで数えよう」と教えています。2進数なら両手で1023まで数えられて便利なんじゃないかと思ってます。前に待鳥さんにグラフデータベースの存在を教えてもらいました。興味があったので実際にグラフ構造のデータを入れてつかってみました。具体的な環境構築やチューニングの話はしておりませんのであらかじめご了承ください。関連性に特化した検索で優位性があるとのこと。RDBでリレーションを貼る構成に比べると、高いスケーラビリティを実現しています。関しては以下のQiitaがよくまとまっていたのでそちらを参考にさせていただきました。Docker版を動かしてみました起動するだけであれば、dockerの入っている環境で以下を実行すればおしまいです。--publish=7687:7687--volume=$HOME/Workspace/neo4j/data:/dataneo4jまたpythonからNeo4jにデータを入れるためにpy2neoというパッケージを利用しました。上記コマンドで起動させればlocalhost:7474で起動するはずです。ここからチュートリアルや、サンプルデータで遊ぶことができます。実際のデータを投入してみる。数十分も遊ぶとサンプルに飽きるので、さっそくデータをいれてみましょう。4次元立体の頂点情報をCSVで入れる4次元立体を人間が知覚するのは難しいですが、座標をとるのは非常に簡単(xyzにwを足すだけ)です。2次元と次元を落として投影することで形を見ることもできます。ためしに4次元の正多胞体(3次元の正多面体にあたるもの)の構造を入力してみます。頂点情報と辺情報があれば描画できるのでグラフデータベースと相性が良いです。正多胞体の頂点と辺のCSVは以下のサイトからお借りしました。YOSHINOdockerで起動したせいかlocalのCSVファイルの読み込みがうまくいかなかったので、gistにuploadしてからurlで読み込むことにしました。CSVは接続されるべき頂点のIDが2つずつ記載されている形式でしたので、このCSVをNeo4jのUIから流し込み、グラフ構造を登録することができます。いうグラフクエリ言語を使用します。4行目が独特ですが、n1とn2を辺で結ぶ処理を行っています。データが存在しなければ追加します。同じ頂点が複数回よばれるのでこの処理を追加しました。グラフを描画してみる正8胞体4次元立方体とか超立方体とかテッセラクトとか。見ると3次元の立方体が8個あるのが確認できます。個人的には一番お世話になった、思い入れのある立体。正120胞体よく見ると3次元の正12面体が120個くっついているのがみえるでしょうか。正12面体のトリッキーな構成美がそのまま4次元になっていて、飽きの来ない形をしています。正600胞体よく見ると4面体が600個くっついているのがみえるでしょうか。字面的にラスボス的なポジションにいながらサイズも小さく、絵的に残念な感じがします。実際に業務で使ってみるビザスクでは登録いただいたアドバイザー様の知見データベースとして持っています。実際に知見をキーワード検索する際には、単純にキーワードの検索結果をとるだけでなく、関連キーワードでの検索結果も利用しています。今回試しに、実際に検索されるキーワードとその関連キーワード、そのキーワードを含む知見と、そのユーザーさんまで、というグラフ構造をNeo4jに入れてみました。pythonから知見データを投入する以下はデータを流し込んだ際のサンプルです。(保持キーワード)の組み合わせの情報です。元データの都合上このようなデータを渡していますが他に方法あったかもしれません。py2neo.authenticateで接続して先程のCypherQLでデータを入力していきます。検索キーワードを関連キーワードと紐付ける処理はデータがCSVだったので先程のやり方で入力しています。これで検索キーワードの関連情報から、ユーザーを検索できるようになりました。実際に検索するクエリは以下のように書くことができました。m,k,t,uエンジンという検索キーワード(MetaKeyword)に関してのリレーションを矢印で繋いでいきます。Neo4jは有向グラフなので、矢印の向きも注意する必要があります。実際の検索結果を描画してみると以下のようになりました。赤が起点となるキーワードで、ピンクが関連キーワード、緑が知見、青がアドバイザー様です。(上記画像はデモ用に、WHERE句を調整しています)まとめCypherQLの表記方法が最初とっつきにくかったですが、よく見ればクエリがそのままグラフになっていて理解しやすいグラフ構造を実際に可視化してくれるインターフェースは便利。見た目派手でおもしろい。