インターネットを通じて得られる歴史的情報は、ひと昔前と比べれば驚くほど増加しています。歴史的人物の生年月日、親族関係、著書、公職など従来の紙で印刷された事典では決して目に触れることのできなかった実に細かな情報を容易に取得することができます。しかし、それらをうまく使いこなすデータ・リテラシーは、もちろん自分も含めて、充分なレベルに達しているとは言えません。つまり、断片的な情報を断片的に得るだけで、それらを自らの視点で組織化・体系化し、そこからなんらかの結論や見解を導き出すというレベルには達していません。今回は、そうした課題を解決する一つの手段として、Mathematica のウィキデータ検索機能を使った歴史的情報の取り扱い例を紹介したいと思います。新しい時代の歴史探索のヒントになれば幸いです。また、前回の Mathematica を使って歴史探索 も併せてご覧ください。
ウィキデータとは、ウィキメディア財団が提供する共同編集型のデータベースです。非常に広範にわたるデータが登録されており、日本語を含む各国言語で利用することができます。 ウィキデータの検索には通常、SPARQL と呼ばれる問い合わせ言語を利用します。SPARQL は、主語・述語・目的語からなるトリプレットと呼ばれる構文を記述することで高度なクエリを構築できるパワフルな言語ですが、アイテム (Wolfram 言語でいうエンティティ) やプロパティを識別子 (Q***, P****) で記述する必要がある点など、 慣れないと難しい点もあります。Mathematica には SPARQL を記述できる関数も用意されていますが、もう少し手軽にウィキデータを活用したい場合は、 WikidataSearch
関数と WikidataData
関数を利用できます。これらの関数を使うことで、Mathematica の操作スタイルでウィキデータのクエリを実行できます。
それでは、WikidataSearch
関数と WikidataData
関数を使ったアイテムとプロパティの操作を通じて、歴史的な情報を様々な側面から検討してみましょう。
Wolfram 言語で言うエンティティ (実体) のことを、ウィキデータではアイテム (項目) といいます。ウィキデータのアイテムを Mathematica に取り込むには WikidataSearch
関数を使います。ウィキデータには日本語で登録されている情報が豊富に登録されているので、多くの場合、引数に日本語が使えます。海外の人名をアルファベットに直す必要がないので、とても便利です。ただし、必ずしもすべてのアイテムやプロパティが日本語化されている訳ではありません。日本語化されていないアイテムやプロパティは、識別子 (Q***
、P***
) で表示されます。必要に応じて Language->"English"
オプションを使って言語を切り替えることができます。
まず、「シェイクスピア」 を検索してみましょう。WikidataSearch[]
と入力して、ダブルクォーテーションで囲った「シェイクスピア」という文字列を入力して Shift + Enter をクリックします。以下のようになります。
「シェイクスピア」で検索すると、このように複数のアイテムが出てきます。アイテム上にカーソルをマウスオーバーするとそれぞれのアイテムの概要が表示されます。それぞれ、小惑星、姓、イングランドの劇作家・詩人、個人名、男性の名前、イギリスの競走馬... といった具合です。この中から「イングランドの劇作家・詩人」である「ウィリアム・シェイクスピア」を採用することにします。
検索で「ウィリアム・シェイクスピア」というアイテムを取得したら、そのアイテムにどのようなプロパティがあるかを調べます。
得られたアイテムをコピーペーストするには、まず、アイテムを選択状態にする必要があります。アイテムの直前にカーソルを置き、マウスを押しながら少し右へカーソルをずらします (アイテムの直後から左へずらしても同じです)。反転表示になったらこのアイテムが選択された状態になりますので、Mathematica のメニュー「編集」 →「コピー」 (または、キーボードの Ctrl + C) を使ってアイテムをコピーしたら、後は「編集」→ 「ペースト」 (または Ctrl + V) で任意の場所に貼り付けます。
「ウィリアム・シェイクスピア」というアイテムには、どのようなプロパティが登録されているかを調べます。WikidataData
の括弧の中に、上記でコピーしたアイテム「ウィリアム・シェイクスピア」をペーストしたら、カンマに続けて、プロパティを取り出すための引数 "NonIdentifierProperties"
を指定します ("Properties"
でも良いですが他のデータベースの ID も多数出力されますので表示が煩雑になります)。入力したら Shift + Enter をクリックします。
「ウィリアム・シェイクスピア」アイテムに登録されている多数のプロパティがリストとして出力されます。画像、出生地、... 父、母、配偶者、性別、・・・。これらを使って情報を引き出します。
「ウィリアム・シェイクスピア」アイテムの 画像を取得するにはどうしたらよいでしょう?WikidataData
関数の第2引数に Wikidata プロパティの1番目に出てくる「画像」プロパティを 使う方法と、直接 "Image"
を指定する方法があります。プロパティの「画像」を使った場合は、その画像の URL が取得されます。
"Image"
を指定すると、ウィリアム・シェイクスピアの画像が直接表示されます。
同様に、別のプロパティを求めてみましょう。「ウィリアム・シェイクスピア」の 「配偶者」 は?
「ウィリアム・シェイクスピア」 の 「子」 は?
「ウィリアム・シェイクスピア」 の 「主要作品」 は?
プロパティをまとめて一覧で得るには "Dataset"
を指定します。
以上は、「アイテム」が分かっている場合の使い方です。逆に、プロパティが分かっていて、アイテムが分かっていない場合はどうしたらよいでしょうか?たとえば、配偶者(妻の名前)が分かっているけど、本人 (夫) の名前が分からない場合。
まず、求めたいアイテムの属する上位概念 (クラス) を調べます。これを求めるには "InstanceOf"
を使います。例えば、「シェイクスピア」 の上位概念は 「ヒト」 です。※ただし、これは必須ではありません。分からない場合は "All"
でも代用できます。
求めたいアイテムの上位概念がわかれば、EntityClass
関数を使って、第1引数にその上位概念(ヒト)、第2引数に条件となるプロパティ(妻の名前)を指定して、未知のアイテムを求めることができます。「配偶者」が「アン・ハサウェイ (シェイクスピア)」である「ヒト」は?
第2引数の条件は、{}
内にカンマで区切ることで複数指定できます。シェイクスピアの作品で、かつ、 1600 年~1620年の間に出版された戯曲を調べたい場合はどうしたらよいでしょうか?まず、前に調べた「ウィリアム・シェイクスピア」の「主要作品」の1つ「オセロ」を使ってその上位概念とプロパティを調べます。「オセロ」は「戯曲」という上位概念に属することがわかります。
「オセロ」 のプロパティを調べると、その中に 「著者」 と「出版日」 があります。
この2つのプロパティ使って、「著者」が「ウィリアム・シェイクスピア」、「出版日」が 1601~1610 年の範囲にある「戯曲」を以下のように指定して取り出します。
シェイクスピアは「リア王」の中で相続問題を取り扱います。リア王は、自分の気に入った子に王国を引継ごうとして悲劇が起こります。
リア 「・・・日頃胸中に潜むわだかまりを晴らしておきたい。地図をくれ。よいか、私は治下の領土を三つに分けた、私の切なる願いは、ほかでもない、国事の煩いや務めを、この老いの肩から振り落とし、次の世の若き力に委ね、身軽になって死への旅路を辿ろう事にある。・・・お前たちのうち、誰が一番この父のことを思うておるか、それが知りたい、最大の贈り物はその者に与えられよう、・・・」 シェイクスピア 『リア王』[第1幕第1場] (河出書房、世界文学全集1シェイクスピア四大傑作集、訳:三神勲)
引継ぎ問題は、人類共通のテーマです。ウィキデータで実際の歴史データを見ていきましょう。
神聖ローマ帝国は、ヨーロッパを中世から近代まで支配してきた王国のひとつです。神聖ローマ帝国の歴代皇帝がどの家系から出ているかをウィキデータで調べます。神聖ローマ帝国では、もともとリウドルフを祖とする家系 (リウドルフィング、ザリエル、ホーエンシュタウフェン) による世襲制がとられていました。しかし、ホーエンシュタウフェン家で男子が途絶えてしまい皇帝のいない大空位時代になってしまいます。その間、オランダやイギリスから「名目上」の皇帝を擁立していましたが、帝国内の領邦を代表する7人の選帝侯の中から選挙で皇帝を決めるよう金印勅書で定めます。諸侯やローマ教皇は強力な君主を望まなかったことから、当時は弱小勢力だったハプスブルク家のルドルフ1世をまず選びました。
カテゴリに分けてカウントするということは、個々の事象のドラマ性は無くなりますが、抽象化された全体像を把握できることになります。「公職」 が 「神聖ローマ皇帝」 である 「人」 の集合をもとめて、それら全ての 「家系」 プロパティを取得します。取得した結果を Counts
関数でカウントし、Sort
関数で並べ替えたあと、BarChart
で横向きにあらわします。
ハプスブルク家が12件、ハプスブルク=ロートリンゲン家が4件という結果が得られました。それぞれの内訳を見てみましょう。抽象化されたデータを復元する作業です。
ハプスブルク家の神聖ローマ皇帝12人の内訳は?
ハプスブルク=ロートリンゲン家の神聖ローマ皇帝4人の内訳は?
ハプスブルグ家は、カール6世の代で男子が途絶えます。後継者にふさわしい人物がマリア・テレジアしかいなかったからです。マリア・テレジアは、ロレーヌ(ロートリンゲン)地方をフランスへ譲渡するのと引き換えに、夫であるロレーヌ公フランツ・シュテファンをフランツ1世として神聖ローマ皇帝とし、ハプスブルク=ロートリンゲン家として家系を存続させました。ハプスブルク=ロートリンゲン家による世襲は、ナポレオンに敗れるまで4代続きます。
政略結婚は、近隣諸国との争いを防ぎ、関係を強化する手段のひとつです。このことをウィキデータで確認してみましょう。
ハプスブルク家出身の「男性」は、どこの家系から多く配偶者を得たか?上位10件を取り出すために Take[ , -10]
を使っています。
逆に、ハプスブルク家の「女性」は、どの家系へ嫁いでいったか?
男女ともに神聖ローマ帝国内の家系 (ヴィッテルスバッハ家とハプスブルグ家) が1位2位を占めていますが、隣接するフランス、イタリア、東欧スラブ諸国にもひろがっているのがわかります。
ところで、神聖ローマ皇帝の権威の正当性を承認するのは、ヴァチカンのローマ教皇です。ローマ教皇の戴冠によって俗なる世界を支配する神聖ローマ皇帝は正当な皇帝として認められることになります。カトリックの聖職者は結婚が認められていないため、ローマ教皇も基本的には投票(コンクラーヴェ)によって決まります。しかし、ルネサンス期には有力な家系によって占められる時期もありました。縁故主義 (ネポティズム) と呼ばれるものです。
ローマ教皇はどの家系からの出身者が多いか?
メディチ家出身が4人で一番多いことがわかります。ちょうどルネサンスの時期です。このうち教皇レオ10世は、サン・ピエトロ大聖堂の改築を前教皇から引継ぎ、ルネサンスの巨匠ミケランジェロやラファエロを支援するなどイタリア・ルネサンスの最盛期を迎えます。しかし、予算がどんどんふくれあがり、資金集めを目的とする贖宥状を乱発し、これが引き金となり、「ルターによる宗教改革」運動が広がってゆきます。メディチ家出身の4人の教皇の内訳は以下のとおりです。
マキアヴェリが 「君主論」 で理想の君主として引き合いに出している 「チェーザレ・ボルジア」 は、ボルジア家出身の教皇 「アレクサンデル6世」 の子です。
ウィキデータで得られた情報をルールのリスト形式、すなわち、 {a -> b, a -> c, a -> d, ... }
の形にすることで、様々なグラフにあらわすことができます。以下に「familyTree
」という関数を作りました。
LayeredGraph
は、v14 で追加された新しい関数です。グラフを作成できる関数は他にもありますが、引数 Left
で左から右への横向きの階層グラフを作成できるので使用しました。NestList
を使います。アウトプットとして欲しい形は 「親 → 子」 の繰り返しです。一方、インプットは 「親」 部分を除外した 「子」 の部分だけを使いたい。まず、NestList[
式, 初期値, 反復回数]
で、式の部分に純関数 WikidataData[#,
子]
を設定して、子の子、子の子の子、... という具合に入れ子が連鎖するようにします。初期値として {"" -> x}
を指定していますが、これは、2 回目以降の処理で常にルールのリスト形式で出力される 「親 → 子」 から Value
すなわち 「子」だけを取り出すために /@ Values /@ #
を指定しているのですが、これを1 回目の処理にも適用させるためのものです。したがって初期値の Key
すなわち ""
の中身は何でも構いません。""
部分がカットされた x 部分が 純関数 [# -> WikidataData[#,
子]
のスロットに代入され、これにより「x → x の子」 が1回目の処理で出力されます。2 回目の処理では、この「x」 をカットした 「x の子」 がスロットに代入され、「x の子 → x の子の子」 が出力されます。以降、指定した反復回数だけ繰り返されます。{}
を平坦化するために Flatten
を使用します。NestList
によって {}
が幾重にもなることで関数が適用されない時につかいます。NestList
によって得られた結果のうち、リスト内の最初の値を除外するために使います。それでは、このようにして作成した familyTree
関数を実際に適用してみましょう。
ハプスブルク家はハンガリーのヤギエウォ朝と、それぞれの息子と娘を互いに婚姻させて同盟を結びます。ウィーン二重結婚です。このうちハンガリー側のラヨシュ2世とマリア・フォン・エスターライヒとの間には残念ながら子供がありませんでした。これによりハプスブルク家のフェルディナント1世がアンナ・ヤギエロの夫であることからハンガリー王となるとともに、15人の子供をもうけました。familyTree
関数でフェルディナント1世の子を1世代取り出すには以下のように指定します。
フェルディナント1世には兄「カール5世」がいます。その子フェリペ2世はスペイン王となり、イベリア半島の勢力を広げてゆきます。カール5世の娘マリア・デ・アプスブルゴは、上記のフェルディナント1世の息子マクシミリアン2世の配偶者となるのでイトコ婚になります。familyTree
関数でカール5世の子を2世代取り出します。
Wikimedia コモンズに公開されている「リウドルフィング家」の家系図を見てみましょう。Wikimedia コモンズの画像を Import
関数で取り込みます。12世紀後半に作成された神聖ローマ帝国ザリエル朝の家系図です。リウドルフィング家の祖「リウドルフ」 (ザクセン公) にはじまり、最下段の左から2人目のホーエンシュタウフェン家の最後の皇帝「フリードリヒ2世」までの世襲による神聖ローマ皇帝のつながりがあらわされています。頭の部分が丸いオレンジ色の四角い帽子をかぶった男性はすべて歴代皇帝 (またはフランス王) です。一番上の「リウドルフ」 から下って上から2つ目の中央は「オットー1世」 (ザクセン公)、上から3つ目の大きい二重丸で囲まれた2人は、「ハインリヒ1世」と妻の「マチルデ」です。
二重丸の男性の方「ハインリヒ1世」からはじめてみましょう。WikidataSearch
で「ハインリヒ1世」を検索すると、同じ名称のアイテムが幾つか出力されますが、この場合は、最初に出てくるアイテム (Henry I the Fowler (Q150620)) を採用します。
ハインリヒ1世の配偶者を求めます。
「Q3555663
」というアイテムは日本語化されていないアイテムです。このような識別子であらわされた内容を確認したい場合は、Language -> "English"
をつけて英語でアイテムを取り出します。ハインリヒ1世には、このように二人の妻がありましたが、この家系図に描かれているのは「リンゲルハイムのマチルデ」との子孫になっています。
WikidataData
関数を使って「リンゲルハイムのマティルデ」 の画像を取り出して、この人物が家系図の絵と一致するのを確認しましょう。
次は、さきほど作成した familyTree
関数を使って「ハインリヒ1世」と「リンゲルハイムのマチルデ」 の子孫を2世代分、階層グラフであらわしてみます。最初の階層には「リウドルフィング家」の家系図に記載されているのと全く同じ、女子を含む5人を取り出すことができました。リウドルフィング家の家系図では、4段目の左から「ハトヴィヒ・フォン・ザクセン」、「ゲルベルガ」、中央が神聖ローマ帝国の初代皇帝「オットー1世」、「ハインリヒ1世」、「ケルン大司教ブルーノ」の順であらわされています。孫の代から下は、家系図では多くの人物が省略されているのがわかります。
「リンゲルハイムのマチルデ」 の娘のひとり「ハトヴィヒ・フォン・ザクセン」について見てみましょう。4段目の一番左の人物です。この人はフランスのユーグ大公の妃となった人で、その子「ユーグ・カペー」は、カペー朝の祖、つまり、フランスの初代国王になります。
WikidataData
関数で「ハトヴィヒ・フォン・ザクセン」 の画像をとりだして、家系図の人物であることを照合します。
WikidataData
関数で「ハトヴィヒ・フォン・ザクセン」 の 「配偶者」 をとりだします。
WikidataData
関数で「ユーグ大公」 の 「子」 をとりだします。「子」には男女の区別はありません。
リウドルフィング家の家系図をもう一度みてみましょう。「ユーグ・カペー」からのびている左端の縦の3人は、上から順に 「ロベール2世」、「アンリ1世」、「フィリップ1世」 というフランス歴代国王になります。「ユーグ・カペー」から3世代下がった家系図をあらわしてみて確認しましょう。リウドルフィング家の家系図では省略されている多くの人物が実際にはこの3代の中に含まれているのを確認できます。
グラフを作成するための関数は LayeredGraph
以外にも幾つかあります。GraphPlot
関数の GraphLayout
に GridEmbedding
を指定すれば、一直線になったグラフを適度に折り返した結果を得られます。
フランスの第4代国王「フィリップ1世」 の父系を4代さかのぼって 「ユーグ大公」 になるのを確認してみましょう。男系のみをとても簡潔に取り出せます。
リウドルフィング家の祖「リウドルフ」からつながる男系のみのラインを見てみましょう。上から6段目の右から3人目の「オットー3世」 までの5世代で途絶えているのがわかります。
「オットー3世」 から父系を5世代さかのぼって家系図と一致するのを確認してみましょう。
分かりやすく家系図に印をつけると以下のようになります。
今度は、リウドルフィング家の家系図の特に中央からやや左寄りの縦のつながりを眺めてみましょう。女性だけのつながりが多いのにお気づきになると思います。家系図の下から3段目、左から4人目の女性は、「アグネス・フォン・ポワトゥー」 です。この母系を5代さかのぼって、「リンゲルハイムのマティルデ」にたどりつくのを確認します。
また、「アグネス・フォン・ポワトゥー」 の左側隣の人物、すなわち、家系図の下から3段目、左から3人目の人物は、「ハインリヒ3世」 です。この人は「アグネス・フォン・ポワトゥー」の配偶者でもあります。「ハインリヒ3世」 の母系を5代さかのぼると、これも同じく「リンゲルハイムのマティルデ」にたどりつくのを確認できます。
この 「ハインリヒ3世」 は、なぜか、家系図の下から3段目、右から3人目としても登場しています。つまり、「ハインリヒ3世」 は母系からも父系からも二重にあらわれているわけです。母系からは、「ゲルベルガ」、「マティルド・ド・フランス」、「ゲルベルガ・フォン・ブルクント」、「ギーゼラ」のラインで5代。父系からはザリエル朝の「コンラート」の妻「リウトガルト・フォン・ザクセン」からのラインで4代。歴代皇帝をあらわすのが目的ならば、ハインリヒ3世は父系でつながっているので、母系は、省略してもいいわけです。この家系図では母系ラインが (2つも!)あらわされています。「ハインリヒ3世」の母系ラインをあえて出している点は、製作者の意図、つまりリウドルフィング家のつながりを強調したかったという思いが感じられます。
分かりやすく家系図に印をつけると以下のようになります。
「ハインリヒ3世」の父系を4代さかのぼると ザリエル朝の「コンラート」 となり、この人は、オットー1世 (初代神聖ローマ皇帝) の娘 「リウトガルト・フォン・ザクセン」 の配偶者になります。
家系図の一番下から2段分は 「ハインリヒ3世」 の子 「ハインリヒ4世」 の娘 「アグネス・フォン・ヴァイプリンゲン」 の代です。その配偶者は 「ホーエンシュタウフェン伯フリードリヒ1世」 であることから、ここからホーエンシュタウフェン朝になります。
リウドルフィング家の家系図の一番下の段の左端にポツんといるのは 「ハインリヒ7世 (ドイツ王)」 です。この人は、父である皇帝「フリードリヒ2世」に謀反を起こし処刑されてしまいます。省略しても良かったのでしょうが記録としては残されています。「フリードリヒ2世」には、もうひとりの子「コンラート4世」が続きますが、戴冠する前に早世し、神聖ローマ帝国は「大空位時代」を迎えます。そして、7選帝侯から選挙で神聖ローマ皇帝が選出される時代に入ります。
以上、ウィキデータを使った検索を通じて、歴史的な情報の骨格ともなる血縁関係のつながりを探索してきました。ヨーロッパの王族は巨大なネットワークとしてとらえることができます。Wikidata には、膨大な情報が登録されています。様々な国と国とのつながりをこうした血縁関係レベルで調べてみるのもおもしろいでしょう。また、男系中心の家系図だけでは見落としてしまいそうな女系のつながりも試してみると意外な発見があるかもしれません。ここで紹介した式を参考にして活用いただければと思います。工夫次第でまだまだ新しい発見に遭遇できると思います。