FOAF:メタデータによる知人ネットワークの表現

FOAFはRDF/XMLを使って人々に関する情報(メタデータ)とそのつながりを公開、共有するための半ば実用的、半ば実験(少し遊び)的なプロジェクトです。FOAFを使ってマシンにも扱える自己紹介を記述したり、人や組織、関心領域のネットワーク情報をエージェントに処理させるといった応用が試みられており、RSSとの関連でウェブログなどでも注目され始めています。

※『RDF/OWL入門』、『セマンティックHTML/XHTML』を上梓しました。

FOAFとは

FOAF (Friend of a Friend)とは、その名のとおり友達の友達の友達…という連鎖をメタデータとして表現することで、ネットワーク上の興味深い属性や関係を、エージェントを用いて分析できるようにする試みです[FOAF-PROJ]。これは、RDFの可能性を追求しようという実験[RDFWeb]の基本ツールとして生まれたもの。ベースは人とそのつながりを表現する仕組みですが、それぞれの人の写真や関心、所属組織といった属性情報を合わせて記述していくことで、人を媒介に世の中の様々なものごとの相互関連を辿り、分析したり表現したりするという応用を目指しています。

FOAFは、名前、関心領域、ホームページなどといった、人を描写するための様々な語彙を定義しています。これらは、RDFWebの様々なプロジェクトで用いられているだけでなく、人間系の情報を記述する共通語彙として、RSSなどのほかのRDF/XMLデータで利用することも可能です。また、個人の情報を扱うFOAFは、情報の信頼性や電子署名といった面での検討も行われており、セマンティック・ウェブの実現に不可欠な「信頼性のウェブ」の興味深い実験の場でもあります。

〔補足〕スタンレー・ミルグラムの1967年の研究[MILGRAM]によれば、平均6人の知人を辿れば、米国内の未知の人がつながってしまうというわけですから、「友達の友達」は思っている以上に強力なネットワークかも知れません([KLEINBERG][MAYFIELD]も参照)。

FOAFを使った人物情報の記述

FOAFはごく普通のRDF/XMLを用いて人の情報を表現します。対象となる人物をfoaf:Personという要素で表し、その名前、所属といった属性をプロパティ要素としてサンドイッチ型に記述していくだけです。

メールボックスによる個人の識別

通常のRDFでは、記述するリソースを識別するためにrdf:about(あるいはrdf:ID属性)で主語を指定しますが、人物をグローバルに特定できる一般的なURIは今のところ存在しません。そこで、FOAFではfoaf:Personのプロパティとしてそのメールアドレスであるfoaf:mboxを記述し、このURIによって人物を特定するという方法をとっています。

[例1]

<rdf:RDF ...>
 <foaf:Person>
  <foaf:mbox rdf:resource="mailto:webmaster@kanzaki.com"/>
  <foaf:name>神崎正英</foaf:name>
  <foaf:homepage rdf:resource="http://www.kanzaki.com/"/>
 </foaf:Person>
</rdf:RDF>

この例では、「webmaster@kanzaki.comというメールアドレスを持つ人物は、氏名が神崎正英で、ホームページをhttp://www.kanzaki.com/に持っている」という情報がFOAFの語彙によって記述されています。

(図)rdf:typeがfoaf:Personである匿名ノードから、foaf:name, foaf:homepage, foaf:mboxという3つのアークが伸びる

ここで大切なのは、webmaster@kanzaki.comというメールアドレスによってこの人物が唯一に特定できるということです。このように、その値によって主語を特定できるプロパティはInverse Functional Property(逆関数プロパティ=IFP)と呼ばれ、一種のIDのような働きをします。〔注意〕したがって、foaf:mboxには、家族で共有しているようなメールボックスを使うことはできません。また、この値はURIとして記述するので、単なるメールアドレスではなく、mailto:を最初に加えなければならない点にも注意してください。

FOAFでは、メールボックス(foaf:mbox)、名前(foaf:name)、ホームページ(foaf:homepage)以外にも人物を表現するためのさまざまなプロパティが定義されており、これらを用いてエージェントが処理可能な自己紹介ドキュメントを作成することができます。具体的なプロパティは、後ほど「FOAFの語彙一覧」として紹介します。

IFPとしてのホームページ

その人だけが持っているURIという意味では、ホームページ(foaf:homepage)やウェブログ(foaf:weblog)のURIも同じことですから、これらもIFPとして用いることができます。実際、メールアドレスは不用意に公開するとSPAMの標的になるなの問題があります(メールボックスURIをハッシュ化するfoaf:mbox_sha1sumという方法も考えられました)が、ホームページなら公開することが前提なので、IDとしてより利用しやすいURIといえます。

知人の記述によるメタデータの連鎖

FOAFのプロパティの中でももっとも特徴的なのがfoaf:knowsです。「知人」という関係で、人々(foaf:Person)をつないでいきます。まさにfriend of a friendです。

[例3]

<rdf:RDF ...>
 <foaf:Person>
  <foaf:homepage rdf:resource="http://www.kanzaki.com/"/>
  <foaf:knows>
   <foaf:Person>
    <foaf:homepage rdf:resource="http://example.org/person_b/"/>
    <foaf:name>(知人の名前)</foaf:name>
   </foaf:Person>
  </foaf:knows>
 </foaf:Person>
</rdf:RDF>

