目前我正在使用Jena解决本体文件,但找不到从某些属性中删除功能属性的方法。
有人能指出如何使用Jena做到这一点吗?
- 编辑 -
我想要做的是迭代本体中的所有属性,如果找到functionalProperty,则将其转换为非功能属性
我的代码是这样的:
Iterator<OntProperty> ont = model.listOntProperties();
while(ont.hasNext()) {
OntProperty p = ont.next();
if(p.isFunctionalProperty()) {
p.removeProperty(RDF.type, OWL.FunctionalProperty);
}
}
但是目前它会产生java.util.ConcurrentModificationException错误。
谢谢!
答案 0 :(得分:3)
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 );
<强>更新强>
您的代码抛出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);
}