Apache Jena - 是否可以编写输出BASE指令?

时间:2018-03-15 10:11:35

标签: serialization rdf jena owl turtle-rdf

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

@base <https://valbuena.com/ontology-test/> .

然后将我的数据写为:

<sensor/AD590/1> a sosa:Sensor ;
    rdfs:label "AD590 #1 temperatue sensor"@en ;
    sosa:observes <room/1#Temperature> ;
    ssn:implements <MeasureRoomTempProcedure> . 

Apache Jena能够读取@base指令并将相对URI扩展到其完整版本,但是当我写出来时,Jena没有编写@base指令和相对URI。输出显示为:

<https://valbuena.com/ontology-test/sensor/AD590/1> a sosa:Sensor ;
    rdfs:label "AD590 #1 temperatue sensor"@en ;
    sosa:observes <https://valbuena.com/ontology-test/room/1#Temperature> ;
    ssn:implements <https://valbuena.com/ontology-test/MeasureRoomTempProcedure> .  

我的代码如下:

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");

有多个读取和写入命令作为参数作为基础:

  • 在read()上我发现如果在数据文件中没有声明@base必须在read命令上完成,那么它可以设置为null。
  • 在write()上,base参数是可选的,如果我指定了base(即使是null或URI)也没关系,输出总是相同的,@ base不是&#39 ; t出现,所有实际的URI都是完整的URI。

我不确定这是不是错误,也不确定。

3 个答案:

答案 0 :(得分:1)

首先 - 考虑使用类似“:”的前缀 - 这与base不同,但也使输出更好。

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

RDFWriter.create()
         .source(model)
         .lang(Lang.TTL)
         .base("http://base/")
         .output(System.out); 

答案 1 :(得分:0)

似乎Jena RDF API的介绍教程中使用的命令没有更新,它们显示我之前显示的读取方法(FileManager),现在由RDFDataMgr替换。 FileManager方式不适用于&#34; base&#34;指示好。

经过实验,我发现基本指令适用于:

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);

尽管model.write()命令在RDF output documentation上被认为是遗留的(而RDF input documentation上的model.read()被认为是常见的,但是不明白为什么),它是我发现的唯一一个允许&#34; base&#34;参数(需要将@base指令再次放在输出上),RDFDataMgr写入方法不包含它。

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

答案 2 :(得分:0)

@AndyS的答案允许我将相对URI写入文件,但不包括用于RDFXML变体的基础。为了正确添加xml 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);