ここでは、「http://www.kanzaki.com/というホームページを持つ人物(A)は、http://example.org/person_b/というホームページをもつ人物(B)を知っている」ということが述べられ、両者が知人の関係であることが示されます。人物(B)のFOAFに、同じような形で人物(C)を知っていることが記述されていれば、エージェントは収集してきたFOAFのデータから、A-B-Cという知人関係を理解することができ、知人のネットワークを描いてみせることができるようになります。

〔補足〕foaf:knowsは、相互に知り合いであることは示しませんつまり、A foaf:knows B ⇔ B foaf:knows A が成り立つ、対称型のプロパティです(オントロジーでは、こういう性質を持つプロパティをSymmetricPropertyと呼んでいます)。

〔個人情報に関する補足〕foaf:knowsは他の人の情報を公開するものであるということは、きちんと認識しておきましょう。断り無く氏名などを公開されるのは嬉しくない人もいるかも知れません(ただしFOAFでは、メールボックスあるいはそのSHA1ハッシュで識別できれば、ニックネームだけでもOK)。また、交友関係を公にされたくない場合もあるかも知れません。(X)HTMLで知人のホームページにリンクするのと同様の配慮があればよいと思いますが、エージェントが自動的に収集できるメタデータの場合、こうした関連情報は思わぬ影響を及ぼすことがあります。FOAFと情報の信頼性のセクション、およびrdfwebメーリングリストの[Turner]から始まるスレッドも参照してください。

知人のFOAFファイルはどこ?

[例3]のFOAFデータだけでは、エージェントは人物(B)のFOAFファイルがどこにあるかを知ることはできず、A-Bから先の知人ネットワークを把握することはできません。FOAFの仕組みでは、この人物(B)のFOAFファイルを示す手段として、RDFスキーマのプロパティであるrdfs:seeAlsoを用います。

[例4]

<rdf:RDF ...>
 <foaf:Person>
  <foaf:homepage rdf:resource="http://www.kanzaki.com/"/>
  <foaf:knows>
   <foaf:Person>
    <foaf:homepage rdf:resource="http://example.org/person_b/"/>
    <rdfs:seeAlso rdf:resource="http://example.org/person_b/foaf.rdf"/>
   </foaf:Person>
  </foaf:knows>
 </foaf:Person>
</rdf:RDF>

このrdfs:seeAlsoの値によって、エージェントは人物(B)のFOAFファイルのURIを知ることができます(少なくとも、RDFを理解できるエージェントなら、そこに関連する情報があることは分かります)。人物(B)のFOAFファイルで、人物(C)のFOAFをrdfs:seeAlsoで示していれば、さらにその先のネットワークを辿っていくことができるわけです。rdfs:seeAlsoは、FOAFにおける“ハイパーリンク機能”と考えてもよいでしょう。

もっとシンプルな方法―FOAFを人のURIにする

IFPを用いたりseeAlsoでFOAFファイルを別途指定するのは、人を表すURIがなく、FOAFファイルのURIは人のURIとは全く別であることから来ているわけですが、FOAFファイル内のPersonにIDを与えておけば、FOAFのURI+'#'+IDというURIでその人を識別できるようになります。

[例4b]

<rdf:RDF ...>
 <foaf:Person rdf:ID="me">
  <foaf:homepage rdf:resource="http://www.kanzaki.com/"/>
  <foaf:knows>
   <foaf:Person rdf:about="http://example.org/person_b/foaf.rdf#me"/>
  </foaf:knows>
 </foaf:Person>
</rdf:RDF>

このURIによって、人物が識別できると同時にそのFOAFファイルをも取得できます(フラグメント識別子は、リソース取得時には切り落とされます)。URI(特にhttp:スキームの場合)の持つ、「識別」と「リソースの取得」という2つの側面を利用した、扱いやすい人物URIというわけです。

FOAFの語彙一覧

FOAFでは、人物とそのつながりを表現するために、(遊び半分みたいなものも含め)さまざまな語彙が定義されています。FOAFの語彙定義文書[FOAF-VOCAB]において示されている語彙を、いくつかのグループに分けて紹介してみましょう。よく使われているプロパティとしては、これまでの例でとりあげた以外では、foaf:nick 、foaf:depiction、foaf:interest、foaf:schoolHomepageなどがあります。

FOAFの基本クラス

FOAFで記述する対称(リソース)のタイプとして、次の基本クラスが定められています。foaf:Person以外は、FOAF文書で直接使うことはほとんどありませんでしたが、FOAFの応用範囲が拡がるにつれ、さまざまなリソースを記述するためにほかのクラスも用いられはじめました。(2005-07の改訂で、FOAFのクラスは全てowl:Classとして定義されました)

FOAFで定義されている基本クラス一覧
Class namecomment
foaf:Agent エージェント(人間、グループ、ソフトウェア、人工物など)
foaf:Person 人物。存命中、故人、あるいは想像上の人物であっても、「人」ならばこのクラスメンバーとしてよい。foaf:Agentのサブクラス
foaf:Organization 組織。会社、協会など、社会的なfoaf:Agentをあらわす
foaf:Group グループ。個々のfoaf:Agentの集合体で、それ自身もfoaf:Agentとみなすことができる
foaf:Project プロジェクト。公式なプロジェクトであっても、個人的なものでもよい
foaf:Document 文書。広い意味での文書で、画像(foaf:Image)も文書のサブクラスとして捉える
foaf:Image 画像(ファイル)。foaf:Documentのサブクラスとしての画像で、JPEG、PNG、SVGなどのデジタル画像、写真が代表的
foaf:PersonalProfileDocument ある人物が自分自身について記述するRDF文書。つまり、その文書の作者(foaf:maker)と主内容(foaf:primaryTopic)の両方が同じである文書で、FOAF文書がその代表例

