You are on page 1of 28

RDF・FOAF

2007/03/15 ウノウ株式会社 駒形真幸 <komagata@unoh.net>


FOAFとは?

● Friend Of A Friend
●プロフィールや知り合いなど、人に関する情報
 を表すためのRDFの語彙の一つ
知り合いA

知り合いB
自分
RDFとは?

● Resource Description Framework

●WWW上のリソースとリソースの関係を表現す
 るためのモデル
●WWWの提案者、ティム・バーナーズ=リーが
 提唱した。
RDFとは?(2)
● 身近なところではRSS1.0もRDF(2.0は違う)
<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/m-komagata/rss">
<title>m-komagataの日記</title>
<link>http://d.hatena.ne.jp/m-komagata/</link>
<description>m-komagataの日記</description>
<dc:date>2006-11-07T20:35:16+09:00</dc:date>
<items>
(後略)
何故RDF?

どんな関係?

文書 文書

リンク

●HTMLのリンクは意味が付いてない。
 (どういう関係を持ってるのかわからない)
何故RDF?(2)

要約
文章 文章

● RDFでは関係を表現できる
●WWWは元々、関係の情報付きの意味ネットワーク
 (セマンティック・ウェブ)として設計された
RDFの基本要素

● リソース
Web上で識別できるもの全て。(URI参照で表現されます)


ステートメント(文)
リソースの主語、述語、目的語の3つの組み合わせ
 (トリプル)

グラフ
ステートメントの集合

 ※RDFのグラフは様々な構文(XMLやN-Triplesなど)で表現できる
RDFの基本概念
ステートメント

foaf:weblog
urn:komagata http://p0t.jp/mt/

主語 述語 目的語

● リソースを主語、述語、目的語としてステートメントを作れる

目的語は別のステートメントの主語になれる。
RDFの基本概念(2)
ステートメント
リテラル
dc:title
http://p0t.jp/mt/ p0t

主語 述語 目的語

●目的語はURI参照だけでなく、文字列自身(リテラル)とする
 ことが可能
RDFの基本概念(3)

aaa
A bbb C
B aaa
A bbb C
B

B eee
eee
D
D

● 世界のどこで記述されたトリプルでも同じURIを持っていれ
ばひとつのグラフに併合できる。
●意味を機械が理解できるRDFで情報を記述することで
 Web全体を分散型データベースとして扱おうという野望。
<aaa>
<bbb>
aaa
A bbb C <ccc>
B </ccc>
</bbb>
</aaa>

ここまでがRDFのモデルの話。

ここからは具体的なXMLでの記述方法の話です。
RDFトリプルのXML表現
foaf:weblog
urn:komagata http://p0t.jp/mt/

<rdf:Description> --- 主語ノード


<foaf:weblog> --- 述語ノード
<rdf:Description> --- 目的語ノード
</rdf:Description>
</foaf:weblog>
</rdf:Description>

● XML表現では、主語、述語はrdf:Descriptionで記述します

述語はその名前の要素として記述します
RDFトリプルのXML表現(2)
foaf:weblog
urn:komagata http://p0t.jp/mt/

<rdf:Description rdf:about=”urn:komagata”>
<foaf:weblog>
<rdf:Description rdf:about=”http://p0t.jp/mt/”>
</rdf:Description>
</foaf:weblog>
</rdf:Description>

● 主語、目的語の参照先はrdf:about要素で記述します
RDFトリプルのXML表現(3)
foaf:weblog
urn:komagata http://p0t.jp/mt/

<rdf:Description rdf:about=”urn:komagata”>
<foaf:weblog rdf:resource=”http://p0t.jp/mt/” />
</rdf:Description>

● 子ノードを持たない要素はrdf:resource属性を使って省略表
記できます
RDFトリプルのXML表現(4)
dc:title
http://p0t.jp/mt/ p0t

<rdf:Description rdf:about=”urn:komagata”>
<dc:title>p0t</dc:title>
</rdf:Description>

● 目的語がリテラルの場合はrdf:Description要素を省略して
述語ノードのプロパティとして記述できます
RDFトリプルのXML表現(5)
foaf:weblog dc:title
urn:komagata http://p0t.jp/mt/ p0t

<rdf:RDF>
<rdf:Description rdf:about=”urn:komagata”>
<foaf:weblog>
<rdf:Description rdf:about=”http://p0t.jp/mt/”>
<dc:title>p0t</dc:title>
</rdf:Description>
</foaf:weblog>
</rdf:Description>
</rdf:RDF>

