Как таблица RDF_PREFIX используется в Virtuoso?

Virtuoso хранит тройки RDF в таблице RDF_QUAD. В этой таблице IRI хранятся как тип данных IRI_ID, а значения хранятся в таблице RDF_IRI. Но я не понимаю использования таблицы RDF_PREFIX. Это для уменьшения используемого пространства таблицы RDF_IRI? Но как происходит соединение? (Таблица RDF_PREFIX имеет целочисленный ключ). Документация этого не объясняет.


person gVibrac    schedule 23.02.2013    source источник


Ответы (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 — это просто последовательность байтов.

person Joshua Taylor    schedule 28.06.2013