假定没有URI方案的资源名称是本地文件名。
可以通过为read
的各种RDFDataMgr
方法提供基本URI来覆盖此假设。但有没有办法将相对URI视为错误,即如果在给定的RDF文档中遇到相对URI则抛出异常?
问题类似于Jena adds path/url to URIs,但在我的情况下,相对URI表示错误情况。
答案 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是进程的当前工作目录。