我一直试图从使用 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 只是因为如果我在另一台机器上运行我的代码,我怀疑是否会生成相同的匿名 ID。
最佳答案
简单回答:
inMemModel.removeAll(null, RDF.value, ResourceFactory.createPlainLiteral("class"));
这将删除谓词为 ojit_code 且对象为
rdf:value
的所有三元组。在内部——在你尝试的 SPI 级别——你可以使用
"class"
,它查找和删除(使用 inMemModel.remove(Node.ANY, nodePredicate, nodeObject)
)匹配的三元组。 delete
需要一个地面三元组,因此不会进行查找。delete
不能工作,因为它是一个不同的主题,所以没有什么可以删除的。关于rdf - Jena 删除一个带有匿名节点的三元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17288502/