Rdf 如何使功能对象属性成为非功能对象属性?
当我试图用Jena的OntModel等API修改我的OWL文件时,我遇到了一个问题。原始OWL文件是: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
我想将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());
}
<