RDFカレンダー:イベント情報の公開と活用

イベントや会議の開催日や場所などがメタデータとして公開されると、情報の検索や共有・連動が大きく進みます。iCalendarのような広く使われるカレンダー・フォーマットとRDF/RSSを結びつければ、公開イベント情報が様々な形で利用できるだけでなく、これらをそのままPIMツール取り込むことも可能です。この延長線上には、レストランや病院検索といったセマンティック・ウェブの紹介でお馴染みの応用も視野に入ってきます。

This page is an introduction to RDF version of iCalendar. Most parts are written in Japanese, but you'll find a short summary at the beginning of each section.

イベント情報とカレンダー

Most event information is provided via web pages with (X)HTML, from which it is very hard to extract useful data by agents. RDF calendar defines vocabulary to describe event metadata for interoperable, extensible description. Since it is based on iCalendar spec, it is possible to roundtrip between PIM and web metadata.

イベントの情報は様々な形でウェブ上に公開されていますが、多くの場合フォーマットがばらばらで、必要な情報を集めるのはほぼ手作業に頼らざるを得ません。これがメタデータとして一貫した形で提供され、処理が自動化できるようになれば、そのメリットは大きいでしょう。

イベントの情報記述に不可欠な日時、場所といったデータを扱うには、カレンダーアプリケーションの語彙を利用すると都合がよさそうです(Dublin Coreのような汎用語彙でもある程度は可能ですが、情報が少し複雑になると限界があります)。そこで、Outlook、iCal、Mozillaカレンダーから携帯電話搭載のスケジュール帳まで、各種のカレンダー=PIMツール間でデータ交換のために用いられているフォーマットiCalendarRDFで表現しようというのが、RDF Calendarプロジェクトです[RDFCAL]

iCalendar自体がPIM用のフォーマットとして普及しているのだから、イベント情報は直接iCalendarファイルとして公開すれば良さそうなものです。けれどもこれをRDFで表現すれば、さまざまなXML、RDF用のツールが利用できる上に、iCalendarの語彙をRSSなどとともに利用したり、逆にFOAFなど他の語彙を使って多様な情報をカレンダーに組み込むことができます。さらに、時間や場所に関するメタデータは、「ある地域である時間に開いているレストランや病院をエージェントが検索する」といったお馴染みのストーリーに連なり、セマンティック・ウェブに向けた課題を検証するテストケースとも捉えられているのです。

iCalendarの基本構造と語彙

※この節では、RDFカレンダーのベースになるiCalendar仕様の概略を説明します。予備知識はいいからとにかくRDF版を見たいという方は「iCalendarをRDFで表現する」、もっと端的にRSSでイベント語彙を使う方法をまず知りたいという方は「RDFicalの語彙をRSSで使う」のセクションに進んでください。

iCalendar, which is defined by RFC 2445, is a large specification, but the small subset is suffice for a simple event description. This section summarizes the basic structure and vocabulary of iCalendar.

iCalendarは、スケジュール管理に関するさまざまな情報を扱うために、仕様書[RFC2445]が150ページに及ぶ大きな規格となっており、細部まで把握するのは楽ではありません。しかし、一般的なイベント情報を記述するだけなら、その中のいくつかの語彙と構文で概ね用は足りるので、ここでは基本部分に絞ってiCalendarの概要を紹介していきます。

iCalendarオブジェクトとコンポーネント

The base of iCalendar data is the iCalendar object (VCALENDAR), which contains several components such as VEVENT or VTIMEZONE. Each of them starts with BEGIN:name line, and ends with END:name line.

iCalendarは、カレンダー全体をひとつのiCalendarオブジェクトとして構成し、その中にイベント情報などのコンポーネントをいくつか持つという形になっています。iCalendarオブジェクトはVCALENDAR、コンポーネントは例えばイベント情報ならVEVENTという名前が与えられ、それぞれのセクションをBEGIN:END:に名前を続けた行で囲みます。

[例1]

BEGIN:VCALENDAR
...
BEGIN:VEVENT
...
END:VEVENT
...
END:VCALENDAR

iCalendarオブジェクトの中には複数のコンポーネントを埋め込むことができます。VEVENTのほかに、時差情報を示すVTIMEZONE、アラームの設定を示すVALARM、仕事リストにあたるVTODOなどがあります。VEVENTを複数記述し、関連するスケジュールをまとめてひとつのカレンダーで扱うことも可能です。

[例2]

BEGIN:VCALENDAR
...
BEGIN:VEVENT
...
END:VEVENT
BEGIN:VEVENT
...
END:VEVENT
BEGIN:VTIMEZONE
...
END:VTIMEZONE
...
END:VCALENDAR

〔補足〕iCalendarは、それ以前に定義されていたvCalendar[VCAL]を受け継ぐ形で定義されています。オブジェクトやコンポーネントの名前が'V'で始まっているのはその名残(というか互換性のために引き継いだもの)です。vCalendar形式は扱うプロパティが若干少ないものの、基本的にはiCalendarと同じ構造です。ただし、データが7ビットに限られているため、日本語の件名などはQuoted-Printable方式でエンコードされてしまう点が大きく異なります。

iCalendarのプロパティ

The iCalendar object and its components have properties. These are name:value pairs to describe event information such as date-time, location as well as basic calendar data. The mandatory calendar properties are VERSION and PRODID. Among many component properties, DTSTART, DTEND and SUMMARY are common to describe most primitive schedules.

