2021年6月26日土曜日

Neo4jとProlog

Neo4jをご存知だろうか.Neo4jとは,グラフデータベースと呼ばれる種類のデータベースで,データベースに格納される要素,および,要素と要素の関係を,それぞれグラフ理論でいうところのノードとエッジ(アーク)で表現できるというものである.

宣言型プログラミング言語としてのデータベース操作言語

2017年にSocioInfoというイベントでNeo4jに関する勉強会をした.ただし,そこは天邪鬼な私のこと,たんに勉強するだけじゃつまらない.Neo4jで定義されるデータって,それPrologでできるよと.そんな発表をしたのだ.

まあ,この発想は飯尾オリジナルというわけではない.宣言型プログラミングという大きな括りを考えたとき,その代表的事例がPrologであることは間違いないが,SQL,データベース操作の言語も宣言型プログラミング言語の範疇に入れられることがある.SQLを宣言型として扱ってよいなら,Neo4jだって同じようにできるよねえ.という単純な話.

その具体例

ではその実例をみてみよう.Neo4jのデモ,チュートリアルで挙げられている事例は「映画データベース」である.

データ定義のスクリプト(Cypherスクリプト)を読んでみる.

まず,映画(Movie)エントリとして,TheMatrix を作る(CREATE文).続いて人物(Person)として,キアヌやらキャリーやら,どんどん作っていこう.

ひと通り関係者のエントリができたら,関係をまとめて作る.いわく,「(Keanu)-[:ACTED_IN {...}]->(TheMatrix)」などを作っていく.すなわち,「キアヌ・リーブズはマトリックスに出演した」,「アンディ・ワショウスキーはマトリックスを監督した」などの情報を,関係として表現してデータベースに入れていくわけである.

あとは,ひたすらデータを定義していくというスクリプトである.これを,original.cypher というファイル名で保存する.

さて,このスクリプトをNeo4jのシステムに喰わせて「わーいグラフをぐりぐり動かせるぅ」とやるのも一興,ではあるが,天邪鬼氏はひと味違う.いきなり,次のワンライナーで,movie.pl なるPrologプログラムに変換してしまうのだ.

Prologプログラムへ変換

変換の実際は次のとおりである.

このワンライナーの詳細は省略する.※1の時点でスクリプトがどうなっているかというと,次のようになっている.

これは分かりやすいだろう.「(人物)→[関係]→(映画)」というように,関係性の一覧が出来上がっている.

Prologプログラムに変換するには,もうひと手間かける必要がある.この関係,「関係(人物,映画).」と表現を変換すれば,Prologでいうところの述語である.小文字で始めなければいけないなどの細かな文法に注意しつつ,機械的に変換した結果が movie.pl に記録される.

Prologによる探索

次のスライドで「昨日の問題」となっているのは,Neo4jの勉強会でその話題が出たからである.具体的には「TheMatrixを作ったディレクターが作成した映画は何があるか?」を検索せよという問題である.

これは,Neo4jの match コマンドを用いて調べることができる.そして,それはPrologでは「?-」から始まる文法で表現できる.

「?- directed(X, m_TheMatrix), directed(X, Y).」という問合せを行えば,Xにはマトリックスのディレクター,すなわち,p_AndyWとp_LanaWが単一化される.その後,directed(X, Y).の述語においてその両者を順にXに単一化したときに,Yに何があてはまるか?という話になるわけだ.

「write(Y), nl, fail.」はちょっとしたテクニックで,Yを出力して改行し,強制的にfailさせてバックトラック,次の解を探しにいくというプログラムとなる.

0 件のコメント:

コメントを投稿