3

Virtuoso 在RDF_QUAD表中存储 RDF 三元组。在此表中,IRI 存储为IRI_ID的数据类型,值存储在RDF_IRI表中。但我不明白RDF_PREFIX桌子的用途。是为了减少RDF_IRItable的使用空间吗?但是join是如何完成的呢?(该RDF_PREFIX表有一个整数键)。文档没有解释这一点。

4

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 );

这两个表存储了内部 IRI id 与其外部字符串形式之间的映射。内存驻留缓存包含最近使用的 IRI,以减少对该表的访问。函数 id_to_iri(在 id IRI_ID 中)通过其 ID 返回 IRI。函数 iri_to_id(在 iri varchar 中,在 may_create_new_id 中)返回给定字符串的 IRI_ID;如果该字符串之前未用作 IRI,则返回 NULL 或分配新 ID,具体取决于第二个参数。

请注意,RP_IDofRDF_PREFIX是一个int,而RI_IDofRDF_IRI是一个IRI_ID。即使它们都有varchar主键,它们映射这些名称的 ID 类型也不同。事实上,看起来即使 的主键RDF_IRI是 varchar,但它RDF_PREFIX. 我认为下面的例子说明了这一点。Example 1.5.44 How can I perform search for predicate values from the documentation给出了一个使用示例。我没有足够的 SQL 来准确地说明该示例中发生了什么,但这可能是了解如何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进行位移来构造的。我不足以解释所有细节,但在我看来,它就像是. 在中,实际上看起来像一个 IRI,但's只是一个字节序列。intRDF_PREFIXRDF_PREFIXRDF_IRIvarcharsRDF_PREFIXRP_NAMERDF_IRIRI_NAME

于 2013-06-28T01:47:58.283 回答