VEVENTなどの各コンポーネントの情報(日時、場所など)は、プロパティとして表現します。また、カレンダー全体に共通する情報のためにVCALENDARもプロパティを持ちます。プロパティ名とその値はコロン(:)でつなぎ、1行で記述します。

VCALENDARプロパティとしては、iCalのバージョンを示すVERSIONと、カレンダーを生成したツールを示すPRODIDの2つが必須です。VEVENTにはたくさんの種類のプロパティがありますが、一般的なイベント記述の基本となるのは開始、終了日時を示すDTSTARTDTENDと、件名に相当するSUMMARYです。

これらを用いて、簡単なイベント情報をiCalendarとして記述してみましょう。

[例3]

BEGIN:VCALENDAR
PRODID:-//kanzaki.com//RDFCal 1.0//EN
VERSION:2.0
BEGIN:VEVENT
DTSTART:20040211T050000Z
DTEND:20040211T070000Z
SUMMARY:オーケストラ・ダスビダーニャ第11回演奏会
END:VEVENT
END:VCALENDAR

いくつかの基本的なポイントだけ、例に沿って整理しておきます。

PRODIDとVERSIONの値
PRODIDの書式は特に定められていませんが、ほかのiCalendarツールと識別できるIDとします。VERSIONは、RFC2445では2.0と定められています。
日時の書式
日時プロパティの値は、ISO8601の完全表記とします。これは例のように年月日を区切り記号なしの8桁の数字で、時分秒をやはり区切りなしの6桁の数字で表記し、'T'でつなぐというものです。W3C-DTFスタイルの2004-02-11という区切記号入りではないので注意が必要です。
基本はUTCで、'Z'を最後に加えて示します(ローカル時刻の記述方法は後述します)。
行の長さと折り返し
プロパティ:値のペアを1行に記述します。長い行(目安として75バイト以上)は改行して、次の行の先頭にスペースもしくはTABを1文字入れることで、行を連続させられます。
改行コード及び文字コード
改行コードは、CR+LFです。
文字コードは基本的にUTF-8です(Content-Typeヘッダでcharsetを指定できることになっていますが、あまりあてにしない方がいいでしょう)。

パラメータと日時/時差情報

The iCalendar properties can have parameters. Time zone information is described with a parameter and VTIMEZONE component.

アメリカのように国内でも時差のある環境では、スケジュールにその情報を加えられないと、予定をうまく共有できません。国際的なイベントや、世界のどこからでもリアルタイムに参加できる電話会議、IRCミーティングなどではなおさらです。また、夏時間を導入している場合、国によってその開始、終了日が違っており、これを確認する手段も必要です。iCalendarには、パラメータとVTIMEZONEコンポーネントを介して、これらを扱う仕組みが組み込まれています。

プロパティのパラメータ

This is an example of iCalendar paramter.

iCalendar仕様では、プロパティの名前と値の間に、セミコロンで区切ったパラメータを置くことができるようになっています。たとえば、件名(SUMMARY)を日本語で記述していることを明示したければ、LANGUAGEパラメータを記述できます。

[例4] SUMMARY;LANGUAGE=ja:オーケストラ・ダスビダーニャ第11回演奏会

時間帯パラメータ

TZID parameter is used with time based properties such as DTSART. This parameter corresponds to the TZID property of the designated VTIMEZONE component.

日時プロパティの時差に関しては、TZIDというパラメータを使って時間帯を示します。この値は、次に述べるVTIMEZONEでの詳細情報と対応を取るための識別子なので、どんな名前を使っても構わないのですが、オルソンのtimezone database[TZLINK]の時間帯名がよく使われるようです(日本ならAsia/Tokyoという具合)。

[例5] DTSTART;TZID=Asia/Tokyo:20040211T140000

TZIDパラメータを加えた時は、コロンのあとの日時表記はローカル時刻になり、最後の'Z'は付けません。iCalendarでは、+0900という形式の時差表記は認められていないので、注意が必要です。

DATE形式の日付

The default value type of DTSART or DTEND is DATE-TIME. If you want to use only date (without time), you can specify DATE parameter.

DTSTARTやDTENDは、通常は日時がセットになったDATE-TIMEという形式で記述します。しかしイベントによっては、時刻情報はあまり必要がなく、日付だけで表記したいこともあります。この場合は、VALUE=DATEパラメータを加えて、8桁の年月日だけをプロパティ値とすることが可能です(この場合、時差は関係ないので'Z'も加えません)。

[例6]

DTSTART;VALUE=DATE:20031105
DTEND;VALUE=DATE:20031109
SUMMARY:学園祭

このとき、DTENDが示す日付は、イベント終了の翌日(non-inclusive end of the event)を意味します。つまり、この例では学園祭は11/5縲鰀11/8に行われるわけです。1日だけのイベントなら、DTENDはDTSTARTの次の日です。DTENDを省略すると、イベントはDTSTARTで示される日の終わりに終了する、すなわち1日だけのイベントとして扱われます。

時間帯に関わらない時刻

If the time value is not UTC (no 'Z' suffix), and no TZID parameter, it is regarded as 'floating' time.

UTCでもなくTZIDパラメータもない時刻は、どの時間帯であっても同じ時刻を示すものと定義されます。例えば「2003年ボジョレーヌーボー解禁」というイベントでDTSTART:20031120T000000と記されていれば、世界のどこでも現地時間の11月20日午前0時解禁であることを意味し、日本がヨーロッパやアメリカに先駆けて新酒を味わうことができるというわけです。

