对于上下文(诚然没有解释为什么有两个表而不是一个)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_PREFIX 的RP_ID 是int,而RDF_IRI 的RI_ID 是IRI_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_PREFIX 和RDF_IRI 的键实际上是不同类型的varchars。在RDF_PREFIX 中,RP_NAME 实际上看起来像一个IRI,但RDF_IRI 的RI_NAME 只是一个字节序列。