はじめに
本記事は、ハイパーグラフの考え方をSQLで実現し・操作することを目的に記載しています。まずは、簡単な検索ができるところまで記載します。
ハイパーグラフについての情報は、Google検索しても多くは出てきません。Qiitaでも記事が一つあるだけです。Amazonで検索したところ、和書では壊滅、洋書でも多くはありませんでした。Wikipediaに記事があるようです。
ハイパーグラフ(Wikipedia)を読むと、ハイパーグラフは、グラフ理論を一般化したものらしく、集合論の用語を利用しているとのことです。
私が注目したのは、集合論だったら「SQLで操作できるのではないか」と考えました。
グラフ構造をライブラリで操作するのは、Python製ではNetworkXが有名と思います。データベースとしてはNeo4jが有名です。Neo4jだと独自のクエリ言語(CypherQL)を覚える必要があるという点で、少々の学習コストがかかってしまいます。
なお、SQLで扱うだけなら、ミック氏の書籍で「入れ子集合モデル」等が紹介されています。本記事では、PostgreSQLの配列型を用います。どちらがいいかは評価していません。
PostgreSQLを選んだのは筆者が得意という理由だけです。
データ
利用するデータです。
ノード(内容:コンテンツのタイトル、形式:csv、サイズ:5.3M)
エッジ(内容:コンテンツのタグ、形式:csv、サイズ:158M)
Wikidumpをベースに作成しています。本書執筆者が運用しているサイトで公開しています。無断で商用利用等は構いません。突如、停止したり、消したり、場所を変えたりするかもしれません。
ノードは、Wikipedia記事のタイトルです。
エッジは、Wikipedia記事に含んでいる、他のWikipedia記事へのリンクのアンカーです。
インポート
以下のようなテーブルを作成します。
CREATE TABLE t_wh_contents_title (
id INTEGER
, title TEXT
, PRIMARY KEY(id)
);
CREATE TABLE t_wh_contents_tags (
id INTEGER
, tags TEXT[]
, PRIMARY KEY(id)
);
CREATE INDEX ON t_wh_contents_tags USING GIN (tags);
t_wh_contents_titleにノードのCSVを、t_wh_contents_tagsにエッジのCSVをインポートします。
本旨とは関係ないですが、GINインデックスは、Generalized Inverted Indexの略で汎用転置インデックス、と訳されています。情報検索の世界で多用します。
検索
簡単な検索を行います。私が好きな俳優の「妻夫木聡」さんと女優の「黒木華」さんをキーに検索します。このお二人をエッジとして検索します。
SELECT id, title
FROM t_wh_contents_title
LEFT JOIN t_wh_contents_tags USING(id)
WHERE
ARRAY['妻夫木聡', '黒木華'] <@ tags
;
「<@」は、配列演算子の一つです。
USINGはPostgreSQL独自だったと記憶していますが、idで連結しているだけです。
なお、検索結果は以下のようなものになります。
id title
8147 日本アカデミー賞
8148 ブルーリボン賞 (映画)
44503 山田洋次
107510 金曜ドラマ (TBS)
132490 鶴瓶のスジナシ!
235262 おしゃれイズム
421938 世にも奇妙な物語の放映作品一覧
1986518 あさイチ
2032970 北九州市
2385792 小野寺修二
3493509 第29回東京国際映画祭
3539652 第40回日本アカデミー賞
3763518 ぼぎわんが、来る
4060860 日本のテレビドラマ一覧 (2020年代)
4238953 2021年のテレビドラマ (日本)
4290679 第44回日本アカデミー賞
171948 キネマ旬報
569632 高崎映画祭
740989 ドラマW
862307 エランドール賞
1177970 ヨコハマ映画祭
1747566 A-Studio
1858052 オールナイトニッポンGOLD
1934058 ザテレビジョンドラマアカデミー賞
2913853 第37回日本アカデミー賞
2944911 櫻井・有吉 THE夜会
3211234 バナナマンのせっかくグルメ!!
3395793 2016年のテレビドラマ (日本)
3740167 GALAC
4040477 浅田家!
67309 サントリー
417883 日本映画プロフェッショナル大賞
541839 日刊スポーツ映画大賞・石原裕次郎賞
659548 TAMA CINEMA FORUM
1360378 埼玉県を舞台とした作品一覧
1498861 しゃべくり007
1970520 日本のテレビドラマ一覧 (2010年代)
2868848 小さいおうち
3733730 Template:エランドール賞新人賞
4010370 第71回毎日映画コンクール
4020798 2020年のテレビドラマ (日本)