第 2 章 コンテンツ提示へのセマンティック Web 技術の応用
4.3 データモデルと生成処理
RDF におけるデータの最小単位は,「主語―述語―目的語」で構成されるトリプルデータ であり,URI 表記されたインスタンスのみが主語や目的語になることが可能である.その ため,トリプルデータに対して,作成者情報等を付与するためには,トリプルデータ自体を インスタンス化する必要がある(図-4.3.1).図-4.3.1 では,「コインロッカー(主語)」の「緯 度(述語)」が「32.74472(目的語)」であるというトリプルデータをインスタンスとし,主 語もしくは目的語として利用できる例を示している.この例では,「入力者 A(主語)」が「イ ンスタンス X(目的語)」を「登録(述語)」し,「インスタンス X(主語)」の「登録日時(述 語)」は「2018 年 8 月 1 日」である例を示す.インスタンス X は,「コインロッカー‐緯度
‐32.74472」というトリプルデータ全体を表すインスタンスである.
コインロッカー
緯度
32.74472入力者A
登録
インスタンスX
rdf:Subject rdf:Predicate rdf:Object
※rdf=http://www.w3.org/1999/02/22-rdf-syntax-ns#
コインロッカー1 緯度 32.74472
緯度#1 singletonPropertyOf 緯度
緯度#1 登録者 入力者A
コインロッカー1 緯度#1 32.74472
singletonPropertyによるインスタンス化
46
図-4.3.1 トリプルデータのインスタンス化イメージ
図-4.3.1 を,本研究が提案するデータ構造で表現した例を図-4.3.2 に示す.本研究が提案 するインスタンス化処理は,主語に,述語と目的語のハッシュ値を連結することで,もとも と表現されていた主語インスタンスの URI と一意性を維持したまま,述語と目的語を文字 列として連結するデータ生成を指す.このデータ処理は,インスタンスを URI で一意に表 現する RDF の考え方に則っている.また,もともと表現されていた主語インスタンスの URI と一意性を維持したまま,述語と目的語を文字列として連結することで効率的なイン スタンス表現を可能とする.さらに,インスタンス化したいトリプルデータを,ハッシュ値 により新しいインスタンスとして生成しているため,もともと生成したトリプルデータに は直接影響を与えることなく,インスタンス化が可能である.そのため,外部アプリケーシ ョンから受け取るフィードバックデータを,元のトリプルデータに直接付与する必要がな いという特⾧がある.
第 2 章で示したハッシュ化は、URI 表記されたインスタンスである主語と目的語を組み 合わせた処理であることに対し、本章で示すインスタンス化処理は、「主語 述語 目的語」
で構成されるトリプルデータ全体をインスタンス化できることが異なる.そのため、データ 処理として、述語と目的語でハッシュ化した文字列を主語に連結している点が異なる.
図-4.3.2 提案するインスタンス化モデル
4.3.1. インスタンス化処理
ハッシュ関数を用いたインスタンス化を具体的な例を用いて示す.トリプルデータのイ
コインロッカー 緯度 32.74472
入力者A
登録 インスタンスX 登録日時
2018年8月1日
入力者A
登録
http://名前空間/コインロッカー+ハッシュ関数(“緯度”+“32.74472”)
コインロッカー 緯度 32.74472
※以下のトリプルデータとは独立して定義する
47
ンスタンス化において,インスタンス化したデータ自体を LOD として公開するために は,LOD の原則である URI により一意に特定でき,http でのアクセスを可能とする必要 がある.そこで,本研究では,インスタンス化したいトリプルデータの主語の URI に,イ ンスタンス化したいトリプルデータの述語と目的語をハッシュ化し連結することで,URI 記述と http アクセスを実現する.本来,インスタンスを生成する際,URI として重複なく 発行するための処理を行う必要があるが,本研究で提案するインスタンス化処理において は,トリプルデータ用のインスタンスのための URI は,インスタンス化したいトリプルデ ータの URI を拡張しているため,インスタンス化したいトリプルデータの登録処理と同時 に実行することができる.また,SPARQL クエリ言語15)には,SHA1 をはじめとする標 準的はハッシュ関数が用意されているため,既存のクエリ言語によりインスタンス化処理 が可能である.
以下に,あるデータ入力ユーザーが,街のスポット(観光地や公園など)情報を,トリプ ルデータとして登録する際の処理の流れを示す.なお,例では,⾧崎市にある丸山公園をス ポットとして登録する流れである.
4.3.1.1. スポット ID と関連情報を表すトリプルの生成
各 ス ポ ッ ト を 一 意 に 特 定 で き る ID を 生 成 し URI で 記 述 す る . 例 え ば ,
「http://nagasakipj.or.jp#SPOT_001」と表現する.なお,http://nagasakipj.or.jp(以下,
接頭辞として ngsk:で表現)は本研究用に一時的に設定した名前空間である.このスポット に対して,例えば,「名前」として「丸山公園」を登録することを想定し,述語として
「ngsk:name」,目的語として「丸山公園」を登録する.この場合,トリプルデータは,
「ngsk:SPOT_001‐ngsk:name‐丸山公園」となる.ここまでは,LOD アプリケーション で必要な一般的なデータ生成処理となる.
4.3.1.2. トリプルのインスタンス化
図-4.3.2 の考え方にもとづき,上記トリプルデータをインスタンス化する.そのため,ま ず , 述 語 と 目 的 語 を 連 携 し た 文 字 列 を ハ ッ シ ュ 値 に す る . 具 体 的 に は ,
「http://nagasakipj.or.jp#name 丸山公園」と連結した後に,SHA1 でハッシュ化すると,
「6b1d32a3d4c4694da845940e503c3f28e14b75e7」という文字列になる.そこで,スポット を示すインスタンス URI(ngsk:SPOT_001)に,ハッシュ値を連結させインスタンス化す ると,「ngsk:SPOT_0016b1d32a3d4c4694da845940e503c3f28e14b75e7」と記述できる.な お,これ以降,インスタンス化されたトリプルを,トリプルインスタンスと呼ぶ.この例で は SHA1 でハッシュ値を計算したが,MD5 といった他のハッシュ関数でも処理可能であ る.
48
4.3.1.3. ユーザーが登録したことを示すトリプルの生成
「ngsk:SPOT_001‐ngsk:name‐丸山公園」というトリプルデータは,上述の通りインス タンス化されたため,登録者情報や登録日時などをトリプルデータとして付与することが できる.ここでは,あるデータ入力ユーザーが登録したことを示すトリプルデータを生成す る.具体的には,「ngsk:USER_A‐ngsk:produce‐ ngsk:SPOT_0016b1d32a3d4c4694da84 5940e503c3f28e14b75e7」と表現される.ngsk:USER_A は,登録したユーザーを一意に指 すインスタンスで既に存在するものとし,http://nagasakipj.or.jp#produce は,登録したこ とを意味する述語とする.なお,これらのデータ構造及び処理は,汎用化して SPARQL ク エリにて表現できることは後述する.
4.3.1.4. RDF ストアに登録するクエリ
丸山公園自体のトリプルデータと,このトリプルデータをデータ入力ユーザーA が作成 したことを示すトリプルデータを RDF ストアに登録するための SPARQL クエリを図-4.3.3 に示す.図-4.3.3 中の,「丸山公園自体のトリプル」が上記手順 4.3.1.1 を,「丸山公園トリ プルのインスタンス化」が上記手順 4.3.1.2 を,「トリプルデータの補足情報」が上記手順 4.
3.1.3 を指す.上述したデータ登録の流れにおいて,丸山公園を登録したことを示すトリプ ルデータは,丸山公園自体のトリプルデータから,SPARQL で定義された標準的なハッシ ュ関数により機械的に生成することが可能である.図-4.3.3 の SPARQL クエリを一般化し たクエリを図-4.3.4 に,生成するトリプルデータのイメージを図-4.3.5 に示す.
図-4.3.4 および図-4.3.5 中の「S」「P」「O」は,生成するトリプルデータの主語,述語,
目的語をそれぞれパラメータとして表現した値を意味する.また,「X」「Y」は,トリプル インスタンスに対して,付加したい主語,述語をパラメータ化した値である. 例えば,上 述の例では,ngsk:USER_A が X に,ngsk:produce が Y にあたる.パラメータとして表現で きたことで,4.5.2 章に示すデータアーキテクチャの設計ができ,また,4.5.3 章に示すシス テムアーキテクチャでの API 設計が容易になる.
49
図-4.3.3 SPARQL クエリ
図-4.3.4 トリプルデータのインスタンス化クエリのモデル
図-4.3.5 生成されるトリプルデータモデル INSERT{
?s ?p ?o.
?user ?produce ?spo. } WHERE
{
BIND(URI("http://nagasakipj.or.jp#SPOT_001") as ?s).
BIND(URI("http://nagasakipj.or.jp#name") as ?p).
BIND(STR("http://丸山公園") as ?o_origin).
BIND(IF(contains(?o_origin,"http"), URI(?o_origin),STR(?o_origin)) AS ?o) BIND(CONCAT(STR(?p),STR(?o)) as ?po).
BIND(URI(CONCAT(STR(?s),SHA1(?po))) as ?spo).
BIND(URI("http://nagasakipj.or.jp#USER_A") as ?user).
BIND(URI("http://nagasakipj.or.jp#produce") as ?produce).
}
丸山公園自体のトリプル
インスタンス化したトリプルデータの補足情報
丸山公園トリプルのインスタンス化
INSERT{
?s ?p ?o.
?x ?y ?spo. } WHERE
{
BIND(URI( S ) as ?s).
BIND(URI( P ) as ?p).
BIND(STR( O ) as ?o_origin).
BIND(IF(contains(?o_origin,"http"), URI(?o_origin),STR(?o_origin)) AS ?o)
BIND(CONCAT(STR(?p),STR(?o)) as ?po).
BIND(URI(CONCAT(STR(?s),SHA1(?po))) as ?spo).
BIND(URI( X ) as ?x).
BIND(URI( Y ) as ?y).
}
S P O
X Y S P O
50