foaf:Group, foaf:Agentは2003年7月に追加されたクラス。foaf:Agentはfoaf:Pesron, foaf:Organization, foaf:Groupのスーパークラスになっています。foaf:PersonalProfileDocumentは2004年3月に追加されました。

追加定義されたアカウント関連クラス
Class namecomment
foaf:OnlineAccount オンライン・アカウント一般。ある提供者によってある利用者(foaf:Agent)が受けるオンラインサービスを規定するもの
foaf:OnlineGamingAccount オンラインゲームのアカウント。OnlineAccountのサブクラス
foaf:OnlineEcommerceAccount オンラインショップなどのアカウント。OnlineAccountのサブクラス
foaf:OnlineChatAccount オンラインチャットのアカウント。OnlineAccountのサブクラス

2003-08-16にオンライン・アカウントを表現するためのクラスが追加されました。

個人を特定、識別するプロパティ

FOAFは基本的に人物についてのメタデータを表現する語彙ですから、まずその人物が誰であるかを示すプロパティが必要です。foaf:mbox(およびその暗号化版であるfoaf:mbox_sha1sum)は、オントロジーでいうInverseFunctionalPropertyで、この値から主語である人物を一意に特定できるIDの役割を持ちます。

FOAFのID/名前付けプロパティ一覧
Property namecommentdomainrangetype
foaf:mbox 特定の所有者に結び付けられたインターネットメールボックスで、IDとして機能する。家族などと共有していないことはもちろん、将来にわたっても別の人が利用することのないアカウント。mailto:で始めるURIfoaf:Agentowl:ThingOI
foaf:mbox_sha1sum この人のメールボックスのSHA1ハッシュ値。IDとして機能する。こちらはリテラルfoaf:Agentrdfs:LiteralD
foaf:name 名前(人に限らず使える)owl:Thingrdfs:LiteralD
foaf:givenName 姓名の「名」。foaf:firstNameと同じ--D
foaf:familyName 姓名の「姓」。foaf:surnameと同じfoaf:Personrdfs:LiteralD
foaf:firstName 姓名の「名」foaf:Personrdfs:LiteralD
foaf:surname 姓名の「姓」。名字foaf:Personrdfs:LiteralD
foaf:nick ニックネーム。IRCやオンラインサービスでの「ハンドル名」やログイン名など--D
foaf:title 敬称(Mr, Mrs, Ms, Dr. etc)--D
foaf:gender 性別。通常の値はmaleもしくはfemaleではあるものの、それには限定されない。また、性別が常に生物学的に決まるとも限らない(ロボットに性別を与えても構わない)。ある一時点では主語Agentは1つのfoaf:genderの値しか持つことができないが、恒久的に同じ値という制約はないfoaf:Agentrdfs:LiteralDF
foaf:aimChatID AIMチャットのIDfoaf:Agentrdfs:LiteralDI
foaf:msnChatID MSNチャットのIDfoaf:Agentrdfs:LiteralDI
foaf:jabberID XMLプロトコル(XMPP)を使ったオープンIMシステム[Jabber]のIDfoaf:Agentrdfs:LiteralDI
foaf:icqChatID ICQチャットのIDfoaf:Agentrdfs:LiteralDI
foaf:yahooChatID yahoo!チャットのIDfoaf:Agentrdfs:LiteralDI

type欄のODFIはそれぞれowl:ObjectoPropertyowl:DatatypePropertyowl:FunctionalPropertyowl:InverseFunctionalPropertyであることを表します。

foaf:mboxは要するにメールアドレスですが、最初にmailto:を加え、URIをrdf:resource属性値として示さなければなりません。それ以外のプロパティの目的語は、基本的にリテラルとしてプロパティ要素の内容になります。

〔注意〕FOAFにおいてfoaf:nameは必須ではありませんので、本名を伏せたい時は、foaf:nickのみにしておく手もあります(foaf:nameの使い方に厳密な制約はありませんが、これをfoaf:nickと混用しない方がいいように思います)。なお、英文と漢字など複数の表記がある場合は、それらを併記し、xml:langで区別するのが良さそうです。名前に関しては、言語によって姓名の順序や構成要素が異なるなど話が複雑なので、いろいろな議論のテーマになっています[FOAF-NAME]

2003年7月6日付のスキーマでは、foaf:aimChatIDfoaf:msnChatIDfoaf:jabberIDfoaf:icqChatIDfoaf:yahooChatIDfoaf:nickのサブプロパティと定義されました(さらにInverseFunctionalPropertyでもあります)。また、foaf:namerdfs:labelのサブクラスになっています。

2003年9月11日付でfoaf:genderプロパティが追加されました。一応人間の男女(male,female)を念頭に置いていますが、ロボットに性別を与えてもいいし、男女以外の性別もあり得ると、リベラルな立場に立っています。functionalPropertyとして定義されているので、複数の性別を持つことはできません。

2009年12月15日付スキーマ改訂で、foaf:family_name、foaf:givennameは"archaic"とされ、それぞれfoaf:familyName、foaf:givenNameに置き換えられました。

個人を直接記述するプロパティ

