Virtuoso хранит тройки RDF в таблице RDF_QUAD
. В этой таблице IRI хранятся как тип данных IRI_ID
, а значения хранятся в таблице RDF_IRI
. Но я не понимаю использования таблицы RDF_PREFIX
. Это для уменьшения используемого пространства таблицы RDF_IRI
? Но как происходит соединение? (Таблица RDF_PREFIX
имеет целочисленный ключ). Документация этого не объясняет.
Как таблица RDF_PREFIX используется в Virtuoso?
Ответы (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 и их внешней строковой формой. Резидентный кеш памяти содержит недавно использовавшиеся IRI для уменьшения доступа к этой таблице. Функция id_to_iri (в id IRI_ID) возвращает IRI по его ID. Функция iri_to_id (в iri varchar, в may_create_new_id) возвращает IRI_ID для заданной строки; если строка ранее не использовалась в качестве IRI, то либо возвращается NULL, либо выделяется новый идентификатор, в зависимости от второго аргумента.
Обратите внимание, что RP_ID
из RDF_PREFIX
— это int
, а RI_ID
из RDF_IRI
— это IRI_ID
. Несмотря на то, что они оба имеют varchar
первичных ключей, идентификаторы, которым они сопоставляют эти имена, не одного типа. На самом деле кажется, что хотя первичный ключ RDF_IRI
является varchar, это не тот же тип varchar, что и в RDF_PREFIX
. Следующий пример показывает это, я думаю. Пример 1.5.44 Как выполнить поиск значений предиката из документации дает пример его использования. Я недостаточно хорошо разбираюсь в 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
, создается путем битового сдвига int
, поступающего в таблицу RDF_PREFIX
. Я недостаточно хорошо разбираюсь в SQL, чтобы объяснять все детали, но мне похоже, что ключи к RDF_PREFIX
и RDF_IRI
на самом деле являются разными типами varchars
. В RDF_PREFIX
RP_NAME
на самом деле выглядит как IRI, но RI_NAME
в RDF_IRI
— это просто последовательность байтов.