是否可以将项目动态添加到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)
提前致谢

最佳答案

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


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


您没有提到您是否正在获得该例外。

对于您的情况,我认为最简单的方法是创建OntClasses数组,然后根据它们创建列表。也就是说,您可以执行以下操作(未测试):

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上有所挣扎的人。

07-24 09:54