rdf - 如何以编程方式确定是否注册了可以处理格式的 Jena 解析器?

标签 rdf semantic-web apache-jena

我正在编写一个 DCAT 查询组件,理想情况下我能够加载目录中可用的尽可能多的分布的 Jena 模型(假设它们不是相同数据的不同表示,根据我的经验他们通常不是)。

但是,如果我任意尝试加载 DCAT 文档中找到的任何 accessURL 或 downloadURL,则 Jena 中会引发异常,因为数据不是解析器的预期格式(Jena 根据 MIME 类型和文件扩展名进行猜测)。

我知道新的解析器对象可以使用 RDFParserRegistry 注册,我假设在 Model.read() 期间引用了该对象,但如果我知道解析器已注册,我只想尝试 Model.read()阅读我要检索的文档类型。但我没有看到使用 RDFParserRegistry 来做到这一点的方法。

最佳答案

所以本质上你有一些 URI,例如http://example.org/foo 在某些数据中发现您想要尝试加载有关 RDF 的更多数据,但您不知道 URI 是否以 Jena 支持的格式提供数据?

为了找出数据的可用格式,您需要向 URI 发出 HTTP GET 请求,手动传递以 RDF 为中心的 Accept header (WebContent.defaultGraphAcceptHeader 提供 Jena 将用于请求的 header )。然后,您可以检查远程服务器返回的 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
  }
}

请注意,您可能希望直接从 GET 请求中的 InputStream 读取模型,就像执行 model.read() 使用 URI,您将强制 Jena 再次下载内容。

由于这种方法需要您向远程资源发出 HTTP 请求,因此实际上尝试 model.read()catch 可能会更有效并记录/忽略发生的错误。

关于rdf - 如何以编程方式确定是否注册了可以处理格式的 Jena 解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31666970/

相关文章:

C# - 将 RDF 文件转换为特定的 XML 文件

python - 使用 SPARQL 进行有限的 RDFS 和 OWL 推理

rdf - 使用 DBpedia 和 SPARQL 获取所有定义的颜色

java - 在语义 Web 应用程序中将 URI 作为请求参数处理

rdf - 多语言 OpenCalais 之类的系统?

java - 为 RDF 爬网程序导入类时出错

java - Jena - 访问给定数据类型属性的个人

SPARQL 两个节点之间的路径

java - 如何在 Apache Jena 模型中添加 NameSpace/PrefixMap?