時差情報を記述するVTIMEZONEコンポーネント

VTIME component is used to describe time zone information.

TZIDパラメータで時間帯の名前を示しても、それがUTCとどれだけずれがあるのか、いつが夏時間なのかは分かりません。そこで、カレンダーのコンポーネントのひとつとしてVTIMEZONEを加え、そこにこれらの情報を記述します。VTIMEZONEはやや複雑ですが、基本的にはつぎのようなプロパティとサブコンポーネントで構成されます。

TZID
時間帯の識別名。日時プロパティなどで用いたTZIDパラメータと対応させる。
STANDARD, DAYLIGHT
標準時間と夏時間がいつからいつまでで、それぞれUTCとどれだけの時差があるかを記述します。サブコンポーネントの内部は次のようなプロパティで構成されます(ここで示す意味はSTANDARDの場合で、括弧内がDAYLIGHTに対応します)。
DTSTART, DTEND
標準時間(夏時間)の開始日時と終了日時。ローカル時刻で記述する。
TZOFFSETFROM
標準時間(夏時間)になる「前」には、UTCとどれだけの時差があったか
TZOFFSETTO
標準時間(夏時間)では、UTCとどれだけの時差があるか

日本のように夏時間がない時間帯は、STANDARDサブコンポーネントだけを記述しますが、その場合でもTZOFFSETTOだけでなくDTSTARTとTZOFFSETFROMも必要です。ここでのDTSTARTは過去の適当な日時を、TZOFFSETFROMはTZOFFSETTOと同じ値を記述しておきます(日本標準時は1888年1月1日に始まっているのでこの年でもいいのですが、コンピュータによっては古い日付は処理に問題を来す危険もあるので、1970年など)。例として、Asia/TokyoのVTIMEZONEを書いてみましょう。

[例7]

BEGIN:VTIMEZONE
TZID:Asia/Tokyo
BEGIN:STANDARD
DTSTART:19700101T000000
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
END:STANDARD
END:VTIMEZONE

このコンポーネントをiCalendar内に加えておくことで、イベントの日時を日本時間で表記できるようになります。

iCalendarをRDFで表現する

The structure of iCalendar is not far from subject-predicate-object triple model of RDF. The RDFical is an experiment to map iCalendar spec to RDF.

iCalendarはコンポーネントプロパティ:値で構成されており、RDFとの親和性が高そうだというので、試験的なRDFスキーマ[ICALSCHEMA]の構築が試みられ、その応用に関していろんな議論が進められてきました([TIMBL][SWADSC]など)。このRDF版iCalendarの概要を紹介します(以下、RDF版iCalendarをRDFicalと称します。また本節の例はすべてRDFicalの名前空間をデフォルトにし、rdf:はRDF名前空間にマップしているものとします)

従来このページでは、2002年のモデルによるRDFicalを扱ってきましたが、TabulatorなどのRDFブラウザが2005年版RDFicalをサポートし始めているため、こちらの紹介をメインとします。大きな違いは、日付と時間帯の記述モデルです。〔2008-02-07、2009-02-03記〕

コンポーネントとプロパティによるRDFトリプル

RDFical defines iCalendar object and components as rdfs:Class'es and their components as rdf:Property's. Names are follow RDF convention. To connect Vcalendar and components such as Vevent, the schema defines 'component' property (which is not present in iCalendar spec).

RDFは、リソースを“主語述語目的語”のトリプルで記述します。iCalendarのコンポーネントプロパティ:という組み合わせはちょうどこの形に一致しており、うまい具合に扱えそうです。一般にRDFでは、クラス名は大文字ではじめ、プロパティ名は小文字とする習慣があるので、iCalendarの語彙もそれに従って変換します。

VEVENTコンポーネントのSUMMARYプロパティをRDF/XMLとして記述してみます:

[例8]

<Vevent>
 <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
</Vevent>

これは分かりやすいですね。ここから元のiCalendarを復元するのも簡単です。このRDFは、次のようなグラフを表しています。

[rdf:type=Veventの空白ノード]--summary-->"オーケストラ・ダスビ…"

VCALENDARオブジェクト中のVEVENTなどのコンポーネントを示すのは、少し工夫が必要です。iCalendarでは、後者は前者の中に直接含まれており、両者の関係を示すプロパティがないからです。ここでは、「VCALENDARはコンポーネントとしてVEVENTを持つ」と言いたいわけですから、componentというプロパティを導入してトリプルを組み立てます。

[例9]

<Vcalendar>
 <component>
  <Vevent>
   <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
  </Vevent>
 </component>
</Vcalendar>

[rdf:type=Vcalendarの空白ノード]--component-->[rdf:type=Veventの空白ノード]--summary-->"オーケストラ・ダスビ…"

日時のプロパティ

DTSTART, DTENDなどの日時は、iCalendarではいくつかの記述方法がありますが、2005年版RDFicalでは、直接dtstart、dtendプロパティのリテラル値として、世界標準時による日時を記述します(タイムゾーンをデータ型として記述する案もありますが、コンセンサスが得られていないので、ここでは扱いません)。

[例10a]

<Vevent>
 <dtstart>2004-02-11T05:00:00Z</dtstart>
 <dtend>2004-02-11T07:00:00Z</dtend>
 <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
