2015-07-28 6 views
2

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

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

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

ответ

2

По существу у вас есть 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 вы заставите Jena загрузить контент снова.

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

+0

Спасибо за ваш ответ. Да, мне казалось, что сначала не нужно делать запрос http вручную, так как это все равно, что делает Йена. Наверное, я должен просто поймать исключение и двигаться дальше, если он не сработает. –

+0

Либо вы отредактировали свой ответ, либо я все еще спал, когда читал его :). Поэтому, если была сделана запись для типа языка, RDFLanguages.contentTypeToLang должен вернуть этот зарегистрированный язык. Затем мне нужно проверить, была ли связанная с этим фабрика парсера связана с языком, поскольку язык может быть зарегистрирован, но не фабрика. Кроме того, я мог бы, возможно, просто сделать http HEAD по URL-адресу с Jena accept header, чтобы повысить производительность при запросе типа содержимого для проверки. –

+1

Да, язык может существовать, но не иметь соответствующего анализатора – RobV

 Смежные вопросы

  • Нет связанных вопросов^_^