Как программно определить, зарегистрирован ли анализатор 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
и регистрируйте / игнорируйте ошибки, которые происходят.