</Vevent>

形式がDATEであってもDATE-TIMEであっても同じプロパティを用います。時刻表記に時差オフセット(+09:00など)を用いたいところですが、今のところiCalendar仕様との整合性を重視して、これは使わないことになっています。

ここまでの要素をまとめて、[例3]のiCalendarを、RDFで表現してみましょう。

[例15]

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://www.w3.org/2002/12/cal/icaltzd#">
 <Vcalendar>
  <prodid>-//kanzaki.com//RDFCal 1.0//EN</prodid>
  <version>2.0</version>
  <component>
   <Vevent>
    <dtstart>2004-02-11T05:00:00Z</dtstart>
    <dtend>2004-02-11T07:00:00Z</dtend>
    <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
   </Vevent>
  </component>
 </Vcalendar>
</rdf:RDF>

リソースを目的語とするプロパティ

会議などでは主催者(ORGANIZER)や出席者(ATTENDEE)が誰であるかも重要な情報になります。iCalendarではこれらを基本的にメールアドレスで表現し、パラメータとして氏名などの名称(CN: Common name)を加えます。

[例12] ORGANIZER;CN:オーケストラ・ダスビダーニャ:MAILTO:info@dasubi.org

プロパティ値がせっかくURIになっているので、RDFicalではこれをrdf:resourceで参照し、リソース目的語として扱います。メールアドレスは、iCalendarではCAL-ADDRESS型と定義されているので、calAddressプロパティを用意し、やはりrdf:parseType="Resource"で構造化します。

[例13]

<Vevent>
 ...
 <organizer rdf:parseType="Resource">
  <calAddress rdf:resource="mailto:info@dasubi.org"/>
  <cn>オーケストラ・ダスビダーニャ</cn>
 </organizer>
</Vevent>

出席者も、同様の構文でattendeeプロパティを用いて、メールアドレス(およびCommon Name)を構造化して記述します。

次のセクションは、やや古い2002年モデルを説明するので、RDFicalの主要な語彙まで飛ばして進んで差し支えありません。

2002年のモデル

日時プロパティと構造化 - 2002年モデル

A property with parameters, such as 'dtstart' + 'tzid', is defined as structured composition, with rdf:parseType='Resource' attribute. The property value becomes the value of its 'value type property'.

DTSTART, DTENDなどの日時プロパティはTZIDパラメータを持つことができます。これをRDFでどうやって表現するかはいろいろな方法があり得ますが、RDFicalでは、tzidを“日付プロパティの目的語ノードに対するプロパティ”(2段階の階層構造)として扱っています。実際の日付の値は、デフォルト形式のDATE-TIMEが指定されているものと見なし、dateTimeプロパティを加えてその値とします(これもひとつの習慣として、ハイフンでつないだ名前はハイフンを省いて次の文字を大文字にしています)。日時のフォーマットは、RDFicalではW3CDTFにしたがって変換しています。

[例10]

<Vevent>
 <dtstart rdf:parseType="Resource">
  <tzid>Asia/Tokyo</tzid>
  <dateTime>2004-02-11T14:00:00</dateTime>
 </dtstart>
 <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
</Vevent>

dtstartプロパティ要素の中に直接プロパティ要素を記述することはできない(直接記述すると、プロパティではなく目的語と見なされる=この場合はエラーになる)ので、このdtstart要素をノード(主語リソース)として扱うために、rdf:parseType="Resource"という属性を加えます。

[rdf:type=Veventの空白ノード]--dtstart-->[空白ノード]--tzid-->"Asia/Tokyo";--dateTime-->"2004..."

VTIMEZONEのサブコンポーネント

The standard and daylight subcomponents of VTIMEZONE are defined as propeties rahter than classes.

前セクションでとりあげたiCalendarの要素でもうひとつ「構造化」を必要とするのが、STANDARD、DAYLIGHTというVTIMEZONEのサブコンポーネントです。これらは、その内部にプロパティ要素を含むので、RDFでは上位コンポーネントと同様ノードとして扱う必要があります。しかしiCalendarの構文では、サブコンポーネントはVTIMEZONE内に直接記述されているので、ノードが連続することになってうまく行きません。

RDFicalでは、これらのサブコンポーネントをVTIMEZONEのプロパティとして扱い、やはりrdf:parseType="Resource"属性を用いてその中に直接プロパティを記述できるようにしています。

[例11]

<Vtimezone>
 <tzid>Asia/Tokyo</tzid>
 <standard rdf:parseType="Resource">
  <dtstart rdf:parseType="Resource">
   <dateTime>1970-01-01T00:00:00</dateTime>
  </dtstart>
  <tzoffsetfrom>+0900</tzoffsetfrom>
  <tzoffsetto>+0900</tzoffsetto>
 </standard>
</Vtimezone>

ここまでの要素を使って、ひとまとまりのiCalendarをRDFで表現してみましょう。元になるのは、[例3]をTZIDパラメータでローカル時刻表示としたものに、[例7]の時間帯コンポーネントを加えた次のiCalendarです。

[例14]

BEGIN:VCALENDAR
PRODID:-//kanzaki.com//RDFCal 1.0//EN
VERSION:2.0

BEGIN:VEVENT
DTSTART;TZID=Asia/Tokyo:20040211T140000
DTEND;TZID=Asia/Tokyo:20040211T160000
SUMMARY:オーケストラ・ダスビダーニャ第11回演奏会
END:VEVENT

