Библиотеки 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
(Для реальной программы добавьте немного очистки и т. Д.)