400 likes | 761 Views
AllegroGraph で作る セマンティック Web アプリケーション. 慶應義塾大学理工学研究科 藤井 遼 roy@ae.keio.ac.jp. 目次. これは誰? これが Franz だ! AllegroGraph 概観 デモ 考察. これは誰?. Who is 藤井 遼 ? ( General). 慶應義塾大学大学院 理工学研究科 開放環境科学専攻 1 年 ただの学生です 専門 機械学習 自然言語処理 データマイニング Not 計算機科学. Who is 藤井 遼 ? (受賞暦 ). 2007 年度
E N D
AllegroGraphで作るセマンティックWebアプリケーション 慶應義塾大学理工学研究科 藤井 遼 roy@ae.keio.ac.jp
目次 • これは誰? • これがFranzだ! • AllegroGraph概観 • デモ • 考察
Who is 藤井 遼?(General) • 慶應義塾大学大学院 理工学研究科 開放環境科学専攻 1年 • ただの学生です • 専門 • 機械学習 • 自然言語処理 • データマイニング • Not計算機科学
Who is 藤井 遼?(受賞暦) • 2007年度 データ解析コンペティション学生部門入賞 • 結果が出てないのに 賞をもらって申し訳ない • しかも何故か事前に設定 されていない賞をもらった
Who is 藤井 遼?(About Lisp) • 第2世代Lisper • 数理システムでアルバイト中 • Lispでコーディング中 • Franz, Inc.に今夏internshipしてきた • 今回の話題
What is“Lisper the Second Generation”? • Lisper, as the child of Lisper • 父親もLisper • ただの造語です • 初めて読んだ「コンピュータの本」がSICP • 授業の宿題から研究用コードまで、ほとんどCL
まとめ:藤井 遼とは • ちょっとLisp環境に恵まれていた • ちょっとLispに詳しい • ただの学生
この発表の内容 • Franz, Inc.でやってきたinternshipの内容をお話したいと思います • AllegroGraphのクールなdemoを作ろう! • Demoの紹介なので、実質は宣伝です
Internship概要 • 期間 • 2008/8/7 ~ 2008/9/22 • 夏休みの間中、ほぼ6週間 • うち、コーディングしてたのはほぼ4週間 • 遊びに行ったところ • San Francisco • Redwood National Park • Google • 仕事ほっぽらかして遊びに行っても大丈夫!(嘘
知られざるFranz, Inc.の実態 • とても静かなオフィスです • というか人が居ない • 自宅で働く人も多いみたい • そこらへんにSymbolicsマシンが転がってる • 初めて見ました
AllegroGraphとは • セマンティックWebアプリケーション • 何億ものtripleを高速に処理 • 便利な機能がいろいろ • ACL/Javaで使える • Allegro Prologによる論理的検索 • もちろん、functionalな検索インターフェイスも
AllegroGraphの機能 • よくあるオントロジとそれにまつわる検索 • 位置関係 • 時間関係 • 社会関係分析 • 継承・同値・逆の関係 • データベースの合併
基本手続きと例(1) • 位置関係(geospatial-reasoning) • 地点(lon,lat)から radius km離れた地点を探せ • Function: (get-triples-haversine-km subtype pred lon lat radius&key …) • 時間関係(temporal-reasoning) • 時点pt1より前の時点pt2 • Functor: (point-before ±pt1 ±pt2) • 社会関係分析(social-network-analysis) • 人物pを含み、互いに知り合いであるグループ(clique)を探す • Function: (cliques p generator…)
基本手続きと例(2) • 継承・同値・逆の関係(rdfs++-reasoning) • subClassOf, inverseOf, etc. • オントロジとのfedereation-triple-storeを作る • Function: (apply-rdfs++-reasoning) • データベースの合併(federation) • 複数のtriple storeを合体して、ひとつのデータベースのごとく扱う • 共有されているweb上のdbを合体させる • Function: (federation-triple-store namestores &key)
おでかけ提案システム • 離れた場所に住んでいる人たちが、映画を見に行く • SNA • 他にも誰か誘える人は居ないか • 彼らが「共通に」楽しむことが出来る映画を推薦 • geospatial • 映画の後に近所の店で飯を食う • temporal • みんなが特定の上映開始時間に集合する • 乗り換え情報 • 個人の予定 • みんなの負担(時間&料金)を平等に! • rfds++ • 「学友」「同僚」の親クラスは「知り合い」 • 映画ジャンルの継承関係?
デモ • うまくいったら貧弱なデモ画面をご覧ください • もしダメだったらバックアップファイルで 雰囲気だけでも • Google Transitに問い合わせるので遅い • さすがに4週間でフルの乗り換えシステムは無理 • 今後直接運行データをクエリする予定
各要素のクエリ • 映画の推薦 • メンバー全員がある程度「好き」なものを探す • メンバーの推薦 • 知り合い関係の中から、映画を「好き」そうな人を探す
映画が「好き」? • 推薦アルゴリズムは? • デモの本質じゃないので突っ込まないでください • 今回は、以下のようにした • 各個人は好きな映画の「属性」をいくつか持つ • 映画がその属性を持てばスコアを+1 • 個人の持つ「属性」は、映画鑑賞履歴から推定する • 「属性」=ジャンル・キーワード • 適当なのは十分承知しています
各要素のクエリ • 映画館の推薦 • 求める映画を上映いる映画館の中から、メンバーの 乗り換え時間・費用の平均・分散が小さいものを選ぶ • 用事があって上映時間に間に合わない場合、 乗り換えコストは無限大とする • レストランの推薦 • 映画ほど嗜好が安定しないので、履歴は無視 • ユーザの要望を全て満たすレストランの中から 地理的条件が良いものを選ぶ
映画から、食事から? • 映画館とレストランは近所だといいな • いい映画館の近所に中華料理屋がなかったら!? • 二つの方策 • movie-first-search • 映画、メンバ、映画館、レストラン、の順に探す • restaurant-first-search • レストラン、映画館、映画、メンバ、の順に探す • 引数の特定度から、「答えが見つかりそう」な方策を選びまずはそれを試す • 片方で失敗したら、もう片方も試す
データベース • 映画 • imdbのサブセット • レビューなど、不要なものは捨てた • 327932本のデータ • うち「上映」されているのは220本 • 映画館 • SF Bay Areaの60箇所
データベース • レストラン • SF Bay Areaの2000店のデータ • 人 • 2000人 • 約30人ほどの知人 • 映画鑑賞履歴 • 趣味 • 「実はあいつ嫌い」 • 架空データ
人間関係捏造の涙ぐましい努力 • 鑑賞履歴がランダムだと、友達と趣味が合わない! • つまりメンバ推薦不能 • でも普通、友達って趣味が合うから友達のはずなんだが • 以下のように人間達を創る • 人間の群れを作る • 学校・会社・サークル等の小グループに分ける • グループ内はclique、そして共通の興味を持つ • 映画鑑賞は興味にバイアスを受ける • ただし、一人の人間は複数のグループに属す • 映画推薦に興味を使わないことでリアリティを保つ
性能 • デモ用のクエリ一回につき • 答えが見つからないことはまずない • 計算にかかる時間は最悪でも10sec以下 • 残りは全部Google Transitへの問い合わせ(笑) • 乗り換えの概算をdbに入れたりしてこれでも早くなった • 最適解(?)は保証されない • beam-searchしているため • 乗り換えと好み、どちらが大事か決められない • triple-storeのサイズ • (triple-count) => 20,473,486
メリットとデメリット • セマンティックWebを使うメリット・デメリット • ここでの「セマンティックWeb」は、 tripleで表現されてRDFで共有できるようなデータ構築方法を指す • セマンティックWebアプリの中でも、AllegroGraphを使って作るメリット・デメリット • AllegroGraph以外使ったこと無いので、 比較論では無いことをご容赦ください • 「デメリット」というよりは、「解決すべき課題」
セマンティックWebのメリット(1) • データ共有、外部データの利用が容易 • RDF • きちんとした仕様 • 述語に関する演算 • subClassOf, sameAs, etc. • 直感的に分かりやすい
セマンティックWebのメリット(2) • RDBMとの比較 • テーブルという構造単位が無い • 行(属性)毎のデータ型定義は無い • 標準形への分割の必要が無い • プロトタイピングに強い • データの定義がプログラムで宣言的に表れない • 脳内定義だから修正が楽 • あとで宣言的に書けるマクロを被せればいい • 修正中にテスト用データを作り直す必要が無い • 属性を自在に足したり引いたりできる
(defun make-random-person (gender age-mean) (destructuring-bind (first middle last) (make-person-name gender) (with-blank-nodes (person) (add-triple person !rdf:type !foaf:Person) (add-triple person !foaf:firstName (resource-symbol first "ex")) (add-triple person !foaf:middleName (resource-symbol middle "ex")) (add-triple person !foaf:lastName (resource-symbol last "ex")) (add-triple person !foaf:gender (resource-symbol gender "foaf")) (add-triple person !foaf:age (value->upi (+ (random 10) age-mean) :int)) セマンティックWebのメリット(3) 住所・今日の予定を足したいな… (iterate-cursor (triple (get-triple :p !rdf:type :o !foaf:Person)) (let ((person (subject triple))) ;; geo (multiple-value-bind (lat lon city) (make-random-latlon) (add-triple person !g:isAt (longitude-latitude->upi *default-striping* lon lat)) (add-triple person !ex:nearestCity city)) ;; temporal (multiple-value-bind (start-time-string end-time-string) (make-random-booking) (with-blank-nodes (start end interval) (add-triple start !t:time (date-string-to-upi start-time-string)) (add-triple end !t:time (date-string-to-upi end-time-string)) (add-triple interval !t:startpoint start) (add-triple interval !t:endpoint end) (add-triple person !ex:booked interval))) person))) 既存のクエリの変更は不要 すぐに新しいクエリを作れる 足したコードを既存のpersonに 対してtop-levelで実行すれば テストデータの修正も出来る
セマンティックWebのデメリット • 共有されているデータが無い • 公開されているオントロジはあまり多くない • 無料で、となると更に少ない • 多くの企業は、情報を秘密にしておくほうが自身の利益になると信じている • メリットがお題目になっている • 活発に研究がなされている • 技術的に枯れていない • 仕様が変更される可能性
AllegroGraphのメリット(1) • Lispで使える • Javaでも使える • 検索言語としてのProlog • 書き方間違えると凄く遅いので注意 • 検索言語としてのSPARQL • 使ったこと無いので分かりません><
AllegroGraphのメリット(2) • 実用に耐える高速な検索 • 実用的なプリミティブ • Geospatial • Temporal • SNA • RDF++,OWL
AllegroGraphのメリット(3) • プライマリキーは(明示的には)要らない • 「ノード」はオブジェクトとして扱える • blank-node • make-instanceに初期値をkeywordで渡すより、 個人的にはコードの視覚的圧迫が少なくて好き • 外部とコミュニケーションする際は、 あったほうがいい場合も(後述)
AllegroGraphのデメリット(1) • まだ活発に開発中 • 仕様が変わるかも • 2.0から3.0への移行時の変更例 ;; in AllegroGraph 2.x ;; グローバル変数 *use-reasoner* の値でreasonerを使うかを判断 (setf *use-reasoner* t) ;; in AllegroGraph 3.x ;; reasonerはtriple-storeオブジェクトの「中」に含まれる ;; reasonerを使えるdbを返す新たな関数が定義された (apply-rdfs++-reasoner) (apply-rdfs++-reasoner my-db)
AllegroGraphのデメリット(2) • federationに関する課題 • 2つのDBを合併し、その間に関係を足す場合 • 挿入と検索を交互にやると遅い • federation-triple-storeには直接add-triple出来ない • blank-nodeをキーに出来ない 「あるtheater」で「あるfilm」が 「何時から何時まで」上映されるか、 Scheduleを投入したいのだけど…? movie federation film(imdb) theater
まとめ • RDBMSで開発するなんてやめよう • 直感的なモデルで開発するほうが楽しいし • triple-storeの方がなんかLispっぽい • Lisperが実世界を相手に大規模な開発を するなら、AllegroGraphをご検討ください