BEGIN:VTIMEZONE
TZID:Asia/Tokyo
BEGIN:STANDARD
DTSTART:19700101T000000
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
END:STANDARD
END:VTIMEZONE

END:VCALENDAR

これを、ここまでのルールに則ってRDFicalに変換してみます。

[例15]

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://www.w3.org/2002/12/cal/ical#">
 <Vcalendar>
  <prodid>-//kanzaki.com//RDFCal 1.0//EN</prodid>
  <version>2.0</version>
  <component>
   <Vevent>
    <dtstart rdf:parseType="Resource">
     <tzid>Asia/Tokyo</tzid>
     <dateTime>2004-02-11T14:00:00</dateTime>
    </dtstart>
    <dtend rdf:parseType="Resource">
     <tzid>Asia/Tokyo</tzid>
     <dateTime>2004-02-11T16:00:00</dateTime>
    </dtend>
    <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
   </Vevent>
  </component>
  <component>
   <Vtimezone>
    <tzid>Asia/Tokyo</tzid>
    <standard rdf:parseType="Resource">
     <dtstart rdf:parseType="Resource">
      <dateTime>1970-01-01T00:00:00</dateTime>
     </dtstart>
     <tzoffsetfrom>+0900</tzoffsetfrom>
     <tzoffsetto>+0900</tzoffsetto>
    </standard>
   </Vtimezone>
  </component>
 </Vcalendar>
</rdf:RDF>

簡単なRDFicalデータをjavascriptで作成する実験ページも用意しました。

RDFicalをカレンダーとして表示する

SemaviewのフリーソフトeventSherpaは、iCalendarのほかRDFicalデータを直接取り込んでカレンダー表示することができます。

(画面例)eventSherpaはRDFicalを月次、週次などのカレンダーで表示できる

当サイトのRDFicalデータは、スタイルシートを使って疑似カレンダー表示を行っています(XSLTによるRDFical表示例)。また、後で述べるように、XSLT等を使ってRDFicalをiCalendarに変換することで、iCal, Mozilla Calendar, Outlookなどでカレンダーデータを利用できるようになります。

RDFicalの主要な語彙

The RDF schema of iCalendar defines 3 classes and 48 properties (as of 2003-02 version) from some 90 iCalendar terms. The tables shown in this section are subset of RDFical. Each name has a link to XHTML version of RFC 2445.

iCalendarでは、多様なスケジュールを記述するために6つのコンポーネントと50近くのプロパティが定められ、さらに標準パラメータが20、データタイプが14と、たくさんの語彙が定義されています。中には構文が複雑だったり解釈が分かれたりして単純にRDFにマップできないものもあるので、RDFicalではまず一般的なスケジュール記述に必要なサブセットをとり、2003年2月現在のスキーマで3つのクラスと48のプロパティを定義しています。

ここではさらにその中から、シンプルな記述に必要なものに絞って、25の語彙を表にまとめました(クラス、プロパティ名からのリンク先は、RFC2445のそれぞれのセクションをXHTML化したページです)。これらの語彙は、次のXML名前空間に属します。

RDFical(2005年版)名前空間URI
http://www.w3.org/2002/12/cal/icaltzd#
RDFical(2002年版)名前空間URI
http://www.w3.org/2002/12/cal/ical#

2005年のW3C Note[RDFCAL2005]ではもう一つの名前空間http://www.w3.org/2002/12/cal#を導入していますが、実装が伴わず、スキーマも示されていないため、ここでは取り上げません。

RDFicalのクラス

クラスは、VCALENDARオブジェクトとVEVENT、VTIMEZONEコンポーネントの3つだけが定義されています。

RDFicalのクラス
クラス名役割
Vcalendar RDFカレンダー全体を示すクラス。基本的にひとつのRDFファイルにはひとつだけのVcalendarインスタンスを記述する。
Vevent イベント情報を構成するクラス。Vcalendar内に複数記述できる。
Vtimezone 時間帯情報を記述するクラス。Veventでtzidプロパティを使って時間帯付きの日時を記述する場合は、同じファイル内に対応するtzidを記述するVtimezone要素を持つ必要がある。

RDFicalのプロパティ

RDFicalでは、iCalendarでいう「プロパティ」に加え、データタイプ、パラメータ、サブコンポーネントもRDFプロパティとして定義しています。代表的なものを取り上げます。

Vcalendarのプロパティ

コンポーネントではなく、カレンダー全体の属性を示すプロパティです。

RDFicalのカレンダー・プロパティ
プロパティ名役割
prodid カレンダーを生成したツールを示すユニークな識別子。書式はさだめられていないが、FPIなどの仕組みを使うとされている。例えばアップルのiCalなら -//Apple Computer\, Inc//iCal 1.0//EN という具合。必須。
version iCalendarのバージョンを示す。RFC2445で定めるバージョンは2.0(おそらくvCalendar1.0の後継という意味)。必須。
method iCalendarのデータをアプリケーション間でやり取りするための[RFC2446]で定義されるメソッドで、値はPUBLISH、REQUESTなど。必須ではないのだが、なぜかMS OutlookではこのプロパティがないとiCalendarデータをインポートできない。
component VeventなどのコンポーネントをVcalendarと結びつける。iCalendarでは定義されていない、暗黙のプロパティ。

Veventでよく用いられるプロパティ

