如何在Virtuoso中使用表RDF_前缀?
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_前缀是如何使用的,这可能是一个好的开始。下面是该示例的一个片段:如何在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_
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);
}
}