Virtuoso 在RDF_QUAD
表中存储 RDF 三元组。在此表中,IRI 存储为IRI_ID
的数据类型,值存储在RDF_IRI
表中。但我不明白RDF_PREFIX
桌子的用途。是为了减少RDF_IRI
table的使用空间吗?但是join是如何完成的呢?(该RDF_PREFIX
表有一个整数键)。文档没有解释这一点。
1 回答
对于上下文(诚然,这并没有解释为什么有两个表而不是一个),文档说:
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_ID
ofRDF_PREFIX
是一个int
,而RI_ID
ofRDF_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只是一个字节序列。int
RDF_PREFIX
RDF_PREFIX
RDF_IRI
varchars
RDF_PREFIX
RP_NAME
RDF_IRI
RI_NAME