Йена удалить тройку с анонимным узлом

Я безуспешно пытался удалить тройку из модели с помощью Jena. Все работает хорошо, когда субъект, предикат и объект являются URI или литералами, но для анонимных узлов это, похоже, не работает. Например, рассмотрим эту тройку в модели:

_:A68d23cacX3aX13f793fa898X3aXX2dX7ffd <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "class" .

Я хотел бы удалить его, используя:

Node nodeSubject = Node.createAnon(); //or Node.ANY
Node nodePredicate = Node.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#value");
Node nodeObject = Node.createLiteral("class");
Triple triple = Triple.create(nodeSubject, nodePredicate,  nodeObject);
inMemModel.getGraph().delete(triple);

Я не могу удалить тройку независимо от того, использую ли я createAnon или Node.ANY. Я бы не хотел использовать AnonId только потому, что если я запущу свой код на другой машине, я сомневаюсь, что будет сгенерирован тот же анонимный идентификатор.


person Veni_Vidi_Vici    schedule 25.06.2013    source источник


Ответы (1)


Простой ответ:

inMemModel.removeAll(null, RDF.value, ResourceFactory.createPlainLiteral("class"));

Это удалит все триплеты, где предикат равен rdf:value, а объект равен "class".

Внутри — на уровне SPI, который вы пытались использовать — вы могли бы использовать inMemModel.remove(Node.ANY, nodePredicate, nodeObject), который находит и удаляет (используя delete) совпадающие тройки. delete берет тройку оснований и, следовательно, не находит.

createAnon() не работает просто потому, что это другая тема, так что удалять нечего.

person user205512    schedule 25.06.2013
comment
У меня наоборот - у меня _:A68d23cacX3aX13f793fa898X3aXX2dX7ffd и мне нужно убрать все его тройки - как это сделать ? - person Antoniossss; 09.09.2020
comment
model.removeAll(res, null, null) (когда res является вашим bnode). Однако вы также можете использовать res.removeProperties(), который делает то же самое (при условии, что ваш ресурс из этой модели). - person user205512; 10.09.2020
comment
Проблема в том, что ResourceFactory.createResource("_:A68d23cacX3aX13f793fa898X3aXX2dX7ffd") и A68d23cacX3aX13f793fa898X3aXX2dX7ffd у меня не работали, а model.find(res,null,null) возвращал пустой итератор. Это была моя главная проблема - как сопоставить bnode, поскольку я бы сказал, что оно должно соответствовать упомянутому. - person Antoniossss; 10.09.2020
comment
Ах я вижу. Попробуйте Resource res = model.createResource(new AnonId("A68d23cacX3aX13f793fa898X3aXX2dX7ffd")); - person user205512; 10.09.2020
comment
Интересно, не пробовал. Заранее спасибо - person Antoniossss; 10.09.2020