使用jena删除本体中的功能属性

时间:2013-07-17 07:55:12

标签: jena ontology

目前我正在使用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错误。

谢谢!

1 个答案:

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