Rdf 如何使功能对象属性成为非功能对象属性?

Rdf 如何使功能对象属性成为非功能对象属性?,rdf,jena,owl,ontology,Rdf,Jena,Owl,Ontology,当我试图用Jena的OntModel等API修改我的OWL文件时,我遇到了一个问题。原始OWL文件是: 我想将functional object属性更改为非functional object属性,但找不到任何与此相关的API。所需的OWL文件为: 以下代码为我获取所需的OWL: OntModel otm=ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); 读取(目录,空); ObjectProperty hasprogram=o

当我试图用Jena的OntModel等API修改我的OWL文件时,我遇到了一个问题。原始OWL文件是:


我想将functional object属性更改为非functional object属性,但找不到任何与此相关的API。所需的OWL文件为:


以下代码为我获取所需的OWL:

OntModel otm=ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
读取(目录,空);
ObjectProperty hasprogram=otm.getProperty(NS+“hasprogram”);
HasProgram.removeProperty(RDF.type,OWL.FunctionalProperty);`
但是,当我想再次将
hasprogram
转换为函数属性时, 使用
hasprogram.convertToFunctionalProperty()
不会将
HasProgram rdf:type owl:FunctionalProperty
添加回模型!因此,我认为使用
hasprogram.removeProperty(RDF.type,OWL.FunctionalProperty)必须不正确。将功能性ObjectProperty转换为非功能性属性的正确方法是什么

短版 Jena用于实现convertToFunctionalProperty(和其他多态行为)的方法使用了大量缓存。通过更改底层模型,您违反了缓存所做的一些假设。看起来使属性不起作用的正确方法是

p.removeProperty(RDF.type,OWL.FunctionalProperty);
就像你做的那样。要使其再次发挥功能,请再次添加类型:

p.addProperty(RDF.type,OWL.FunctionalProperty);

长版本 使事物失去功能 我做了一个快速搜索,没有找到任何关于将函数属性转换为非函数属性的内容。我认为您的方法是正确的:删除
prop a owl:FunctionalProperty
看起来是正确的方法

使事物功能化 OntProperty接口中有许多方法用于在其他类型的属性中转换属性,但不用于使它们不是某些类型的属性。特别是,该方法说它将:

回答此属性的一个方面作为功能属性,添加 如有必要,请向模型添加其他信息

返回:此属性,但已转换为FunctionalProperty方面

无论您如何成功地使某些内容不再是函数属性,看起来convertToFunctional应该能够使其再次起作用。然而,你说过

但是,当我想再次将HasProgram转换为functional时, HasProgram.convertToFunctionalProperty();不起作用

关于“不起作用”的含义,您并没有提供足够的信息,但我认为,这里有一个例子突出了您的意思。令人惊讶的是,对
convertToFunctionalProperty
的第一次调用添加了
hasProgram rdf:type owl:FunctionalProperty
三元组,但是如果手动删除它,第二次调用不会再次添加它

import org.apache.jena.riot.Lang;
导入org.apache.jena.riot.RDFDataMgr;
导入com.hp.hpl.jena.ontology.ObjectProperty;
导入com.hp.hpl.jena.ontology.OntModel;
导入com.hp.hpl.jena.ontology.OntModelSpec;
导入com.hp.hpl.jena.rdf.model.ModelFactory;
导入com.hp.hpl.jena.词汇表.OWL;
导入com.hp.hpl.jena.词汇表.RDF;
公共类FunctionalProperty示例{
公共静态void main(字符串[]args){
字符串ns=”http://stackoverflow.com/q/23507335/1281433/";
OntModel model=ModelFactory.createOntologyModel(OntModelSpec.OWL\u DL\u MEM);
ObjectProperty OpapProgram=model.createOntProperty(ns+“hasProgram”).convertToObjectProperty();
System.out.println(“”);
RDFDataMgr.write(System.out、model、Lang.RDFXML);
opHasProgram.convertToFunctionalProperty();
System.out.println(“\n”);
RDFDataMgr.write(System.out、model、Lang.RDFXML);
opHasProgram.removeProperty(RDF.type,OWL.FunctionalProperty);
System.out.println(“\n”);
RDFDataMgr.write(System.out、model、Lang.RDFXML);
opHasProgram.convertToFunctionalProperty();
System.out.println(“\n”);
RDFDataMgr.write(System.out、model、Lang.RDFXML);
}
}

这很奇怪。为了弄清楚发生了什么,我们需要看一下实现,但我认为答案可以归结为缓存。OnPropertyImpl实现convertToFunctionalProperty(我们将遵循以下链):

公共功能属性转换为功能属性(){
返回convertToType(getProfile().FUNCTIONAL_PROPERTY(),“FUNCTIONAL_PROPERTY”,FunctionalProperty.class);
}
然后,在OnTestSourceImpl中:

受保护的T转换类型(资源类型、字符串名称、类cls){
检查配置文件(类型、名称);
如果(加拿大(cls)){
//不需要更新模型,我们已经可以完成给定的方面了
返回为(cls);
}
//我们被告知添加这个rdf:type将使as()成为可能-让我们看看
addProperty(RDF.type,type);
返回为(cls);
}
因此,我们看到,如果
canAs(FunctionalProperty.class)
返回false,就会添加属性。所以出于某种原因,它仍然返回true,即使在我们删除了表示该属性是FunctionalProperty的三元组之后。在节点中:

public boolean canAs(t类)
{return canSupport(t);}
// ...
受保护的布尔支持(t类)
{
if(alreadyHasView(t))返回true;
if(getGraph()==null)返回false;
实现imp=getPersonality().getImplementation(t);
返回imp==null?false:imp.canWrap(asNode(),getGraph());
}
<