耶拿相对URI基础

时间:2017-12-12 00:46:32

标签: jena relative-path

Reading RDF in Apache Jena表示,

  

假定没有URI方案的资源名称是本地文件名。

可以通过为read的各种RDFDataMgr方法提供基本URI来覆盖此假设。但有没有办法将相对URI视为错误,即如果在给定的RDF文档中遇到相对URI则抛出异常?

问题类似于Jena adds path/url to URIs,但在我的情况下,相对URI表示错误情况。

3 个答案:

答案 0 :(得分:1)

是的,可以覆盖URI解析行为。从而允许您替换拒绝相对URI的解析器。我们在基于Apache Jena的生产软件中使用它。

我们的代码不适用于您感兴趣的代码路径,因为我们在SPARQL解析中使用它,这是一种与解析不同的API,我无论如何也无法共享专有代码。但是我觉得你想做的事情是完全可以实现的。

最近的Jena版本引入了一个RDFParserBuilder类,它提供了对解析器行为进行详细控制的解析器。将数据中的术语转换为Jena Node对象由FactoryRDF接口处理,该接口可以在解析器构建器上设置。因此,您应该能够覆盖它以实现您的逻辑以拒绝相对URI。

答案 1 :(得分:1)

以下是@RobV使用FactoryRDF答案的实现。

static final String BASE = "null://null/";
static final FactoryRDF FACTORY = new FactoryRDFStd() {
    @Override
    public Node createURI(String uriStr) {
        if (uriStr.startsWith(BASE))
            throw new IllegalArgumentException("URI is not absolute: " + uriStr.substring(BASE.length()));
        return super.createURI(uriStr);
    }
};

public static void main(String... args) {
    Model output = ModelFactory.createDefaultModel();
    RDFParser.create()
             .fromString("<foo> <bar> <baz> .")
             .lang(Lang.TURTLE)
             .base(BASE)
             .factory(FACTORY)
             .parse(output.getGraph());
}

答案 2 :(得分:0)

  

假定没有URI方案的资源名称是本地文件名。

扩展该文档:这意味着

RDFDataMgr.read(Model, "mydata.ttl", ...)

将读取文件“mydata.ttl”

基URI参数适用于解析数据的进程,而不是选择要读取的数据。等效地,资源查找的基URI是进程的当前工作目录。