Virtuoso は RDF トリプルをRDF_QUAD
テーブルに保存します。このテーブルでは、IRI はIRI_ID
のデータ型として格納され、値はRDF_IRI
テーブルに格納されます。RDF_PREFIX
しかし、テーブルの使い方がわかりません。RDF_IRI
テーブルの使用スペースを減らすためですか?しかし、結合はどのように行われますか? (RDF_PREFIX
テーブルには整数キーがあります)。ドキュメントはこれを説明していません。
1 に答える
コンテキストについては(確かに、テーブルが1つではなく2つある理由を説明していません)、ドキュメントには次のように記載されています。
create table DB.DBA.RDF_PREFIX ( RP_NAME varchar primary key, RP_ID int not null unique ); create table DB.DBA.RDF_IRI ( RI_NAME varchar primary key, RI_ID IRI_ID not null unique );
これらの 2 つのテーブルは、内部 IRI ID と外部文字列形式の間のマッピングを格納します。メモリ常駐キャッシュには、このテーブルへのアクセスを減らすために最近使用された IRI が含まれています。関数 id_to_iri (id IRI_ID 内) は、その ID によって IRI を返します。関数 iri_to_id (iri varchar 内、may_create_new_id 内) は、指定された文字列の IRI_ID を返します。文字列が以前に IRI として使用されていない場合は、2 番目の引数に応じて、NULL が返されるか、新しい ID が割り当てられます。
の は であるのに対し、RP_ID
のはであることに注意してください。どちらにも主キーがありますが、それらの名前をマップする ID は同じ型ではありません。実際、 の主キーはvarchar ですが、 の場合と同じ種類の varcharではないようです。次の例はこれを示していると思います。Example 1.5.44 How can I perform search for predicate values from the documentation は、その使用例を示しています。その例で何が起こっているのかを正確に言うには、私は SQL の専門家ではありませんが、どのように使用されるかを見る良い出発点になるかもしれません。その例のスニペットを次に示します。RDF_PREFIX
int
RI_ID
RDF_IRI
IRI_ID
varchar
RDF_IRI
RDF_PREFIX
RDF_PREFIX
for ( SELECT RP_NAME, RP_ID
FROM RDF_PREFIX
WHERE (RP_NAME >= path) AND (RP_NAME < path || chr(255)) ) do
{
declare fourbytes varchar;
fourbytes := '----';
fourbytes[0] := bit_shift (RP_ID, -24);
fourbytes[1] := bit_and (bit_shift (RP_ID, -16), 255);
fourbytes[2] := bit_and (bit_shift (RP_ID, -8), 255);
fourbytes[3] := bit_and (RP_ID, 255);
for ( SELECT RI_NAME, RI_ID from RDF_IRI
WHERE (RI_NAME >= fourbytes) AND (RI_NAME < fourbytes || chr(255)) ) do
{
if (exists (SELECT TOP 1 1 FROM RDF_QUAD WHERE P=RI_ID))
result (case when (dump_iri_ids) then RI_ID else RP_NAME || subseq (RI_NAME, 4) end);
}
}
varchar fourbytes
から値を取得するために使用されるは、テーブルRDF_IRI
に含まれる をビットシフトすることによって構成されていることに注意してください。私はすべての詳細を説明するのに十分なSQL'erではありませんが、キーのように見え、実際には異なる種類の. では、 は実際には IRI のように見えますが、は単なるバイトのシーケンスです。int
RDF_PREFIX
RDF_PREFIX
RDF_IRI
varchars
RDF_PREFIX
RP_NAME
RDF_IRI
RI_NAME