Jena相对URI基

Jena相对URI基,jena,relative-path,Jena,Relative Path,声明 假定没有URI方案的资源名为本地文件名 可以通过向RDFDataMgr的各种read方法提供基本URI来覆盖此假设。但是,有没有一种方法可以将相对URI视为错误,即如果在给定RDF文档中遇到相对URI,则抛出异常 问题类似于,但在我的例子中,相对URI表示错误情况。是的,有可能覆盖URI解析行为。从而允许您替换拒绝相对URI的解析程序。我们在基于ApacheJena的生产软件中使用了这一点 我们的代码不适用于您感兴趣的代码路径,因为我们在SPARQL解析中使用它,它是与解析不同的API,而

声明

假定没有URI方案的资源名为本地文件名

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


问题类似于,但在我的例子中,相对URI表示错误情况。

是的,有可能覆盖URI解析行为。从而允许您替换拒绝相对URI的解析程序。我们在基于ApacheJena的生产软件中使用了这一点

我们的代码不适用于您感兴趣的代码路径,因为我们在SPARQL解析中使用它,它是与解析不同的API,而且我不能共享专有代码。然而,我认为你想要做的是完全可以实现的

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

假定没有URI方案的资源名为本地文件名

扩展该文档:这意味着

RDFDataMgr.read(Model, "mydata.ttl", ...)
将读取文件“mydata.ttl”


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

这里是@RobV使用
FactoryRDF
实现的答案

静态最终字符串基=”null://null/";
静态最终FactoryRDF工厂=新FactoryRDFStd(){
@凌驾
公共节点createURI(字符串URI){
if(uriStr.startsWith(BASE))
抛出新的IllegalArgumentException(“URI不是绝对的:+uriStr.substring(BASE.length()));
返回super.createURI(uriStr);
}
};
公共静态void main(字符串…参数){
模型输出=ModelFactory.createDefaultModel();
RDFParser.create()
.fromString(“.”)
.lang(lang.TURTLE)
.基地(基地)
.工厂(工厂)
.parse(output.getGraph());
}

FactoryRDF
是一种方法。另一种方法是解析到
StreamRDF
,并检查通过的三个URI
StreamRDF
s可以堆叠。从我所看到的,
FactoryRDF
StreamRDF
仅在从相对形式转换为绝对形式后提供对URI的访问。这就留下了确定绝对URI过去是否是相对URI的问题。在将相对URI转换为绝对形式之前,是否有一个接口可以访问相对URI?@AndyS,有没有一种方法可以对写操作执行相同的操作
RDFWriterBuilder
不接受Factory对象来处理节点。FactoryRDF与写入无关
RDFWriterBuilder
有一个
base
方法-这就是您要寻找的吗?(RDF/XML可能不同;请参见)@AndyS,我想创建一个
RDFWriter
,如果其源代码包含相对URI,则会引发异常。