Class 使用OWL Api或Jena Api将基本类转换为定义的类

Class 使用OWL Api或Jena Api将基本类转换为定义的类,class,owl,primitive,protege,defined,Class,Owl,Primitive,Protege,Defined,我使用的是owlapi和jenaapi 我需要将一个基本类转换为一个已定义的类 我在使用Protege,我想这样做: (我是stackoverflow的新手,我不能发布图片,但我放置了链接。) 我有一个类“TestClassInstan”,它是“TestClass”的子类,有一个限制“hasURL”,如图[one]所示: [一] 我想将该类和该属性转换为已定义的类。然后得到这个结果,一个定义的类,其属性等价,如图[2]所示: [二] 谢谢你的帮助 在owlapi中,不需要任何特殊转换来将一个基

我使用的是owlapi和jenaapi

我需要将一个基本类转换为一个已定义的类

我在使用Protege,我想这样做:

(我是stackoverflow的新手,我不能发布图片,但我放置了链接。)

我有一个类“TestClassInstan”,它是“TestClass”的子类,有一个限制“hasURL”,如图[one]所示:

[一]

我想将该类和该属性转换为已定义的类。然后得到这个结果,一个定义的类,其属性等价,如图[2]所示:

[二]


谢谢你的帮助

在owlapi中,不需要任何特殊转换来将一个基本概念转换为一个已定义的概念。只需添加定义类的公理即可。例如,如果
A
是您的类,并且您希望将其定义为等同于存在限制,如
some r C
,则您只需创建一个公理:

Set<OWLClassExpression> arguments=new HashSet<OWLClassExpression>();
arguments.add(A);
arguments.add(dataFactory.getOWLObjectSomeValuesFrom(r, C);
OWLAxiom axiom = dataFactory.getOWLEquivalentClassesAxiom(arguments);

问题中的图片有点难以理解,因此要清楚地说,在第一个问题中,有两条公理

TestClassInstan子类(hasURL“http”)
TestClassInstan子类

您希望删除这两个公理,并用一个公理替换它们

TestClassInstan等效类(TestClass(hasURL“http”)

已经展示了如何使用OWLAPI实现这一点。这个答案将展示如何使用Jena来完成。和接口实际上提供了您需要的几乎所有方法。唯一棘手的一点可能是构造构成交集的类的RDFList,尽管在本例中并不难(它只是TestClassInstan的原始超类列表)。下面是完成转换的Java代码。这还包括在代码中重建本体,因为您没有提供实际的本体代码。答案是不必要的,但它可能会有帮助,并且它使这段代码独立运行

import com.hp.hpl.jena.ontology.OntClass;
导入com.hp.hpl.jena.ontology.OntModel;
导入com.hp.hpl.jena.ontology.OntModelSpec;
导入com.hp.hpl.jena.ontology.ontroperty;
导入com.hp.hpl.jena.rdf.model.ModelFactory;
导入com.hp.hpl.jena.rdf.model.RDFList;
导入com.hp.hpl.jena.util.iterator.ExtendedIterator;
公共类Converter子类到EquivalentIntersection{
最终静态字符串NS=”https://stackoverflow.com/a/21001185/1281433/";
公共静态void main(字符串[]args){
//获取原始模型,并展示它(只是为了更好地测量,所以
//我们可以比较它们)。
最终OntModel模型=createOriginalModel();
model.write(System.out,“RDF/XML-ABBREV”);
//获取要转换的类。
OntClass testClassInstan=model.createClass(NS+“testClassInstan”);
//要创建交集类,我们需要
//超类,我们可以从超类中创建一个超类
//迭代器。
最终RDFList超类=model.createList(testClassInstan.listSuperClasses(true));
addEquivalentClass(model.createIntersectionClass(null,超类));
//我们仍然需要删除那些超类。
for(ExtendedIterator sups=testClassInstan.listSuperClasses(true);sups.hasNext();){
removeSuperClass(sups.next());
}
//写出新模型。您可以将其写入文件而不是System.out,
//当然,这就是将模型保存回文件的方法。
model.write(System.out,“RDF/XML-ABBREV”);
}
/**
*重新创建具有以下公理的原始本体(和
*适当的类别和属性声明):

* *TestClassInstan TestClass的子类 *TestClassInstan子类(hasURL值“http”) * *@返回本体模型 */ 私有静态OntModel createOriginalModel(){ 最终的OntModel模型=ModelFactory.createOntologyModel(OntModelSpec.OWL\u DL\u MEM); final OntClass testClass=model.createClass(NS+“testClass”); final OntClass testClassInstan=model.createClass(NS+“testClassInstan”); addSuperClass(testClass); final OntProperty hasURL=model.createDatatypeProperty(NS+“hasURL”); 最终OntClass hasURLValueHttp=model.createHasValueRestriction(null,hasURL,model.createLiteral(“http”); addSuperClass(hasURLValueHttp); 收益模型; } }
原始本体是:


http

转换后的本体是:


http

您真的要转换(即删除以前的定义并用新定义替换)还是只创建定义的类?我要转换。你能告诉我怎么做吗?要将一个定义更改为一个新的定义,你需要删除定义类的axiom并添加新的定义。我试着这样做,代码如下:[code]类classAlpha是这样的:[class]但它不起作用,没有做任何更改​​在类或本体中。你能告诉我代码出了什么问题吗?在Protégé示例中,看起来原始的子类公理被删除了,我已经将它们包括在了中。添加新的等价类axiom不会删除早期的子类axiom,对吗?正确,要更改现有定义,首先需要删除相应的axiom。我没有将其添加到我的示例中,因为问题是“primitive class”,
ontologyManager.saveOntology(ontology)