多言語データセット(DataSets)は「データセット定義ファイル」をオンメモリに展開したものとお考えください。
データセット定義ファイルは、RDFやCSVなど多様なフォーマットで記述されたデータセット本体を、When.exe Ruby版の「イベント機能」でどのように扱うか、データセット本体の各要素と、When.exe Ruby版の「イベント機能」でのロールとの対応関係を定義したCSVファイルです。
CSVをRDFに変換することを目的としたテンプレートと異なり、CSVの要素を表現する“[…]”、RDFの要素を表現する“<…>”、When.exe Ruby版でのロール(=役割)を表現する“{…}”の3者が使い分けられています。
データセット定義ファイルの具体例はA.Datasetをご覧ください。
“#”で始まる行はコメントです。
ただし、ファイル先頭の
# When::Events::DataSets
は、ファイルが When::Events::DataSets 用のデータセット定義ファイルであることを When.exe Ruby版に示すという機能を持っています。
“[カラム番号:カラム名]”はCSVファイルのカラムの内容を表現します。カラム番号とカラム名のうち一方のみでも構いません。
なお本来仕様として完結させるには、地の文字列に“[”や“]”がある場合にはエスケープせねばなりませんが、現在の実装では手を抜いています。 “<”や“>”、“{”や“}”も同様です。これらは、最終的には同字反復(“[”を“[[”で表現するなど)でエスケープすることになるでしょう。
HTMLなどのCSVでもRDFでもないファイルから正規表現のマッチによりイベントを抽出する場合も、CSVファイルに準じてカラム番号を付与して扱います。
“<述語のURI>”はRDFトリプルの当該述語の目的語を表現します。
また、現状未実装ですが、
“<述語AのURI 述語BのURI>”
は、
<リソース1> <述語A> <リソース2> . <リソース2> <述語B> <目的語> .
という関係において、<リソース1>に対応する<目的語>を表現します。 規格上URIやIRIの中に現れることのない“ ”(0x20-空白)を区切り文字として用い、親→子→孫…とたどるわけです。
また、
“<~述語のURI>”
は、
<リソース2> <述語> <リソース1> .
という関係において、<リソース1>に対応する主語<リソース2>を表現します。
“{ロールのURI}”はWhen.exe Ruby版の「イベント機能」でのロールに対応する値を表現します。
データセット定義ファイルの第1カラムが“@言語コード”で終わっている行は、その言語用の一言語データセットで使用するための行であることを示します。
言語指定付きのロールから生成されるRDFトリプルの目的語が文字列を意味する Literal の場合、当該 Literal は指定の言語属性を持ちます(→具体例 japanese-holiday.ttl)。
プレフィクス, 名前空間のURI, 説明
という構成で、プレフィクスと名前空間の対応関係を定義します。
xsd:, http://www.w3.org/2001/XMLSchema rdf:, http://www.w3.org/1999/02/22-rdf-syntax-ns# rdfs:, http://www.w3.org/2000/01/rdf-schema# rdfc:, http://www.w3.org/TR/rdf11-concepts/# dc:, http://purl.org/dc/elements/1.1/ dcq:, http://purl.org/dc/terms/ ts:, http://hosi.org/ts#
と定義されていると、
rdfs:label は
http://www.w3.org/2000/01/rdf-schema#label
と同じ意味になります。
データセット定義ファイルでプレフィクスにどのような文字列を使うかは任意ですが、同一のデータセット定義ファイル中の同じ名前空間に複数のプレフィクスを割り当てないでください。
また、プレフィクス付き表現とプレフィクスなしの展開した表現を混在させないでください。
wikipedia:, https://en.wikipedia.org/wiki/, Wikipedia wikipedia:@*, https://*.wikipedia.org/wiki/, Wikipedia
という定義の“@*” は言語コードのワイルドカードです、この一行で
wikipedia_ja:@ja, https://ja.wikipedia.org/wiki/, ウィキペディア
などを When.exe Ruby版の保持する情報により一括して定義できます。
データセットの名前を定義します。
{rdfs:label}, NDL Digital Collections {rdfs:label}@ja, 国会図書館デジタルコレクション
であれば、データセットの名前は、日本語で「国会図書館デジタルコレクション」、その他の言語で「NDL Digital Collections」です。
データセット本体の所在とその扱い方を示します。
{ts:reference}, http://hosi.org:3030/test/sparql, SPARQL
であれば、エンドポイント http://hosi.org:3030/test/sparql に対して SPARQL query を発行してイベントの情報を取得します。
{ts:reference}, ex:history-events.ttl, RDF
であれば、プレフィクスexを名前空間に変換して得られる URL にある Turtle形式の RDFファイル history-events.ttl を読んでイベントの情報を取得します。
ファイルの形式は拡張子で自動判断します。
{ts:reference}, github:ndl_koyomi.csv, csv without header
であれば、プレフィクスgithubを名前空間に変換して得られる URL にあるヘッダなし CSVファイル ndl_koyomi.csv を読んでイベントの情報を取得します。
{ts:reference}, test-history-events.csv, csv with header
であれば、データセット定義ファイルとおなじ場所にあるヘッダあり CSVファイル test-history-events.csv を読んでイベントの情報を取得します。
{ts:reference}, ex:somewhere,"/正規表現文字列/"
であれば、プレフィクスexを名前空間に変換して得られる URL にあるファイル somewhere を正規表現文字列によりパースしてイベントの情報を取得します。
When.exe Ruby版の「イベント機能」を担当するWebサーバー(http://hosi.org)では、somewhere が article?page=001..123 などのように、数字が“..”(終点を含む)または“...”(終点を含まない)で区切られるパターンでURIが終了している場合、article?page=001 から article?page=123 まで10秒間隔ですべてダウンロードして連結し、データセット本体とします。
{ts:reference}, http://hosi.org/When/TM/CalendarEra/JapanesePrimeMinister, CalendarEra
であれば、When.exe Ruby版内蔵の暦年代 JapanesePrimeMinister から直接イベントの情報を取得します。
When.exe Ruby版としてのロールはありませんが、GUI のイベント画面で「データセット」欄のリンク先が「データセット定義ファイル」自体ですので、 「データセット定義ファイル」に{dc:contributor}・{dcq:license}を記述することで、権利関係を明文化することができます。
これらは「データセット定義ファイル」ではなく「データセット」本体の提供者と権利について記述するようお願いします。
データセット内でイベントをユニークに特定するキー情報です。
例えば、
dcq:, http://purl.org/dc/terms/ ex:, http://example.com/ {rdf:subject}, ex:<ts:id>, dcq:URI
のように定義されていて、データセット本体中のあるイベント情報のトリプルの主語の URI が、
http://example.com/id1
であったとすると、この“http://example.com/id1”をプレフィクス ex を名前空間に変換した“http://example.com/<td:id>”に当てはめて、そのイベントの<ts:id>に“id1”(文字列)を設定します。
データセット本体のイベントに、読み込んだ順に1番から通し番号(整数)を割り当て、そのイベントの<ts:id>とします。
{rdf:subject}はWhen.exe Ruby版「イベント機能」の出力を RDFトリプルで表現する場合、イベント情報のトリプルの主語の URIとして用います。
RDFトリプルで表現する予定がない場合は、必ずしも定義する必要はありません。
データセット本体のイベント情報のトリプルの主語の URI が<rdf:subject>です。
{rdf:subject}, <rdf:subject>, dcq:URI
とあればこの<rdf:subject>がそのまま{rdf:subject}のロールを演じます。
例えば、
dcq:, http://purl.org/dc/terms/ ex:, http://example.com/ {rdf:subject}, ex:<ts:id>, dcq:URI
のように定義されていたとすると、5番目(<ts:id>=5)のイベントの{rdf:subject}は、
http://example.com/5
となります。
なお、現状未実装ですが、CSVの一行で複数の主語のRDFを生成する場合、主語ごとに{rdf:subject}を定義し、それに続く行の主語であることを示します。
イベントの名前を定義します。
{rdfs:label}, [name]
であれば、ヘッダ付きCSVファイルの name カラムの内容をイベントの名前とします。
データセット定義ファイルには、データセットの名前とイベントの名前の両方で{rdfs:label}が使われますが、前者の{rdfs:label}は“[]”“<>”“{}”を何れも含まず、後者の{rdfs:label}は“[]”“<>”“{}”の何れかを必ず含みます。
イベントの内容を“自由記述文”で記述したものとして扱われます。
When.exe Ruby版の「イベント機能」を担当するWebサーバー(http://hosi.org)では、このロールの内容を「事項」欄に表示します。
また、この“自由記述文”中に“{}”で囲われた文字列があった場合、その文字列を完全一致検索の対象となるキーワードとして管理し、マークアップします。
When.exe Ruby版の「イベント機能」でのキーワード完全一致検索用のインデクス作成指示です。
例えば、
{dcq:abstract}, [abstract] {dcq:hasPart}, [abstract]
であれば、ヘッダ付きCSVファイルのabstract カラムの内容を{dcq:abstract}ロールで扱い、かつ、その中の“{}”で囲われた文字列をインデクス対象とします。
{dcq:hasPart}, [title][abstract]
であれば、{dcq:hasPart}は title カラムと abstract カラムを連結した文字列を扱いますので、両者の中の“{}”で囲われた文字列がともにインデクス対象となります。
RDFのグラフ機能に対応するロールです。
When.exe Ruby版の「イベント機能」を担当するWebサーバー(http://hosi.org)では、{ts:group}の内容を「グループ」欄に表示し、{rdfc:section-rdf-graph}のURIにリンクします。
両ロールとも完全一致検索インデクス生成の対象となります。
{rdfc:section-rdf-graph}は、ロールとしてRDFグラフの IRI を保持・管理するために使われるだけですので、出力情報中のトリプルに述語 rdfc:section-rdf-graph が現れることはありません。
イベントがさらに別の参照情報を持つ場合、その参照先を表すロールです。
When.exe Ruby版の「イベント機能」を担当するWebサーバー(http://hosi.org)では、{dc:source}に最大長でマッチする名前空間の説明を「ソース」欄に表示し、{dc:source}のURIにリンクします。
イベントの提供者を表すロールです。
{dc:source}が存在しない場合、When.exe Ruby版の「イベント機能」を担当するWebサーバー(http://hosi.org)は、{dc:contributor}の内容を「ソース」欄に表示します。
完全一致検索インデクス生成の対象となります。
イベントの時間的有効範囲を表すロールです。
{dcq:valid}, [date]
であれば、ヘッダ付きCSVファイルの date カラムの内容を When.when? メソッドで解釈して生成された When::TM::TemporalPosition などのオブジェクトを{dcq:valid}とします。
When.exe Standard Representationは ISO8601 に対して上位互換です。このため、Wikiでは詳しく説明はしていませんが、ISO8601 で規定されている反復表現も記述できるようにしています(→テストコードにみる具体例)。
これを利用して、例えば敬老の日と秋分の日にはさまれた国民の休日を、
R/2003-09-1{SolarTerms#term180-1&TU}T00+09:00...2100
などと表現するなど、複雑な範囲も扱えるようにしています。
反復表現の仕様については、ブログ記事 2015-11-20「日付範囲の仕様(続き)」、2015-11-21「日付表現と反復指定の使用例」、2015-11-23「日付表現中の<指定>と iCalendar」をご覧ください。
When.exe Ruby版の「イベント機能」での時間的範囲順序検索用のインデクス作成指示です。
xsd:, http://www.w3.org/2001/XMLSchema {ts:start}, {dcq:valid}, xsd:integer
であれば、時間以下の桁を考慮せず、日付のみでのインデクスとなります。
{ts:start}, {dcq:valid}, xsd:double
であれば、時間以下の桁を考慮した、日時でのインデクスとなります。ただし、現状の実装では xsd:float と xsd:double に違いはありません。
太陽暦および太陰太陽暦の「月日」部分のみの一致によるインデクス作成指示です。
{ts:whatDay}, {dcq:valid}
であれば、{dcq:valid}ロールのオブジェクトの暦法が太陽暦か太陰太陽暦に応じてインデクスを生成します。
When.exe Ruby版の「イベント機能」を担当するWebサーバー(http://hosi.org)は、このインデクスを用いて day パラメータ(太陽暦用)および lsday パラメータ(太陰太陽暦用)を処理します。
イベントの空間を表すロールです。
{dcq:spatial}, [location]
であれば、ヘッダ付きCSVファイルの location カラムの内容を When.where? メソッドで解釈して生成された When::Coordinates::Spatial などのオブジェクトを{dcq:spatial}とします。
次項の{ts:west}・{ts:south}・{ts:bottom}が何れも存在しない場合は、{dcq:spatial}は完全一致検索インデクス生成の対象となります。
逆に、これらの何れかが存在する場合は、{dcq:spatial}は矩形(あるいは{ts:bottom}があるなら直方体)区間の範囲検索対象となります。
When.exe Ruby版の「イベント機能」での空間的範囲順序検索用のインデクス作成指示です。
xsd:integer を指定することも可能ですが、インデクスが度の桁での切り捨てとなるため、xsd:integer を選択する意味はあまりないでしょう。
その他のイベント要素は When.exe Ruby版でのロールはありませんが、「データセット定義ファイル」に記述することができます。 これらはリポジトリをRDFとして書き出す時に書き出されますので、単にCSVをRDFに変換するためだけに「データセット定義ファイル」を用いるような場合には、意味があります。
イベント要素の各定義行の第3カラムで型指定あるいは変換指示をすることができます。
要素が URI であることを示し、漢字のエスケープを行います。
fusekiサーバーでのグラフ指定は IRI ではなく URI でなければならないようです。
要素が IRI であることを示し、漢字のエスケープを行いません。
dbpedia へのリンクなどで用います。
(IRI にふさわしい名前空間を見つけられなかったので、暫定的に ts:IRI としています)
要素が to_i メソッドで Ingeger 化されることを示します。 時間の precision が“日”の位であることを明示します。
要素が to_f メソッドで Numeric 化されることを示します。 実装上、xsd:float と xsd:double に違いはありません。
“...”部に C言語の strptime 関数に準じた書式でフォーマットを記述することで、文字列を日時化します。
書式についてはブログ記事 2015-12-06「When.strptime などの追加」もご覧ください。
多言語データセットも一言語データセットも repository、event および used_ns というメソッドを持っています。
多言語データセットのこれらのメソッドは、自らが包含する一言語データセットの対応するメソッドを呼び出して得られる結果をマージしたものです。
intersection_events については整合性の問題など検討すべき点があり現状未実装です。