Hatena::Groupweb

vantguarde

 | 

4.20

foaf:PersonalProfileDocument

| 16:09

はい、メインのトピックはわかったよ。でもprimaryTopicのみじゃ、誰がそれを言ったのか分からない。なので結局「僕のFOAF」は表現できないんじゃないのか、という問題です。

それを解決するのがfoaf:PersonalProfileDocumentというクラスと、foaf:maker, foaf:primaryTopicの組み合わせによる「これは僕がメインで、僕によって作られた僕のプロフィールです。」という文。

foaf:PersonalProfileDocumentクラスは「この文書を作ったひと(foaf:maker)に関するプロフィール文書」という意味を持つもの。

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<> a foaf:PersonalProfileDocument ;
  foaf:maker _:vant ;
  foaf:primaryTopic _:vant .

_:vant a foaf:Person ;
  foaf:name "vant" ;
  foaf:weblog <http://web.g.hatena.ne.jp/vantguarde/> ;
  foaf:knows _:friend .

_:friend a foaf:Person ;
    foaf:name "friend" ;
    foaf:weblog <http://example.com/friend> .

foaf:makerも、foaf:primaryTopicもvantを指してます。なので「これはvantが作った自身のプロフィールで、もちろんメインのトピックはvantの情報」という意味になるわけです。これにて解決。

ちなみにfoaf:primaryTopic, foaf:isPrimaryTopicOf, そしてfoaf:PersonalProfileDocumentはFOAFブームが起こった後に追加されたので、その時手書きでFOAFを書いてた人はちょっと見直した方がいいかも。というのは、「これ僕が書いたぼくのFOAFだよ」ということをFOAFブームの頃のスキーマでは示せなかったから。なので今編集する気のある人はつけくわえといてね。

foaf:primaryTopic/foaf:isPrimaryTopicOf

| 15:58

前回の続き。個人の情報とそのファイルにつながりがないとはどういうことか、ってことを書こうと思ったんだけど、ちょっと理解不足かもということで、とりあえず解答を。逃げっ。

# http://example.com/foaf

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:vant a foaf:Person ;
  foaf:name "vant" ;
  foaf:weblog <http://web.g.hatena.ne.jp/vantguarde/> ;
  foaf:knows _:friend .

_:friend a foaf:Person ;
    foaf:name "friend" ;
    foaf:weblog <http://example.com/friend> .

さて、これだと僕のFOAFなのかfriendのFOAFなのか、RDF的にはっきりしないわけです。そこで登場するのが、このURLと僕を結びつけるプロパティ、foaf:primaryTopic又はfoaf:isPrimaryTopicOf。

foaf:primaryTopicは「主語のリソースが持つメインのトピックはこのリソース」というのを示すプロパティで、foaf:isPrimaryTopicOfはその反対「主語のリソースをメインとするリソース」を示すプロパティ。わかりにくいですね、というわけで例を。

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<> foaf:primaryTopic _:vant .

_:vant a foaf:Person ;
  foaf:name "vant" ;
  foaf:weblog <http://web.g.hatena.ne.jp/vantguarde/> ;
  foaf:knows _:friend .

_:friend a foaf:Person ;
    foaf:name "friend" ;
    foaf:weblog <http://example.com/friend> .

<> foaf:primaryTopic _:vant .を入れただけ。<>は「この文書」という意味、つまりこの場合<http://example.com/foaf>と等価です。「http://example.com/foafのメイントピックはvantに関する情報だよ。」ということを言ってるわけです。

で、foaf:isPrimaryTopicOfを使うとこうなる。

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:vant a foaf:Person ;
  foaf:name "vant" ;
  foaf:weblog <http://web.g.hatena.ne.jp/vantguarde/> ;
  foaf:knows _:friend .

_:vant foaf:isPrimaryTopicOf <> .

_:friend a foaf:Person ;
    foaf:name "friend" ;
    foaf:weblog <http://example.com/friend> .

「vantに関する情報はhttp://example.com/foafのメイントピックだよ。」ということになります。主語と目的語が入れ替わってますが、同じ意味ですよね。二つのプロパティはowl:inverseで関係づけられてるので、どちらを用いても「誰がメイントピックか」を示せます。

ただRDF/XMLを考えると、foaf:isPrimaryTopicOfの方がいいかも。

<rdf:RDF xmlns...>
  <rdf:Description rdf:about="">
    <foaf:primaryTopic rdf:nodeID="vant"/>
  </rdf:Description>

  <foaf:Person rdf:nodeID="vant">
    <foaf:name>vant</foaf:name>
    <!-- のこり省略 -->
  </foaf:Person>
</rdf:RDF>

foaf:primaryTopicを使うと、rdf:Description要素をfoaf:Personの兄弟要素にしないといけない。で、FOAFをただのXMLとして解析するアプリがもしかしたらそれを上手く扱ってくれないかもしれないから。

<rdf:RDF xmlns...>
  <foaf:Person>
    <foaf:name>vant</foaf:name>
    <!-- のこり省略 -->
    <foaf:isPrimaryTopic rdf:resource=""/>
  </foaf:Person>
</rdf:RDF>

foaf:isPrimaryTopicOfだとfoaf:Personの子要素として収められるので、見た目を気にする人にもいいかも。

ただ、もう一つ問題が。それはメインのトピックが分かったからといって、誰がそれを言ったのか分からないこと。

 | 
Contact: @vant / lepetitcroissant@gmail.com.