Jena 中的各种本体 API 类,例如FunctionalProperty
只是为了提供方便的编程 API。所有的状态信息实际上都保存在底层Model
。因此,要使属性不再是函数属性,您只需rdf:type
从模型中删除相应的三元组即可。
例如(未经测试的代码,但应该可以工作):
OntModel m = ModelFactory.createOntology( OntModelSpec.OWL_MEM );
NS = "http://www.example.com/ontology#";
FunctionalProperty p = m.createFunctionalProperty( NS + "p" );
// now change p to normal object property
// setRDFType removes all existing rdf:type triples and adds one new one
// alternatively, we could just call:
// p.removeProperty( RDF.type, OWL.FunctionalProperty );
p.setRDFType( OWL.ObjectProperty );
ObjectProperty p1 = p.as( ObjectProperty.class );
更新
您的代码抛出 a 是ConcurrentModificationError
因为您在迭代该集合时尝试对集合进行更改 - 因此在迭代的同时修改它。解决方案是分两个阶段完成工作:首先创建一个集合对象,例如具有要更改的属性的对象,然后对这些属性进行更改。ArrayList
List<FunctionalProperty> fps = new ArrayList<FunctionalProperty>();
Iterator<OntProperty> ont = model.listOntProperties();
while(ont.hasNext()) {
OntProperty p = ont.next();
if(p.isFunctionalProperty()) {
fps.add( p.asFunctionalProperty() );
}
}
for (FunctionalProperty fp: fps) {
fp.removeProperty(RDF.type, OWL.FunctionalProperty);
}