如何在Jena

时间:2015-09-30 22:35:13

标签: java rdf sparql jena

是否可以动态地向Jena的RDFList添加项目? 类似的东西:

RDFList list = model.createList(new RDFNode[] {});
//string with names of rdf classes
String[] parts = list.split("-");

for(int i = 0; i<parts.length; i++){
    OntClass oclass = model.getOntClass("http://example.org/"+parts[i]);  
    list.add(oclass);
}

我得到了 com.hp.hpl.jena.rdf.model.EmptyListUpdateException: Attempt to add() to the empty list (rdf:nil)
提前致谢

1 个答案:

答案 0 :(得分:1)

如果没有看到您的所有代码以及某些值,我们无法确定发生了什么,但我认为这里的问题是您无法使用RDFList #add使用列表,我认为这是您在开始时创建的内容。由于您正在创建一个没有元素的列表,因此您应该返回 rdf:nil ,这是空列表。请注意RDFList#add的文档说:

  

如果此列表为空(零)列表,则在不违反Jena的情况下,我们无法在不更改此节点的URI(从rdf:nil)到新列表单元格的空白节点的情况下执行副作用更新不变的。因此,如果尝试添加到nil列表,则此更新操作将引发异常。添加到空列表的安全方式包括with(RDFNode)cons(RDFNode)

你没有提到你是否得到了这个例外。

在您的情况下,我认为最简单的方法是创建 OntClass es数组,然后从中创建列表。也就是说,你可以做一些像(未经测试的):

String[] parts = list.split("-");
RDFNode[] elements = new RDFNode[parts.length];

for(int i = 0; i<parts.length; i++){
    elements[i] = model.getOntClass("http://example.org/"+parts[i]);  
}

RDFList list = model.createList(elements);

或者,如果您想使用,如文档中所述,您可以执行类似的操作(再次,未经测试):

RDFList list = model.createList(new RDFNode[] {});
//string with names of rdf classes
String[] parts = list.split("-");

for(int i = 0; i<parts.length; i++){
    OntClass oclass = model.getOntClass("http://example.org/"+parts[i]);  
    list = list.with(oclass);
}

有关此问题的更多信息,您可能会发现我的this answer及其相关评论。你不是第一个与RDFLists有过一点斗争的人。