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

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

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);

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, Верните ненулевое значение из функции логгера, чтобы самому сигнализировать обработчику сообщения. Пример:

#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

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

Другие вопросы по тегам