Java プログラムで RDF を処理する必要があり,試しに HP Labs によって開発された Jena - A Semantic Web Framework for Java を少し使ってみました。Jena は,RDF データの入出力,編集機能などを提供するオープンソースのフレームワークです。
Jena の試用にあたり,最新バージョンである 2.5.4 をダウンロードしました。特別なインストール作業は存在せず,lib ディレクトリ内の jar ファイルを CLASSPATH に登録するだけです。
Jena には Model という概念があり,Model に対してリソースを追加していきます。そして,Model から希望する形式で RDF を出力できます。一つの Model が,一つのファイルに対応するようなイメージです。RDB 連携機能を使うと,RDF を mysql や PostgreSQL などに保存可能です。
今回は RDF を蓄積する必要があったので,PostgreSQL を利用することにしました。この場合,PostgreSQL の JDBC ドライバを別途入手する必要があります。
RDF を操作するには,まず Model を作成する必要があります。PostgreSQL と連携した Model は,以下のようにして作成します。
import com.hp.hpl.jena.db.*; import com.hp.hpl.jena.rdf.model.*; ・・・ String dbUrl = "jdbc:postgresql://host/jena"; String dbUser = "jena"; String dbPwd = "password"; String dbType = "PostgreSQL"; String dbDriver = "org.postgresql.Driver"; Class.forName(dbDriver); IDBConnection conn = new DBConnection(dbUrl, dbUser, dbPwd, dbType); ModelMaker maker = ModelFactory.createModelRDBMaker(conn); Model model = maker.createModel("myModel");
Model を作成したら,Model に対してファイルなどから RDF を読み込んだり,新規に RDF を登録します。
「このブログの作成者は【SHINN】で,タイトルは【SHINN::Scribble】である」という RDF を登録します。登録はリソースを作成して,それにプロパティを加える形態です。述語は,dc(Dublin Core)から適当なものを選びました。
Resource myBlog = model.createResource("http://shinn.boo.jp/blog/"); myBlog.addProperty(DC.creator, "SHINN"); myBlog.addProperty(DC.title, "SHINN::Scribble");
登録した RDF を出力してみます。Jena では様々な形式で出力できますが,一般的な RDF/XML の短縮形で標準出力に出してみます。
model.write(System.out, "RDF/XML-ABBREV");
出力は以下のようになりました。
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" > <rdf:Description rdf:about="http://shinn.boo.jp/blog/"> <dc:creator>SHINN</dc:creator> <dc:title>SHINN::Scribble</dc:title> </rdf:Description> </rdf:RDF>
今度は目的語がリテラルではなく,リソース URL 形式のものを追加してみます。用途として正しいのか分かりませんが,dcterms:isReferencedBy を使って,このブログにリンクを張ってくれている知人のサイトを追加します。
リソース URL 形式のものを登録する際は,目的語をリソースとして作成し,それを主語に結び付けます。
リソース URL 形式とは関係ありませんが,dcterms のように dc 以外のネームスペースを利用する場合は,setNsPrefix を呼び出して使用するネームスペースを登録する必要がありました。
model.setNsPrefix("dcterms", "http://purl.org/dc/terms/"); Resource myBlog = model.createResource("http://shinn.boo.jp/blog/"); myBlog.addProperty(DC.creator, "SHINN"); myBlog.addProperty(DC.title, "SHINN::Scribble"); Resource friendBlog = model.createResource("http://blog.nuage.jp/"); model.add(myBlog, DCTerms.isReferencedBy, friendBlog);
RDF を出力させると,以下のようになりました。
<rdf:RDF xmlns:dcterms="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" > <rdf:Description rdf:about="http://shinn.boo.jp/blog/"> <dc:creator>SHINN</dc:creator> <dc:title>SHINN::Scribble</dc:title> <dcterms:isReferencedBy rdf:resource="http://blog.nuage.jp/"/> </rdf:Description> </rdf:RDF>
次は rdf:Bag を使って複数のリテラル(このブログのキーワード)を dc:subject として登録してみます。Bag を作成して目的語を登録し,リソースと結びつけます。
Bag bag = model.createBag(); bag.addProperty(RDF.li(1), "Java"); bag.addProperty(RDF.li(2), "Stationery"); model.add(myBlog, DC.subject, bag);
RDF を出力させると,以下のようになりました。
<rdf:RDF xmlns:dcterms="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" > <rdf:Description rdf:about="http://shinn.boo.jp/blog/"> <dc:creator>SHINN</dc:creator> <dc:subject> <rdf:Bag> <rdf:li>Java</rdf:li> <rdf:li>Stationery</rdf:li> </rdf:Bag> </dc:subject> <dc:title>SHINN::Scribble</dc:title> <dcterms:isReferencedBy rdf:resource="http://blog.nuage.jp/"/> </rdf:Description> </rdf:RDF>
少し使った程度ですが,XML を意識する必要がないし,RDB に登録されるしで便利です。欠点は,書籍や日本語 WEB サイトなどの情報が少ないことでしょうか。次は独自のネームスペースを追加してみます。