RDFicalのイベント・プロパティ
プロパティ名役割
dtstart イベントの開始日(時)。RDFicalでの記法はW3C-DTFスタイルだが、時間帯オフセット(+0900など)は用いない。(2002年版では、値は形式を示すdateもしくはdateTimeプロパティと合わせて構造化して記述する。)
dtend イベントの終了日(時)。この日時は、イベントそのものに含まれない(non-inclusive)ことに注意。つまり、2003-10-10に終了するイベントなら、2003-10-11とする。dtendを省略すると、そのイベントはdtstartで示された日の最後に終わるとみなされる。
dtstamp イベント情報を作成した日時。省略しても良いのだが、Outlookのためには必須。
summary イベントの件名に相当する要約。
description summaryよりも詳しいイベントの説明。スケジュールのメモ欄に相当する。
location イベントの開催場所。iCalendarには地理座標を示すためのGEOプロパティもあるが、今のところRDFicalスキーマには含まれていない。
categories イベントのカテゴリ。Outlookでいえば分類項目。この設定にしたがって、公開したカレンダーを分類、提供してくれるサービスもある。
uid イベントなどのコンポーネントをグローバルに特定する識別子。メールのMessage-Idのような形が例に挙げられているが、特に形式に指定はない。オプションなのだが、Outlookのためには必須。
date (2002年版のみ)dtstartなどのプロパティのデータ形式が「DATE」であることを示す。
dateTime (2002年版のみ)dtstartなどのプロパティのデータ形式が「DATE-TIME」であることを示す。通常はこちらがデフォルト。
tzid (2002年版のみ)ローカル時刻表示の場合の時間帯を示すID(パラメータ)。Vtimezoneで記述されるtzidと対応する。

Veventで用いるリソース型プロパティ

RDFicalのリソース型プロパティ
プロパティ名役割
organizer 会議やイベントの主催者。構造化してcalAddressにメールアドレスを記述する
attendee 会議やイベントの出席者。構造化してcalAddressにメールアドレスを記述する
calAddress 主催者や出席者のメールアドレス。rdf:resource属性にmailto:スキームのURIを記述する
cn 主催者や出席者の名前。リテラルで記述する

Vtimezoneで用いるプロパティ

RDFicalの時間帯プロパティ
プロパティ名役割
tzid 時間帯を識別するためのID。形式に指定はないが、Asia/Tokyoというスタイルがよく用いられる。
standard 目的語リソースが標準時間に関するサブコンポーネントであることを示す
daylight 目的語リソースが夏時間に関するサブコンポーネントであることを示す
tzoffsetfrom 現在のサブコンポーネントの時間(標準時間or夏時間)に「移行する前」は、UTCからどれだけ時差があったか。
tzoffsetto 現在のサブコンポーネントの、UTCからの時差。
tzname 時間帯に付けるラベル(JSTなど)。オプション。

ほかにも、繰り返しスケジュールの表現など重要なものがありますが、とりあえず現時点では割愛しておきます。iClarendarの全ての語彙は[RFC2445]を参照してください。

RDFicalの語彙をRSSで使う

The vocabulary of RDFical can be used with RSS. This combination will bring many interesting applications.

RDF版のiCalendarをRSSに組み込めば、イベントのデータを広く公開することができます。RDFicalの語彙を一部借用して、RSSの情報を詳しくするためにも使えるでしょう。イベントカレンダーやコンサートカレンダーがこの形で提供されるようになると、概要をRSSリーダーで見た上で、自分のスケジュールに加えたければiCalendarに変換して(一項目ずつカット&ペーストするのではなく)直接PIMに取り込むといった連携が可能になります。RSSとRDFicalの組み合わせは、ホットな話題です[PLANB]

RSSに単純にイベント情報を加える

A simple way to embed iCalendar vocab in RSS item is to use foaf:topic in order to relate the webpage of the event and the event itself.

RSSは'Site' Summaryなので、イベントを告知しているページをitem要素とし、そこにfoaf:topicでイベントそのもののメタデータを埋め込むのが自然でしょう。以下、foaf:i:をそれぞれFOAF、RDFicalの名前空間とし、RSSの名前空間をデフォルトとして記述します。

[例16]

<item rdf:about="http://www.dasubi.org">
 <title>オーケストラ・ダスビダーニャ第11回演奏会</title>
 <description>ダスビついに5番を! 指揮: 長田 雅人; 
 ショスタコーヴィチ: 「馬あぶ」組曲; 交響曲第5番</description>
 <foaf:topic>
  <i:Vevent>
   <i:dtstart>2004-02-11T05:00:00Z</i:dtstart>
   <i:dtend>2004-02-11T07:00:00Z</i:dtend>
   <i:location>東京芸術劇場大ホール</i:location>
  </i:Vevent>
 </foaf:topic>
</item>

ここでは例を単純化するために日時をUTC表記にしています。tzidプロパティを併記してローカル時刻を記述するには、ファイル内にVtimezone要素も含めて関連づけなければなりません(イベントが日本以外では意味がないなら、tzidなしの時間帯に関わらない時刻でも大きな問題はなさそうですが、エージェントによる自動的な探索のためには、時間帯情報は重要です)。

〔補足〕この場合はdtstartプロパティを構造化する必要はないので、もっとシンプルに<i:dtstart>2004-02-11T05:00:00Z</i:dtstart>と書くこともできそうですが、RDF Calendarプロジェクトでの例がすべて構造化スタイルになっているので、従っておきます。実際は、RDF版カレンダーはプログラムで生成することがほとんどでしょうから、多少複雑でも意味が明確な構造化スタイルの方がより良いとは思いますが。

