1

目前我正在使用 Jena 来解决本体文件,但找不到从某些属性中删除功能属性的方法。

谁能指出如何使用 Jena 做到这一点?

- 编辑 -

我想要做的是遍历本体中的所有属性,如果找到功能属性,则将其转换为非功能属性

我的代码是这样的:

    Iterator<OntProperty> ont = model.listOntProperties();
    while(ont.hasNext()) {
        OntProperty p = ont.next();
        if(p.isFunctionalProperty()) {
            p.removeProperty(RDF.type, OWL.FunctionalProperty);
        }
    }

但目前它产生 java.util.ConcurrentModificationException 错误。

谢谢!

4

1 回答 1

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 );

更新

您的代码抛出 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);
}
于 2013-07-17T09:00:43.170 回答