3

Virtuoso は RDF トリプルをRDF_QUADテーブルに保存します。このテーブルでは、IRI はIRI_IDのデータ型として格納され、値はRDF_IRIテーブルに格納されます。RDF_PREFIXしかし、テーブルの使い方がわかりません。RDF_IRIテーブルの使用スペースを減らすためですか?しかし、結合はどのように行われますか? (RDF_PREFIXテーブルには整数キーがあります)。ドキュメントはこれを説明していません。

4

1 に答える 1

2

コンテキストについては(確かに、テーブルが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_PREFIXintRI_IDRDF_IRIIRI_IDvarcharRDF_IRIRDF_PREFIXRDF_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 のように見えますが、は単なるバイトのシーケンスです。intRDF_PREFIXRDF_PREFIXRDF_IRIvarcharsRDF_PREFIXRP_NAMERDF_IRIRI_NAME

于 2013-06-28T01:47:58.283 に答える