● 複数のトリプルもこれまでの組み合わせで表現できます。
● RDF文章としてはrdf:RDFノードをrootノードにします
FOAFの語彙
● FOAFの名前空間は “http://xmlns.com/foaf/0.1/” です
● 一般的にfoaf:という接頭辞にマッピングして使います

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<foaf:Person rdf:nodeID="me">
<foaf:nick>komagata</foaf:nick>
<foaf:bio:olb>働いたら負けだと思っている</foaf:bio:olb>
<foaf:weblog rdf:resource="http://komagata.vox.com/"/>
<foaf:knows>
<foaf:Person>
<foaf:nick>kawadu</foaf:nick>
(後略)
FOAFの語彙(2)
主な述語(主語はfoaf:Personなど)
FOAFの語彙(3)
● foaf:knowsで知人を表現できるのが面白いところ

<foaf:knows>
<foaf:Person>
<foaf:nick>kawadu</foaf:nick>
<foaf:weblog rdf:resource="http://kawadu.vox.com/" />
</foaf:Person>
</foaf:knows>
<foaf:knows>
<foaf:Person>
<foaf:nick>yoshida</foaf:nick>
<foaf:weblog rdf:resource="http://yoshida.vox.com/" />
</foaf:Person>
</foaf:knows>
RDFパーサーいろいろ
Redland

CのRDFパーサー。Java, Perl, PHP, Python, Rubyなど


色んな言語向けのBindingがある。
●RAP – RDF API for PHP
Pure PHPのRDFパーサー。画像でRDFグラフを出力したり
 機能がやたらある。
●Hercules
 JavascriptのObject/RDFマッパー。E4Xっぽい手軽さで
 SPARQL(後述)クエリを生成してObjectにマッピングしてく
 れる。
RAPでVOXのFOAFを検索
define('RDFAPI_INCLUDE_DIR', 'lib/rdfapi-php/api/');
include_once RDFAPI_INCLUDE_DIR.'RdfAPI.php';
include_once RDFAPI_INCLUDE_DIR.'syntax/RdfParser.php';
include_once RDFAPI_INCLUDE_DIR.'vocabulary/FOAF_C.php';

$uri = 'http://komagata.vox.com/profile/foaf.rdf';

$model = ModelFactory::getDefaultModel();
$model->load($uri);
$bio = new Resource('http://purl.org/vocab/bio/0.1/olb');
$result = $model->find(null, $bio, null); // Subject, Predicate, Object
print_r($result->triples);

●Model#findメソッドに主語、述語、目的語のResourceを
 与えて検索する(返り値はStatement)
RDFのパース
● FOAFをパースしようと思っていきなり手を出すと、何故
こんなAPIになってるのかさっぱり理解できない。
● RDFのモデルを知ってると非常にわかりやすい。
●XMLのパースじゃなくて、RDFグラフに対する検索なので
 柔軟な検索が可能。
●もっと本格的な問い合わせはSPARQLというRDF問い合わ
せ言語を使う。
 (RDBに対するSQLやODBに対するOQLみたいなもの)
FOAFのこれまで
●(2004年頃)RSSみたいに流行るかと期待されたが流行ら
 なかった
●ブログシステムがRSSを吐いてくれたようにFOAFを
 吐いてくれるシステムがあまりなかった。
●FOAFはSNSに最適かと思われたが、SNSが閉鎖的な
 システムに終始し、まったく対応しなかった。(がっかり・・・)
●(上記理由で)FOAFファイル自体が少ないためにクライアン
 トを作ってもあまり役に立たなかった。
FOAFの現在~
●VOXなど、権限管理機能を高めつつ、公開するところは
 公開してくようなSNSが増え始めた。
● API公開が流行
●スクレイピング技術普及で第三者がメタデータを勝手に作っ
 て配布したりしやすくなった
● あとは便利 or 面白いクライアントがあれば・・・
FOAF Client
● Widget(ブログパーツ)はどうだろうか。
●丁度Offline/Online問わないWidgetの標準仕様策定が
 進んでいる。(Netbives Universal Widget API)
● 小粒度のコンテンツ形態として普及するかもしれない
●FOAF Browser Widgetを作ってみました。
 VOX、はてなダイアリ、TypeKey、MixiのFOAFを
 それぞれ表示しています。(Mixi FOAFは自前)

 一端JSONPに変換しているのでどこにでも張れます。
FOAF Widget
FOAF Widget on ジオシティーズ
参考資料
●セマンティック・ウェブのためのRDF/OWL 入門
http://www.amazon.co.jp/exec/obidos/ASIN/4627829310/p0t-
22/ref=nosim

● Redland
http://librdf.org/

● RAP – RDF API fo PHP


http://sites.wiwiss.fu-berlin.de/suhl/bizer/rdfapi/

● Hercules
http://www.arielworks.net/works/codeyard/hercules

● Netvibes UWA
http://dev.netvibes.com/