如何在Virtuoso中使用表RDF_前缀?

如何在Virtuoso中使用表RDF_前缀?,rdf,semantic-web,triplestore,virtuoso,Rdf,Semantic Web,Triplestore,Virtuoso,Virtuoso将RDF三元组存储在RDF_四元组表中。在此表中,IRI存储为IRI_ID的数据类型,值存储在RDF_IRI表中。但是我不理解RDF_前缀表的用法。是为了减少RDF_IRI表的使用空间吗?但是连接是如何完成的呢?RDF_前缀表有一个整数键。文档没有解释这一点。对于上下文,无可否认,上下文没有解释为什么有两个表,而不是只有一个表: 这两个表存储内部IRI id与其外部字符串形式之间的映射。内存驻留缓存包含最近使用的IRIs,以减少对此表的访问。id iri_id中的函数id_to_

Virtuoso将RDF三元组存储在RDF_四元组表中。在此表中,IRI存储为IRI_ID的数据类型,值存储在RDF_IRI表中。但是我不理解RDF_前缀表的用法。是为了减少RDF_IRI表的使用空间吗?但是连接是如何完成的呢?RDF_前缀表有一个整数键。文档没有解释这一点。

对于上下文,无可否认,上下文没有解释为什么有两个表,而不是只有一个表:

这两个表存储内部IRI id与其外部字符串形式之间的映射。内存驻留缓存包含最近使用的IRIs,以减少对此表的访问。id iri_id中的函数id_to_iri通过其id返回iri。在iri varchar中的函数iri_to_id,在5月份,create_new_id返回给定字符串的iri_id;如果该字符串以前没有用作IRI,则根据第二个参数返回NULL或分配新ID

请注意,RDF_前缀的RP_ID是int,而RDF_IRI的RI_ID是IRI_ID。尽管它们都有varchar主键,但它们映射到的ID的类型不同。事实上,尽管RDF_IRI的主键是varchar,但它与RDF_前缀中的varchar不同。我认为下面的例子说明了这一点。文档中给出了其使用示例。我不是一个足够的SQL'er,无法准确地说出该示例中发生了什么,但看看RDF_前缀是如何使用的,这可能是一个好的开始。下面是该示例的一个片段:

  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);
        }
    }
请注意,用于从RDF_IRI检索值的varchar fourbytes是通过对RDF_前缀表中的int进行位移位来构造的。我不足以解释所有细节,但在我看来,RDF_PREFIX和RDF_IRI的键实际上是不同类型的varchar。在RDF_前缀中,RP_名称实际上看起来像IRI,但RDF_IRI的RI_名称只是一个字节序列

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