Serialization ApacheJena-是否可以写入以输出BASE指令?

Serialization ApacheJena-是否可以写入以输出BASE指令?,serialization,rdf,jena,owl,turtle-rdf,Serialization,Rdf,Jena,Owl,Turtle Rdf,我刚开始使用Jena Apache,在他们的介绍中,他们解释了如何编写创建的模型。作为输入,我使用一个包含一些OWL本体数据的Turtle语法文件,并使用@base指令在语法上使用相对URI: @base <https://valbuena.com/ontology-test/> . 有多个以参数为基础的读写命令: 在read()上,我发现如果在数据文件上未声明@base,则必须在read命令上执行,否则可以将其设置为null 在write()上,base参数是可选的,无论我是否

我刚开始使用Jena Apache,在他们的介绍中,他们解释了如何编写创建的模型。作为输入,我使用一个包含一些OWL本体数据的Turtle语法文件,并使用@base指令在语法上使用相对URI:

@base <https://valbuena.com/ontology-test/> .
有多个以参数为基础的读写命令:

  • 在read()上,我发现如果在数据文件上未声明@base,则必须在read命令上执行,否则可以将其设置为null
  • 在write()上,base参数是可选的,无论我是否指定了base(甚至像null或URI),输出都是相同的,@base不出现,所有的reactive URI都是完整的URI

我不确定这是不是一个bug,或者是不可能的。

首先考虑使用一个像“:”这样的前缀——这和基数不一样,但是输出也很好。

您可以使用(当前版本的Jena)配置基础:


Jena RDF API简介教程中使用的命令似乎没有更新,它们显示了我之前显示的读取方法(FileManager),现在已被RDFDataMgr取代。FileManager方式与“base”指令不兼容

经过实验,我发现base指令可以很好地用于:

Model model = ModelFactory.createDefaultModel();
RDFDataMgr.read(model,"src/main/files/example.ttl");
model.write(System.out, "TURTLE", base);

虽然model.write()命令被称为遗留on(而model.read()在上被认为是常见的,我不明白为什么),但它是我发现的唯一一个允许使用“base”参数(再次将@base指令放在输出上所必需的)的命令,RDFDataMgr write方法不包括它


感谢@AndyS提供了一种更简单的读取数据的方法,从而解决了问题。

@AndyS的回答允许我将相对URI写入文件,但没有包括RDFXML变体使用的基。为了正确添加XMLBase指令,我必须使用以下命令

RDFDataMgr.read(graph, is, Lang.RDFXML);    
Map<String, Object> properties = new HashMap<>();
properties.put("xmlbase", "http://example#");
Context cxt = new Context();
cxt.set(SysRIOT.sysRdfWriterProperties, properties);
RDFWriter.create().source(graph).format(RDFFormat.RDFXML_PLAIN).base("http://example#").context(cxt).output(os);
RDFDataMgr.read(图形,is,Lang.RDFXML);
映射属性=新的HashMap();
properties.put(“xmlbase”http://example#");
Context cxt=new Context();
cxt.set(SysRIOT.sysRdfWriterProperties、properties);
RDFWriter.create().source(graph).format(RDFFormat.RDFXML_PLAIN).base(“http://example#)上下文(cxt).输出(os);

RDFDataMgr.read(m,“src/main/files/example.ttl”)
更简单。@AndyS。谢谢还有。。。。这就是问题的解决办法!看起来我使用的reading命令是遗留的,但是简介教程仍然使用它。我无法解决这个命令的问题,源函数不允许使用Model类,它运行Model.getGraph(),但输出不显示base指令。“:”可能是一个很好的解决方案,但我更喜欢使用base,因为Jena似乎能够处理它。
Model m = ModelFactory.createOntologyModel();
String base = "https://valbuena.com/ontology-test/";

InputStream in = FileManager.get().open("src/main/files/example.ttl");
if (in == null) {
   System.out.println("file error");
   return;
} else {
   m.read(in, null, "TURTLE");
}

m.write(System.out, "TURTLE");
RDFWriter.create()
         .source(model)
         .lang(Lang.TTL)
         .base("http://base/")
         .output(System.out); 
Model model = ModelFactory.createDefaultModel();
RDFDataMgr.read(model,"src/main/files/example.ttl");
model.write(System.out, "TURTLE", base);
Model model = ModelFactory.createDefaultModel();
model.read("src/main/files/example.ttl");
model.write(System.out, "TURTLE", base);
RDFDataMgr.read(graph, is, Lang.RDFXML);    
Map<String, Object> properties = new HashMap<>();
properties.put("xmlbase", "http://example#");
Context cxt = new Context();
cxt.set(SysRIOT.sysRdfWriterProperties, properties);
RDFWriter.create().source(graph).format(RDFFormat.RDFXML_PLAIN).base("http://example#").context(cxt).output(os);