RDF-библиотеки Redland: почему синтаксический анализ модели из Turtle без базового URI вызывает ошибку?

Почему следующий тест выдает ошибку? Настаивает ли парсер черепах Redland на базовом URI, даже если все фактические URI являются абсолютными? (Apache Jena, по-видимому, нет.) И как я могу узнать больше о том, что на самом деле пошло не так (т. вызов вернет описание ошибки или что-то подобное)?

librdf_world *world = librdf_new_world();
librdf_world_open(world);

librdf_storage *storage = librdf_new_storage(world, "memory", NULL, NULL);
librdf_model   *model   = librdf_new_model(world, storage, NULL);

librdf_parser* parser = librdf_new_parser(world, NULL, "text/turtle", NULL);

librdf_uri *baseUri = NULL;

const char *turtle = "<http://example.com/SomeSubject> <http://example.com/SomePredicate> <http://example.com/SomeObject> .";

int error = librdf_parser_parse_string_into_model(parser, (const unsigned char *)turtle, baseUri, model);

person Drux    schedule 28.12.2013    source источник
comment
Jena будет использовать базовый URI по умолчанию, выбранный внутренне (на основе текущего каталога, если ничего не помогает), если ничего не указано.   -  person AndyS    schedule 29.12.2013
comment
Пробовали ли вы добавить обработчик ошибок с помощью librdf_parser_set_error() и посмотрите, что написано в сообщении об ошибке?   -  person RobV    schedule 30.12.2013
comment
Документация (на которую вы ссылаетесь) гласит: Deprecated: Does nothing.   -  person Drux    schedule 30.12.2013
comment
@AndyS, спасибо, это помогает. Знаете ли вы, настаивает ли какая-то спецификация на базовом URI (даже если все фактические URI являются абсолютными, как в приведенном примере)?   -  person Drux    schedule 30.12.2013


Ответы (1)


Базовый URI требуется, поскольку анализатор говорит об этом, используя флаг RAPTOR_SYNTAX_NEED_BASE_URI . Он выдает ошибку еще до просмотра содержимого в raptor_parser_parse_start().

Если вы знаете, что реальный базовый URI не нужен, вы можете вместо этого указать фиктивный URI, например .:

librdf_uri *baseUri = librdf_new_uri(world, (const unsigned char *)".");

Чтобы включить более качественные отчеты об ошибках, вы должны зарегистрировать регистратор с помощью librdf_world_set_logger(). - регистратор по умолчанию просто выдает stderr. Возвратите не-0 из функции регистратора, чтобы сигнализировать об обработке сообщения самостоятельно. Пример:

#include <librdf.h>

int customlogger(void *user_data, librdf_log_message *message) {
  fputs("mad custom logger: ", stderr);
  fputs(message->message, stderr);
  fputs("\n", stderr);
  return 1;
}

int main() {

  librdf_world *world = librdf_new_world();
  librdf_world_set_logger(world, /*user_data=*/ 0, customlogger);
  librdf_world_open(world);

  librdf_storage *storage = librdf_new_storage(world, "memory", NULL, NULL);
  librdf_model   *model   = librdf_new_model(world, storage, NULL);

  librdf_parser* parser = librdf_new_parser(world, NULL, "text/turtle", NULL);

  librdf_uri *baseUri = NULL;

  const char *turtle = "<http://example.com/SomeSubject> <http://example.com/SomePredicate> <http://example.com/SomeObject> .";

  int error = librdf_parser_parse_string_into_model(parser, (const unsigned char *)turtle, baseUri, model);

}

Запуск этого приведет к

mad custom logger: Missing base URI for turtle parser

(Для реальной программы добавьте некоторую очистку и т. д.)

person laalto    schedule 08.01.2014