Как динамически добавлять элементы в rdflist/rdfcollection в Йене

Можно ли динамически добавлять элементы в 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)
Заранее спасибо


person advocatis    schedule 30.09.2015    source источник


Ответы (1)


Не видя всего вашего кода и некоторых значений, мы не можем быть уверены, что происходит, но я думаю, что проблема здесь в том, что вы не можете использовать RDFList#add с пустым списком. , и я думаю, что это то, что вы создаете в самом начале. Поскольку вы создаете список без элементов, вы должны получить обратно rdf:nil, то есть пустой список. Обратите внимание, что документация для RDFList#add говорит:

Если этот список является пустым (нулевым) списком, мы не можем выполнить побочное обновление без изменения URI этого узла (с rdf:nil) на пустой узел для новой ячейки списка) без нарушения инварианта Jena. Таким образом, эта операция обновления вызовет исключение, если будет предпринята попытка добавления в нулевой список. Безопасные способы добавления в пустой список включают with(RDFNode) и cons(RDFNode).

Вы не упомянули, получаете ли вы это исключение или нет.

В вашем случае, я думаю, проще всего было бы создать массив OntClass, а затем просто создать из них список. То есть вы можете сделать что-то вроде (непроверено):

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

В качестве альтернативы, если вы хотите использовать with, как указано в документации, вы должны сделать что-то вроде (опять же, не проверено):

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

Чтобы узнать больше об этом, вы можете найти этот мой ответ и соответствующие комментарии к нему. Вы не первый, у кого возникли проблемы с РДФЛ.

person Joshua Taylor    schedule 01.10.2015