人となりを示すために、いくつかのプロパティが用意されています。写真はfoaf:imgよりもfoaf:depictionを使って示すことが多いようです(foaf:imgfoaf:depictionのサブプロパティ)。foaf:myersBriggsは比較的最近追加されたプロパティ。foaf:geekcodeなんて、すごいもの定義してますねー。

FOAFの人物描写プロパティ一覧
Property namecommentdomainrangetype
foaf:img この人を示す(ホームページで使うような)画像。foaf:depictionの方が一般的foaf:Personfoaf:ImageO
foaf:myersBriggs この人のMyers Briggs (MBTI)による性格分類コードfoaf:Personrdfs:LiteralD
foaf:geekcode この人の[GEEKCODE]foaf:Personrdfs:LiteralD
foaf:plan この人の'プラン'。UNIXのfingerで使う'.plan'ファイルに準じているらしいので、計画というよりモットーみたいなものか。ほら、よくメールの署名のあとにひとこと書いてる人がいるでしょ。foaf:Personrdfs:LiteralD

個人を別の人やリソースとの関係で描写するプロパティ

人物を描写するプロパティの中でも、ほかのリソース(人)との関連を示すプロパティは、連鎖的な記述で世界をつないでいくRDFの力を発揮します。特にfoaf:knowsは、まさにFOAFのfoafたる所以です。

FOAFの関連リソース描写プロパティ一覧
Property namecommentdomainrangetype
foaf:knows この人を知っている(相互に知り合っているレベル)foaf:Personfoaf:PersonO
foaf:interest この人が関心を持っていることに関するページfoaf:Agentfoaf:DocumentO
foaf:topic_interest この人が関心を持っているトピックfoaf:Agentowl:ThingO
foaf:publications この人の出版、発表物一覧へのリンクfoaf:Personfoaf:DocumentO
foaf:made この人が作ったもの。foaf:makerの逆foaf:Agentowl:ThingO
foaf:schoolHomepage この人の母校のホームページfoaf:Personfoaf:DocumentO
foaf:workplaceHomepage この人の勤務先のホームページfoaf:Personfoaf:DocumentO
foaf:workInfoHomepage この人の仕事の内容を説明しているホームページfoaf:Personfoaf:DocumentO
foaf:currentProject この人が現在手がけているプロジェクト(のページ)foaf:Personowl:ThingO
foaf:pastProject この人が以前手がけたプロジェクト(のページ)foaf:Personowl:ThingO

注意:目的語はURIで名付けられたリソースです

このセクション以降のプロパティはObjectProperty(目的語がURIで名付けられたリソース)となるので、URIをrdf:resource属性値として記述するか、プロパティ要素の内容にノードとなる要素(foaf:Personなど)を記述します。たとえば、foaf:interestプロパティで関心のある事柄を示す場合、次のように書きたくなるかも知れません。

[例6-1](正しくない例)

<foaf:Person>
 <foaf:interest>Semantic Web</foaf:interest>
</foaf:Person>

しかし、残念ながらこれは誤り。foaf:interestは値域(range)がfoaf:Documentなので、オンライン文書(通常はその関心事項が説明されているウェブページ)のURIをrdf:resource属性値として書く必要があります。

[例6-2]

<foaf:Person>
 <foaf:interest rdf:resource="http://www.w3.org/2001/sw/"/>
</foaf:Person>

これはfoaf:currentProjectfoaf:madeなどでも同様です。エージェントが人間向けにレンダリングする時のためには、rdfs:labelあるいはdc:titleといった属性で'Semantic Web'というタイトルを加えておいてもいいでしょう。

その他人物描写で使われるプロパティ

FOAFプロパティの中には、描写対象(domain)を人物に限っていない一般語彙がいくつかありますが、その中で人物表現によく使われるものをまとめました。foaf:homepagefoaf:depictionは多くのFOAFファイルで利用されていると思います。

FOAFの人物描写に使えるその他プロパティ一覧
Property namecommentdomainrangetype
foaf:homepage ホームページがある。pageおよびisPrimaryTopicOfのサブプロパティowl:Thingfoaf:DocumentOI
foaf:weblog ウェブログがある。pageのサブプロパティfoaf:Agentfoaf:DocumentOI
foaf:depiction 対象を描いたもの。写真やイラストなどowl:Thingfoaf:ImageO
foaf:tipjar この人物に対して支払いやお礼をする方法を記述したページ。pageのサブプロパティfoaf:Agentfoaf:DocumentO
foaf:phone 国際識別コードからフルに記述した電話番号のURI。tel:+81-3-3210-1234 など--O
foaf:based_near ○○の近くにいる(ある)ことを示そうという実験的プロパティgeo:SpatialThinggeo:SpatialThingO
foaf:birthday 主語の誕生日。月日のみをmm-ddの形式で記述する。foaf:Agentrdfs:LiteralDF

これらはdomainが人間に限られていないので、会社のホームページとか、会議の様子を写した写真といったものを記述する時にも利用できます。foaf:homepageの定義域は、owl:Thingに拡大されて、基本的に何でも主語にできます。

2003年6月22日付のスキーマでは、foaf:homepagefoaf:weblogfoaf:mboxと同様InverseFunctionalPropertyであると定義されました。つまり、これらもある人物を特定するIDとして機能するもので、家族のホームページとか、グループで共同で書き込んでいるウェブログなどは、このプロパティの値としてはふさわしくないということになります。

