【问题标题】:How is the table RDF_PREFIX used in Virtuoso?Virtuoso 中如何使用表 RDF_PREFIX?
【发布时间】:2013-02-23 09:56:53
【问题描述】:

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

【问题讨论】:

    标签: rdf semantic-web triplestore virtuoso


    【解决方案1】:

    对于上下文(诚然没有解释为什么有两个表而不是一个)documentation 说:

    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,具体取决于第二个参数。

    注意RDF_PREFIXRP_IDint,而RDF_IRIRI_IDIRI_ID。即使它们都有varchar 主键,它们映射这些名称的ID 类型也不同。事实上,似乎RDF_IRI 的主键是 varchar,但它与RDF_PREFIX 中的 varchar 不同。我认为下面的例子说明了这一点。文档中的Example 1.5.44 How can I perform search for predicate values 给出了它的使用示例。我没有足够的 SQL'er 准确地说出该示例中发生了什么正在发生,但了解如何使用 RDF_PREFIX 可能是一个好的开始。这是该示例中的一个 sn-p:

      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_PREFIX 表中的int 构造的。我不足以解释所有细节,但它看起来在我看来RDF_PREFIXRDF_IRI 的键实际上是不同类型的varchars。在RDF_PREFIX 中,RP_NAME 实际上看起来像一个IRI,但RDF_IRIRI_NAME 只是一个字节序列。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多