Как программно определить, зарегистрирован ли анализатор Jena, который может обрабатывать формат?

Я пишу компонент запроса DCAT, и в идеале я бы мог загрузить модель Jena с тем количеством доступных распределений в каталоге (при условии, что они не являются разными представлениями одних и тех же данных, что, по моему опыту, обычно "т).

Но если я произвольно пытаюсь загрузить любой accessURL или downloadURL, найденный в документе DCAT, в Jena выдается исключение, потому что данные не являются предполагаемым форматом синтаксического анализатора (Jena предполагает на основе типов MIME и расширений файлов).

Я знаю, что новые объекты синтаксического анализатора могут быть зарегистрированы в RDFParserRegistry, на который, как я полагаю, ссылаются во время Model.read(), но я хотел бы попробовать только Model.read(), если я знаю, что синтаксический анализатор зарегистрирован для чтения документа я собираюсь получить. Но я не вижу способа сделать это с помощью RDFParserRegistry.

1 ответ

Решение

По сути, у вас есть некоторый URI, например, http://example.org/foo Вы нашли в некоторых данных, что вы хотите попытаться загрузить дополнительные данные как RDF, но не знаете, предоставляет ли URI данные в формате, который поддерживает Jena?

Чтобы выяснить, в каком формате доступны данные, вам нужно сделать HTTP GET запрос к URI, вручную передавая RDF-центр Accept заголовок (WebContent.defaultGraphAcceptHeader предоставляет заголовок, который Jena будет использовать для запросов). Затем вы можете изучить Content-Type возвращается удаленным сервером.

Если у вас есть это, вы можете использовать это для проверки парсера следующим образом:

Lang lang = RDFLanguages.contentTypeToLang(contentType);
if (lang != null) {
  // Language is known, is there an RDF parser for it?
  ReaderRIOTFactory parserFactory = RDFParserRegistry.getFactory(lang);
  if (parserFactory != null) {
    // Parser registered
    // Read your model
  }
}

Обратите внимание, что вы можете прочитать модель непосредственно из InputStream от твоего GET запрос, как будто вы просто делаете model.read() с помощью URI вы заставите Джену снова загрузить контент.

Так как этот подход требует от вас сделать HTTP-запрос к удаленному ресурсу в любом случае, на самом деле может быть эффективнее просто попробовать model.read() независимо от catch и регистрируйте / игнорируйте ошибки, которые происходят.

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