16. RDFサポート¶
triple
と呼ばれる3つのデータの組で、主語(subject)、述語(predicate)、目的語(object)の組み合わせで表されます。AIRPLANE:hasPurpose:to transport us through the air
AIRPLANE:hasSize:9
AIRPLANE:hasSpeed:12
AIRPLANE:hasSyllables:1
AIRPLANE:isa:Aircraft
AIRPLANE:isa:Transportation
AIRPLANE:lifeArea:Physical
16.1. RDFデータ処理用のAIMLタグ¶
本対話エンジンでは、template要素でのRDFデータ処理用として以下のAIMLタグが使用できます。
addtriple
: RDFデータの追加。deletetriple
: RDFデータの削除。uniq
: RDFデータに対する検索(単一結果出力用)。select
: RDFデータに対する検索(複合結果出力用)。
また、検索結果を変数に出力した場合には、以下のAIMLタグが使用できます。
get
: 検索結果データを取得。一部のデータのみを取得する場合、子要素:tuple を利用します。first
: 検索結果データから、先頭の検索結果を取得します。rest
: 検索結果データから、2番目以降の検索結果を取得します。set
: 検索結果データの他変数への代入。
16.2. RDFデータ管理¶
対話エンジンでは、subject、predicate、objectの組み合わせを一意のデータとして管理し、エレメントと称します。 RDFデータの各エレメントは、対話エンジン起動時の初期ロードとともに、シナリオでの操作により追加・削除が行えます。
16.2.1. 初期ロード¶
対話エンジンの起動時に、事前に用意したファイル群から各エレメントを登録します。
対象ファイルの指定は、ファイル管理のエンティティ の rdf
で行い、該当する全ての定義ファイルを読み込んで、エレメントを展開します。
*特定のフォルダ配下の ‘*.txt’ から展開する場合の例(サブフォルダも利用可能)。
client_type:
storage:
entities:
rdf: file
stores:
file:
type: file
config:
rdf_storage:
dirs: ../storage/rdfs
subdirs: true
extension: txt
以降では、次の記述をした定義ファイルを初期ロードしたものとして説明します。
ant:legs:6
ant:sound:scratch
bat:legs:2
bat:sound:eee
bear:legs:4
bear:sound:grrrrr
buffalo:legs:4
buffalo:sound:moo
cat:legs:4
cat:sound:meow
chicken:legs:2
chicken:sound:cluck cluck
dolphin:legs:0
dolphin:sound:meep meep
fish:legs:0
fish:sound:bubble bubble
16.2.2. エレメント追加¶
template要素の addtriple 要素を利用することで、動的に新しいエレメントを追加できます。記述形式は、以下になります。
<addtriple>
<subj>Subject</subj><pred>Predicate</pred><obj>Object</obj>
</addtriple>
動物の特性を追加する例です。
<addtriple>
<subj>cow</subj><pred>sound</pred><obj>moo</obj>
</addtriple>
<addtriple>
<subj>dog</subj><pred>sound</pred><obj>woof</obj>
</addtriple>
初期ロードと同様に文字コード変換を行って登録するため、以下のRDFデータが登録されます。
COW:SOUND:MOO
DOG:SOUND:WOOF
なお、addtripleで追加したデータは永続的ではなく、対話エンジンを再起動した時点で初期状態に戻ります。
16.2.3. エレメント削除¶
template要素の deletetriple 要素を利用することで、addtriple要素で追加したエレメントだけではなく、初期ロードしたエレメントも削除できます。記述形式は、以下になります。
<deletetriple>
<subj>Subject</subj><pred>Predicate</pred><obj>Object</obj>
</deletetriple>
addtripleで追加したエレメントと、初期ロードしたエレメントを削除する例です。
<deletetriple>
<subj>cow</subj><pred>sound</pred><obj>moo</obj>
</deletetriple>
<deletetriple>
<subj>ant</subj><pred>sound</pred><obj>scratch</obj>
</deletetriple>
なお、deletetripleも永続的ではなく、対話エンジンを再起動した時点で初期状態に戻ります。
16.3. RDFデータの検索¶
RDFデータの検索要素には2種類がありますが、それぞれの仕様は以下のように異なります。
uniq要素
1つの検索条件を指定し、検索結果に対して重複した文字列を除外し、空白区切りの結合した文字列を返します。
select要素
複数の検索条件の指定が可能で、検索結果をエレメントを単位とした複数候補をリスト化した文字列で返します。変数を使用することで関連づけた検索が可能です。
16.3.1. uniqによる検索¶
特定の情報を取得する場合、以下の様に記述します。
<uniq>
<subj>ant</subj>
<pred>sound</pred>
<obj>?</obj>
</uniq>
検索時にエレメント要素の指定を省略することが可能で、subjectの一覧を取得する場合、以下の様に記述します。
<uniq>
<subj>?</subj>
</uniq>
特定の条件を指定する例として、predicate=”legs”の条件で、objectの一覧を取得します。
<uniq>
<pred>legs</pred>
<obj>?</obj>
</uniq>
16.3.2. selectによる検索¶
selectで使用可能なクエリ用の子要素には <q>とともに、<notq>がありますが、<notq>は、子要素で指定された条件に合致しない全てのエレメントを対象としますので大量のデータを出力することになります。
16.3.2.1. 単純検索¶
単純な検索の場合、<q>要素の内容として、subject、predicate、objectの3つを指定すると、合致した結果として登録されている内容をリスト型で返します。
<select>
<q><subj>dog</subj><pred>sound</pred><obj>woof</obj></q>
</select>
特定の1つの要素のみを取得する場合、以下の記述ができます。
<select>
<q><subj>cat</subj><pred>sound</pred><obj>?</obj></q>
</select>
16.3.2.2. 変数による検索¶
<select>
<vars>?x ?y ?z</vars>
<q><subj>?x</subj><pred>?y</pred><obj>?z</obj></q>
</select>
<select>
<vars>?x ?y</vars>
<q><subj>?x</subj><pred>legs</pred><obj>?y</obj></q>
</select>
16.3.2.3. 複合条件検索¶
<select>
<vars>?x</vars>
<q><subj>?x</subj><pred>legs</pred><obj>0</obj></q>
<q><subj>?x</subj><pred>sound</pred></q>
</select>
<select>
<vars>?x ?y</vars>
<q><subj>?x</subj><pred>legs</pred><obj>0</obj></q>
<q><subj>?x</subj><pred>sound</pred><obj>?y</obj></q>
</select>
16.3.2.4. データ取得¶
<set var="tuples">
<select>
<vars>?x ?y</vars>
<q><subj>?x</subj><pred>sound</pred><obj>?y</obj></q>
</select>
</set>
前述の’select’要素から生成されたデータを取得する場合、’get’タグの子要素’tuple’を利用して取得します。
<get var="?x">
<tuple>
<get var="tuples" />
</tuple>
</get>
<get var="?y">
<tuple>
<get var="tuples" />
</tuple>
</get>
また、”tuples”に対して、firstタグ、restタグを利用することで、以下の様に部分的な結果を取得することもできます。
<get var="?x">
<tuple>
<first><get var="tuples" /></first>
</tuple>
</get>
<get var="?y">
<tuple>
<rest><get var="tuples" /></rest>
</tuple>
</get>