2004年3月に、paypal等の「投げ銭」をするためのページを示すfoaf:tipjarが追加されました。このプロパティについては2004-02-13の「ちょっとしたメモ」を参照してください。

2005年3月の議論を踏まえてfoaf:birthdayが加わりました。これまでの経緯を含めた議論のまとめはWikiのBirthdayIssueページを参照してください。

FOAFと位置情報

2003年7月にはfoaf:based_nearというプロパティが追加されました。これは位置メタデータを加えることで、FOAFと現実世界を物理的に結びつけてみる試みです。based_nearについては、位置に関するメタデータとその応用のページの説明を参照してください。

その他リソース一般を記述するプロパティ

その他、人物描写に使った文書、組織、画像などのリソースをより詳しく説明するためのプロパティがいくつか定義されています。

FOAFの一般リソース記述プロパティ一覧
Property namecommentdomainrangetype
foaf:page 主語リソースに関するページ、文書owl:Thingfoaf:DocumentO
foaf:topic 主語ページ、文書のトピック(foaf:pageの逆)foaf:Documentowl:ThingO
foaf:primaryTopic 主語ページ、文書のメインとなるトピック。1つしか持つことができないFunctionlPropertyfoaf:Documentowl:ThingOF
foaf:isPrimaryTopicOf 主語が目的語ページ、文書のメイントピックである。primaryTopicの逆でIFP。pageのサブプロパティでもあるowl:Thingfoaf:DocumentOI
foaf:focus 主題件名などの「概念」に対応する実体。skos:Conceptowl:ThingO
foaf:theme あるリソースのテーマowl:Thingowl:ThingO
foaf:linkedWith 一般的なリンクowl:Thingowl:ThingO
foaf:fundedBy プロジェクトあるいは人物に資金を提供している組織owl:Thingowl:ThingO
foaf:maker このリソースを作った人、グループなど。foaf:madeの逆で、dc:creatorに代わって構造化リソースとしての作者を記述するowl:Thingfoaf:AgentO
foaf:logo ロゴマークowl:Thingowl:ThingOI
foaf:depicts この画像が描写しているもの。foaf:depictionの逆foaf:Imageowl:ThingO
foaf:thumbnail 画像のサムネイルfoaf:Imagefoaf:ImageO
foaf:sha1 ドキュメントのSHA1ハッシュの16進数値(リテラル)foaf:Document-D
foaf:dnaChecksum 何かのDNAのチェックサム(ジョークですが、人を特定するIDというのは、あまり歓迎できない手段も含めさまざまあることを示唆しています)-rdfs:LiteralD

foaf:pagefoaf:topicはちょうど逆の関係にあたります。これらを使うと、ある画像を含むウェブページ、あるいはギャラリーページで取り上げている画像といった関係で画像のメタデータを記述し、文書と関連づけることができます。

2004年3月にはfoaf:primatyTopicが追加され、同時に加わったクラスfoaf:PersonalProfileDocumentとfoaf:makerを組み合わせてFOAFが誰について記述しているのかを示すことができるようになりました。これについてはちょっとしたメモ「FOAFのprimaryTopicとPersonalProfileDocument」を参照してください。

NDLSHのような主題件名は、その名前(件名)を持つ実体を直接表すのではなく、それを件名標目表などの体系の中で表現するための「概念化」として捉えられます。この主題概念と実体を結びつけるfoaf:focusが、2010年8月の改訂で導入されました。

foaf:makerとdc:creator

ドキュメントなどの作者を示すためにはdc:creatorプロパティが広く使われていますが、これが単に作者の名前(文字列)だけを示すのか、あるいはfoaf:Personなどを目的語に使って構造的なリソースとして記述できるのかについては、ずっと議論が続いています。この曖昧さを回避するため、2003年7月にfoaf:makerプロパティが提案され、構造化記述にはこちらを使うことが推奨されました[FOAF-DC]

(例)

<foaf:Document rdf:about="http://kanzaki.com/docs/sw/foaf.html">
 <dc:title>FOAF -- メタデータによる知人ネットワークの表現</dc:title>
 <foaf:maker>
  <foaf:Person>
   <foaf:name>神崎正英</foaf:name>
   <foaf:mbox rdf:resource="mailto:webmaster@kanzaki.com"/>
  </foaf:Person>
 </foaf:maker>
</foaf:Document>

foaf:makerの部分にdc:creatorを使っても誤りではありませんが、このプロパティは作者名を示すために使う方が一般的です。

(例)

<foaf:Document rdf:about="...">
 <dc:title>FOAF -- メタデータによる知人ネットワークの表現</dc:title>
 <dc:creator>神崎正英</dc:creator>
</foaf:Document>

Dublin Coreのプロパティの使い方については、別途議論が進んでいるということです。メモdc:creatorの「内容モデル」も参照してください。

アカウント、グループ関連プロパティ

2003-08-16に、オンライン・アカウントや所属グループを記述するためのプロパティが追加定義されました。

FOAFのアカウント、グループ関連プロパティ一覧
Property namecommentdomainrangetype
foaf:account 主語エージェントがアカウントを保持している(以前のfoaf:holdsAccount) foaf:Agent foaf:OnlineAccount O
foaf:accountServiceHomepage このオンライン・アカウントを提供するサービスのホームページ foaf:OnlineAccount foaf:Document O
foaf:accountName このオンライン・アカウントに結びつけられた名前(識別子) foaf:OnlineAccount rdfs:Literal D
foaf:member 目的語は主語グループのメンバーである foaf:Group foaf:Agent O
foaf:membershipClass 目的語となる人物クラスは主語グループのメンバーである foaf:Group rdfs:Class A