itemの主語とプロパティの関係〔注意点〕

Note the event and its webpage are different things. If iCalendar property is applied to rss:item directly, a confusion will result.

ここでコードをもっとシンプルにするために、item要素内に直接RDFicalプロパティを記述したくなるかも知れません。

[例17]

<item rdf:about="http://www.dasubi.org">
 <title>オーケストラ・ダスビダーニャ第11回演奏会</title>
 <description>ダスビついに5番を! 指揮: 長田 雅人; 
 ショスタコーヴィチ: 「馬あぶ」組曲; 交響曲第5番</description>
 <i:dtstart>2004-02-11T14:00:00</i:dtstart>
 <i:dtend>2004-02-11T16:00:00</i:dtend>
 <i:location>東京芸術劇場大ホール</i:location>
</item>

ところが、item要素の主語はウェブのページであり、これが「開始日時」や「場所」といったプロパティを持つとなると変な話になります。同様に、dc:dateで日時をitem要素に記述した場合、それは演奏会の日時ではなくてページの(更新)日時と解釈されるべきです。一手間増えますが、やはりきちんとfoaf:topicなどのプロパティを介して、i:Vevent要素をイベントの主語とするべきでしょう。

〔補足〕イベントがitemの主語であればよいわけですが、紹介ページではなくイベント自身にURIを与えるというのは、案外難しい話です(何らかのURNがあれば可能でしょうか)。同様に、人間にURIを与えるのも困難なので、FOAFのfoaf:Person要素は一般にURIを持たず、foaf:mboxプロパティなどによって人物を特定しています。

同じ発想で、簡単にイベント情報をRSSに埋め込もむためのeventモジュール[MODEVENT]というものがあります。

[例18]

<item rdf:about="http://www.dasubi.org">
 <title>オーケストラ・ダスビダーニャ第11回演奏会</title>
 <description>ダスビついに5番を! 指揮: 長田 雅人; 
 ショスタコーヴィチ: 「馬あぶ」組曲; 交響曲第5番</description>
 <ev:startdate>2004-02-11T14:00+09:00</ev:startdate>
 <ev:enddate>2004-02-11T16:00+09:00</ev:enddate>
 <ev:location>東京芸術劇場大ホール</ev:location>
</item>

これを使った情報提供はいくつか試みられていて、それ自体はとても興味深いのですが、上記と同じようにitem要素の主語の問題が残ります。

〔補足〕

eventモジュールについては、これらのプロパティを構造化する改訂案が検討されているようです。

[例19]

<item rdf:about="http://www.dasubi.org">
 ...
 <ev:item>
  <rdf:Description>
   <ev:startdate>2004-02-11T14:00+09:00</ev:startdate>
   <ev:enddate>2004-02-11T16:00+09:00</ev:enddate>
  </rdf:Description>
 </ev:item>
</item>

これならウェブページとイベントが同一視されるという問題はなくなります。ただ、この改訂案ではev:locationプロパティがなくなったり、別の部分でクラスとプロパティが混同されていたりと、いまひとつ信頼感がないので、ここではeventモジュール自体あまり積極的にお薦めしないことにしておきます。

iCalendar対応プログラムとの連動も念頭に置いた記述

In order to make roundtrip between iCalendar and RDFical, necessary components should be embedded in the same RSS file. It is possible to include a complete Vcalendar section independent from the feed section, and to connect each item and corresponding Vevent with rdf:nodeID mechanism.

RSSにこれらRDFicalのプロパティを記述しても、今のところRSSリーダーはその情報を表示してくれない(たぶん)ので、メリットがなかなか実感できないかも知れません。しかし、RSSを経由して見つけたイベント情報を、そのままOutlookやiCalなどのPIMツールに取り込めるとなれば、いろいろな利用方法が考えられます。

RSSからRDFicalのプロパティを抜き出して、それをiCalendarのフォーマットに戻してやるためには、iCalendarとして必要な一通りの情報をRSSのどこかに記述しておかなければなりません。RDFならrdf:resourceあるいはrdf:nodeID属性を使って外のノードを参照できるので、これらを全てitem要素内に詰め込むのではなく、itemVeventを別々に記述することができます。

[例20]

<rdf:RDF xmlns="http://purl.org/rss/1.0/"
 ...>
 <channel ...>
 ...
 </channel>
 ...
 <item rdf:about="http://www.dasubi.org">
  <title>オーケストラ・ダスビダーニャ第11回演奏会</title>
  <description>ダスビついに5番を! 指揮: 長田 雅人; 
  ショスタコーヴィチ: 「馬あぶ」組曲; 交響曲第5番</description>
  <foaf:topic rdf:nodeID="c01"/>
 </item>
 ...
 ...
 <Vcalendar xmlns="http://www.w3.org/2002/12/cal/icaltzd#">
  ...
  <component>
   <Vevent rdf:nodeID="c01">
    <dtstart>2004-02-11T05:00:00Z</dtstart>
    <dtend>2004-02-11T07:00:00Z</dtend>
    <summary>オーケストラ・ダスビダーニャ第11回演奏会</summary>
   </Vevent>
  </component>
  ...
  <component>
   <Vtimezone>
   ...
   </Vtimezone>
  </component>
 </Vcalendar>