foaf:membershipClassは2005年7月にowl:AnnotationPropertyとされたので、type欄にAと示し、値域と定義域を削除しています(注釈型プロパティは値域、定義域を持つことができない)。この扱いについては、もう少し議論の余地がありそうです。

2009年12月15日付スキーマ改訂で、foaf:holdsAccountは"archaic"とされ、foaf:accountに置き換えられました。

FOAFと情報の信頼性

このセクションは少々複雑なので、はやくFOAFを作って公開したい人は、先に進んで構いません。

電子署名で発信者の信頼性を保証する

FOAFはウェブの分散処理を前提に作られているので、様々な人が自分の知っている範囲の友人関係を記述することで、極めて大きな(理屈の上ではグローバルな)コミュニティに関するRDFの連鎖が構築できることになります。一方、この分散性は、ある人物に関する記述を本人以外でも簡単にできることを意味し、場合によってはいい加減な情報が公開されかねないという問題点も孕んでいます。

こうした情報が信頼できるかどうかを確認する手法としては、電子署名が有効です。FOAF文書のPGP署名を作成し(例えばfoaf.rdf.sigというファイル名で同じディレクトリに保存し)、次のようにしてFOAF文書と結びつけます[FOAF-DSIG]

[例7-1]

<rdf:Description rdf:about="">
 <wot:assurance rdf:resource="foaf.rdf.sig"/>
</rdf:Description>

ここで用いているwot:assuranceは、RDF文書の署名や暗号化を記述して「信頼性のウェブ」(Web of Trust)を表現するために、やはりRDFWebで提案されている語彙[WOT]のひとつで、「デジタルコンテンツの同一性に関する暗号化された証明」と定義されているものです。WOTの語彙を利用するために、最初の名前空間宣言に次の1行を加えておきます。

[例7-2] xmlns:wot="http://xmlns.com/wot/0.1/"

RDFにおいて、rdf:about=""はその文書自身に関する記述を意味するので、[例7-1]はFOAF文書の署名がfoaf.rdf.sigにあるということを示します。署名をチェックするための公開鍵については、このFOAF文書を作成した人物は、最上位階層のfoaf:People要素で記述され、そのメールアドレスがfoaf:mboxで示されているので、Key Serverから公開鍵を取得できるはずだ、という理屈になっているようです。

エージェントがこの理屈を知っていれば、電子署名と公開鍵から、FOAFがそのfoaf:mboxの所有者によって作成され、変更されていないということを確認できるでしょう。この機能を利用するには、少なくとも作者はfoaf:mbox_sha1sumではなくfoaf:mboxでメールボックスを記述している必要があります(SHA1で変換された値からもとのメールアドレスを割り出すことはできません)。もちろん、公開鍵はあらかじめKey Serverに登録しておきます。電子署名は上記の要素を加えてから作成してください。

暗号化して特定メンバーだけに情報を公開する

さらに、特定のメンバーにだけ知らせたいプライベートな情報については、別のFOAFファイル(ここではfoaf-private.rdf)を用意し、それを暗号化(foaf-private.rdf.asc)した上で、次のようにrdf:seeAlsoを用いて参照させるという方法が提案されています[FOAF-ENC]

[例8]

<foaf:Person>
 <!--一般公開してもよい情報は普通に記述-->
 <!--プライベート情報は別ファイルにして暗号化し、以下のように参照する-->
 <rdfs:seeAlso>
  <foaf:Document rdf:about="http://.../foaf-private.rdf.asc">
   <wot:encryptedTo>
    <wot:PubKey wot:hex_id="BB276B88" />
   </wot:encryptedTo>
  </foaf:Document>
 </rdfs:seeAlso>
</foaf:Person>

これはIDがBB276B88である公開鍵を使って暗号化したので、それに対応する秘密鍵を持っているメンバーだけが読めるFOAF文書ということになります。やはりwot:に対応する名前空間宣言が必要です。

FOAFの作成と公開

まずつくってみる

いろんな応用はありますが、細かいことは置いて、自己紹介のつもりでFOAFファイルを作成して公開してみましょう。まず自分のメールボックスとホームページのURI、それにせっかくだからニックネームも。できれば自分の写っている写真を用意すると楽しいです。リンク集のように、ホームページを持っている知人をfoaf:knowsで紹介するのもいいですね。

RDF/XMLを記述するのが難しければ、フォームに必要事項を入力するだけでFOAFファイルを作ってくれる[FOAF-a-matic]などのページを利用すると簡単です(FOAF-a-maticの日本語版ができました)。ファイルは、どんな名前を付けても構いませんが、foaf.rdfとかwebwho.rdfというのが多いみたいです。文字コードは、これもきちんとHTTPヘッダやencoding宣言で明示すれば何でもいいのですが、可能ならUTF-8にしておく方が何かと好都合です。

FOAF自身はスタイル情報のないXMLファイルなので、そのままではブラウザで見ても面白くありませんが、XSLTスタイルシートと組み合わせれば、人間にも分かりやすく視覚表現ができ、そのまま自己紹介ページとして使えます。[FoaF Explorer]では、あなたのFOAFをXSLTによって表示する例を試すことができます。

みんなにお知らせする

FOAFデータがあることを示す方法としては、RSSやDCメタデータの場合と同様、link要素を使って次のように記述する方法が提案されています[FOAF-LINK], [AUTODISCOVERY]