</rdf:RDF>

RSSリーダーは普通にitem要素を読めばtitleやdescriptionを表示できます。RDFを収集するエージェントなら、RSSによるページ情報だけでなく、関連するイベントも取り込んでデータベースなどに登録することが可能です。さらに、RSSからiCalendarデータを抽出変換するXSLTは、単独のRDFicalと同様にVcalendar以下のノードを処理するだけでよいことになります。

RDFicalと位置情報

カレンダーにとって位置情報は重要です。iCalendarにはGEOプロパティが用意されていて、緯度・経度データを記述できますが、RDFicalでこれをどう扱うかはまだ確定していません。

現状での応用を位置に関するメタデータとその応用のページにまとめたので、参照してください。

RDFicalとiCalendarの相互変換

There are several tools to convert iCalendar data to RDFical, and vice versa. Some intelligent calendar applications will be able to treat RDFical directly.

RDFカレンダーにiCalendarの語彙を使うのは、お互いのフォーマットを相互に変換し、メタデータの相互運用と拡張性というRDFのメリットと、PIMツール間の標準であるiCalendarのメリットの双方を生かしたいからです。この変換が自動化できれば、セマンティックな公開カレンダー情報と個人の情報管理を、有機的に結びつけることができます。

iCalendarの仕様はそれなりに複雑なため、RDFへの変換は思いのほか面倒ですが、RDF Calendarプロジェクト関連でいくつかのツールが公開されています。iCalendarの全てのコンポーネント、プロパティに対応しているわけではないものの、本稿で取り上げたレベルの実用的な変換には十分です。

iCalendarデータを集積・提供するサービスはいくつかありますが、中でもsemaviewのSherpaFindは、一部のデータをRDFical形式で提供しています。

RDF版からiCalendarへの逆変換は、XSLTを使えるので比較的簡単に試してみることができます。また、RDF Calendarプロジェクトでもツールが公開されています。

iCalendarに変換したデータは、文字コードUTF-8、改行コードCR+LFとしてテキストファイルで保存します。Outlookなら、ファイルメニューの「インポートとエクスポート」を使って、そのデータを丸ごとカレンダーに取り込むことができます。またAppleのiCalやMozillaカレンダーは、このXSLTによる変換版を、オンラインで直接読むことができました。

This site provides a web version of Dan Connolly's ical2rdf.pl. Also, a sample RSS+RDFical file as well as its XSLT converted iCal data available. This XSLT'd iCal can be read by Apple's iCal and Mozilla Calendar directly.

(画面コピー)Apple iCalで、直接オンライン版rdf2icalの変換結果を取り込めた。 (画面コピー)Mozilla Calendarでも、日本語が文字化けすることもなく、時差も含めて正しくスケジュールが表示されている。

参照文献

[RFC2445]
F. Dawson and D. Stenerson, Internet Calendaring and Scheduling Core Object Specification (iCalendar), , Internet Engineering Task Force, Standards Track
<http://www.ietf.org/rfc/rfc2445.txt>
[RFC2446]
S. Silverberg et.al., iCalendar Transport-Independent Interoperability Protocol (iTIP) Scheduling Events, BusyTime, To-dos and Journal Entries, , Internet Engineering Task Force, Standards Track
<http://www.ietf.org/rfc/rfc2445.txt>
[VCAL]
vCalendar - The Electronic Calendaring and Scheduling Exchange Format, , Internet Mail Consortium, Version 1.0
<http://www.imc.org/pdi/vcal-10.txt>
Sources for Time Zone and Daylight Saving Time Data, information on public domain tz database originally created by Arthur Olson in 1994.
<http://www.twinsun.com/tz/tz-link.htm>
[RDFCAL]
Dan Connolly and Libby Miller, RDF Calendar Workspace, , W3C RDF Interest Group, v 1.34
<http://www.w3.org/2002/12/cal/>
[RDFCAL2005]
Dan Connolly and Libby Miller, RDF Calendar - an application of the Resource Description Framework to iCalendar Data, , W3C Interest Group Note
<http://www.w3.org/TR/2005/NOTE-rdfcal-20050929/>
[ICALSCHEMA]
Dan Connolly (and ?), iCalendar RDF Schema, , v 1.126
<http://www.w3.org/2002/12/cal/ical.rdf>
[TIMBL]
Tim Berners-Lee, A quick look at iCalendar, , v 1.43
<http://www.w3.org/2000/01/foo>
[SWADSC]
Libby Miller, SWAD-Europe Deliverable 3.7: Developer Workshop Report 2 - Semantic Web calendaring,
<http://www.w3.org/2001/sw/Europe/reports/dev_workshop_report_2/>
[PLANB]
Libby Miller, Combining foaf, RDFical and geo, and maybe RSS 1.0..., , Plan B (Weblog)
<http://planb.nicecupoftea.org/archives/000074.html>
[XMLCOM]
Leigh Dodds, The RDF Calendar Task Force, , xml.com
<http://www.xml.com/pub/a/2001/07/25/rdfcalendar.html>
[DOCUMENTATION]
RdfCalendarDocumentation, ESW Wiki
<http://esw.w3.org/topic/RdfCalendarDocumentation>
[MODEVENT]
Søren Roug, RDF Site Summary 1.0 Modules: Event, , Draft 0.2
<http://purl.org/rss/1.0/modules/event/>