[例9] <link rel="meta" type="application/rdf+xml" title="FOAF" href="foaf.rdf" />

もっとも、今のところメジャーな検索エンジンなどがこれを認識してくれるというわけではないので、効果のほどはあまり期待できません。RDFWebのWiKiには、FOAFを登録するページ[FOAFBB]があります。ここに掲載されると、いろいろなFOAF関連データベースが情報を拾っていってくれるようになるので、こちらを使う方が今の時点では広がりがあると思います。FOAF情報を集めたデータベースの応用として面白いものとしては、SVGを使って友人関係のグラフを示してくれる[FOAFNAUT]などがあります。

やはりRSSなどと同様に、FOAFを用意したらそれを人間の訪問者にもアピールして宣伝していくのが、結局早道だったりもします。ホームページなどでこれを告知するためには、Ian DavisによるFOAFアイコン:-)[FOAF-ICON]を使うと楽しいでしょう。

少し古い参考情報

FOAFはセマンティック・ウェブの初期からのプロジェクトであるため、セマンティック・ウェブの理解と利用が進むにつれて、当初の方法よりも別の形のほうが望ましいと考えられるようになった部分があります。またこのページには、RDF/XMLの書き方の注意といった、FOAFの理解とは直接関係ないものも含まれていました。こうした初期仕様や古い記述は、このセクションにまとめて、参考情報として扱うことにします。

メールボックスのプライバシーを守る

FOAFではメールボックスを個人の識別に用いますが、メールアドレスという情報はプライベートなものでもあり、不用意に公開するとSPAMの対象となるなどのマイナス面も出てきます。そこでFOAFでは、メールボックスを[SHA1] (Secure Hash Algorithm)によってエンコードし、foaf:mbox_sha1sumプロパティの値として個人を識別できるようにしています。

SHA1は一方向ハッシュ関数と呼ばれるもので、元の値から160ビットのダイジェストを生成します。この関数は“一方向の変換”という特徴を持ちます。すなわちメールアドレス→SHA1ハッシュ値という変換は誰でも容易に計算できますが、逆にSHA1値から元のメールアドレスを割り出すことはまず不可能です。この性質を利用して、実際のメールアドレスを公開する(逆算される)ことなく、メールアドレスと同等の値として個人を識別することが可能になります。

エージェントが「神崎正英」についての情報を得ようとする場合、

  1. webmaster@kanzaki.comというメールアドレスを持つデータを検索する
  2. 同時にそのSHA1を計算し、foaf:mbox_sha1sumがSHA1ハッシュ値と一致するデータも抽出する

という検索を行うことで、「神崎正英」に関する情報を漏れなく集めることができるわけです。この値は、URIではないので、リテラル値として記述します。

[例2]

<rdf:RDF ...>
 <foaf:Person>
  <foaf:mbox_sha1sum>c608c06ce564b0a00846eab72659d8f1375b880b</foaf:mbox_sha1sum>
  <foaf:name>神崎正英</foaf:name>
  <foaf:homepage rdf:resource="http://www.kanzaki.com/"/>
 </foaf:Person>
</rdf:RDF>

個人のメールアドレスをあまり公開したくない場合は、foaf:mboxの代わりにこのfoaf:mbox_sha1sumを記述する方がよいでしょう。また、次に説明する友人の記述には、原則としてfoaf:mbox_sha1sumをIDとして用いておくのが賢明だと言えます。

〔補足〕foaf:mboxfoaf:mbox_sha1sumの値は同等のIDとして機能するので、同じアドレスについて両方を記述する必要はありません。

SHA1のハッシュ値を手で計算するのは大変ですが、スクリプトなどで計算をしてくれるツールがオンラインでも提供されているので、通常はそれらを利用します。

複数の知人を示すときの注意点

foaf:knowsを使って、複数の知人を記述する場合を考えましょう。次のように、ひとつのfoaf:knows要素で複数のfoaf:Peopleをまとめたくなるかも知れません。

[例5-1](正しくない例)

<rdf:RDF ...>
 <foaf:Person>
  <foaf:mbox rdf:resource="mailto:webmaster@kanzaki.com"/>
  <foaf:knows>
   <foaf:Person>
    <foaf:mbox_sha1sum>df0d8c6fa143ec27...</foaf:mbox_sha1sum>
   </foaf:Person>
   <foaf:Person>
    <foaf:mbox_sha1sum>9dff5368ce580062...</foaf:mbox_sha1sum>
   </foaf:Person>
  </foaf:knows>
 </foaf:Person>
</rdf:RDF>

残念ながら、これは正しいRDFではなく、FOAFとして成り立ちません。この方法では、foaf:knowsというひとつのプロパティに2つの目的語があることになってしまい、グラフが描けないのです。

[PersonA]-->[PersonB][PersonC] これではアーク1本にノードが2つで対応しない

正しくは、それぞれの人物に対して別々のfoaf:knowsプロパティを記述します。

[例5-2]

<rdf:RDF ...>
 <foaf:Person>
  <foaf:mbox rdf:resource="mailto:webmaster@kanzaki.com"/>
  <foaf:knows>
   <foaf:Person>
    <foaf:mbox_sha1sum>df0d8c6fa143ec27...</foaf:mbox_sha1sum>
   </foaf:Person>
  </foaf:knows>
  <foaf:knows>
   <foaf:Person>
    <foaf:mbox_sha1sum>9dff5368ce580062...</foaf:mbox_sha1sum>
   </foaf:Person>
  </foaf:knows>
 </foaf:Person>
</rdf:RDF>

ちょっと面倒な感じですが、これによってfoaf:knowsというアークとfoaf:Personというノードがきちんと対応し、RDFのグラフを描くことができます。つい間違ってしまう点なので、注意してください。

[PersonA]-->[PersonB]; -->[PersonC] それぞれのノードにアークが対応する

〔補足〕

この文書では、foaf:、rdf:、rdfs:はそれぞれFOAF、RDF、RDFスキーマの名前空間に結びつけられた接頭辞として扱っています。例をシンプルにするため、rdf:RDFの開始タグでは名前空間宣言を...と省略していますが、実際には次の宣言があるものと考えてください。

(例)

<rdf:RDF
  xmlns:foaf="http://xmlns.com/foaf/0.1/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">

なお、後で述べるrdfs:seeAlsoで知人のFOAFファイルを示す使い方以外では、最後のrdfs:の名前空間宣言は必要ありません。

〔以上補足〕

参考文献

FOAFについて

[FOAF-PROJ]
Dan Brickley, et al, The 'friend of a friend' project: FOAF
<http://rdfweb.org/foaf/>
[RDFWeb]
Dan Brickley, et al, RDFWeb and FOAF: semantic web vapourware for the masses
<http://rdfweb.org/>
[FOAF-VOCAB]
Dan Brickley, Libby Miller, FOAF Vocabulary Specification ,
<http://xmlns.com/foaf/0.1/>
[FOAF-DC]
Dan Brickley, FOAF Wiki - Using Dublin Core Creator,
<http://rdfweb.org/topic/UsingDublinCoreCreator>
[FOAF-DSIG]
Edd Dumbill, PGP Signing FOAF Files, Useful Information Company
<http://usefulinc.com/foaf/signingFoafFiles>
[FOAF-ENC]
Edd Dumbill, PGP Encrypting FOAF Files, Useful Information Company
<http://usefulinc.com/foaf/encryptingFoafFiles>
[FOAF-a-matic]
Leigh Dodds, FOAF-a-matic -- RDFを使って自己紹介してみよう
<http://www.ldodds.com/foaf/foaf-a-matic>
FOAF-a-matic -- Describe yourself in RDF(オリジナル英語版)
[FoaF Explorer]
Morten Frederiksen, FoaF Explorer
<http://xml.mfd-consult.dk/foaf/explorer/>
[FOAF-NAME]
Morten Frederiksen, Dan Brickley et. al., FOAF Wiki - NamesInFoaf
<http://rdfweb.org/topic/NamesInFoaf>
Dan Brickley, foaf link rel syntax - for linking to one's foaf from homepage, , rdfweb developers mailing list
<http://lists.foaf-project.org/pipermail/foaf-dev/2002-December/004677.html>
[AUTODISCOVERY]
Ian Davis, FOAF Autodiscovery at Internet Alchemy,
<http://internetalchemy.org/2003/02/foafAutodiscovery.html>
[FOAFBB]
Dan Brickley, FOAFBulletinBoard
<http://rdfweb.org/topic/FOAFBulletinBoard>
[FOAFNAUT]
Dean Jackson, Jim Ley, FOAFNAUT
<http://foafnaut.org/>
[FOAF-ICON]
Ian Davis, FOAF at Internet Alchemy Weblog
<http://internetalchemy.org/foaf/>
[IBM-XW]
Edd Dumbill, XML Watch: Finding friends with XML and RDF, , IBM developerWorks
<http://www-106.ibm.com/developerworks/xml/library/x-foaf.html>
dW: XML: XMLウォッチ: XMLとRDFによる友達の検索(同文書の日本語訳), <http://www.ibm.com/jp/developerworks/xml/020906/j_x-foaf.html>

関連する文献

[MILGRAM]
Stanley Milgram, The Small World Problem, in "The Individual in a Social World: Essays and Experiments", 2nd Edition, , NY: McGraw-Hill, ISBN:0070419361
Originally: in Psychology Today, vol. 61, 1967.
[KLEINBERG]
Jon Kleinberg, The Small-World Phenomenon: An Algorithmic Perspective,
<http://www.cs.cornell.edu/home/kleinber/swn.d/swn.html>
[MAYFIELD]
Kendra Mayfield, Kevin Bacon: You've Got Mail, , Wired News
<http://www.wired.com/news/culture/0,1284,49343,00.html>
インターネットは「狭い世界」を検証できるか(同文書の日本語訳), <http://www.hotwired.co.jp/news/news/culture/story/20020131206.html>
[SHA1]
D. Eastlake and P. Jones, RFC 3174: US Secure Hash Algorithm 1 (SHA1), , The Internet Society, Informational
<http://www.ietf.org/rfc/rfc3174.txt>
[Turner]
Liz Turner, opt-out, acknowledgment and FOAF piracy, , rdfweb developers mailing list
<http://lists.foaf-project.org/pipermail/foaf-dev/2003-January/005049.html>
[Jabber]
Jabber Software Foundation
<http://www.jabber.org/>
[GEEKCODE]
Robert A. Hayden, The Code of the Geeks, , v3.12
<http://www.geekcode.com/geek.html>
[WOT]
Dan Brickley, WOT RDF Vocabulary
<http://xmlns.com/wot/0.1/>