OWL本体中pellet推理机和HermiT推理机效率比较
本体推理引擎pellet和hermit都完成了OWLAPI的引擎接口的实现,但是到底那个推理机速度快?pellet是传统的推理机,hermit是比较新的开源的推理机,为了做个比较,笔者做了个实验。分别用两个推理机遍历一个比较大的本体的所有类,运行在同一台电脑上,除了采用的推理机不同,其余代码都相同,这样的比较就能够说明问题的。结果显示:
Hermit更胜一筹。
Hermit:所耗时间:10552ms
pellet:所耗时间:15083ms
所测试代码如下:
package org.coode.owlapi.examples;
import org.semanticweb.HermiT.Reasoner;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.reasoner.Node;
import org.semanticweb.owlapi.reasoner.NodeSet;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;
public class Tr {
public static OWLOntologyManager manager;
public static OWLOntology ontology;
public static OWLReasoner reasoner;
public final static void main(String[] args) throws Exception {
long t1 = System.currentTimeMillis();//开始计时
manager = OWLManager.createOWLOntologyManager();
ontology = manager.loadOntology(IRI.create("file:/d:/ontology.owl"));
//reasoner = PelletReasonerFactory.getInstance().createReasoner(ontology);// pellet推理机
reasoner=new Reasoner(ontology);//hermit推理机
Node<OWLClass> topNode = reasoner.getTopClassNode();
printnode(topNode);
long t2 = System.currentTimeMillis();//结束计时
System.out.println("所耗时间:"+(t2 - t1)+"ms");
}
public static void printnode(Node<OWLClass> nc) {
if (nc.isBottomNode()) {
return;
} else {
NodeSet<OWLClass> child = reasoner.getSubClasses(nc
.getRepresentativeElement(), true);
for (Node<OWLClass> c : child) {
if (!c.isBottomNode()) {
String ss = c.getEntities().toString();
System.out.println(ss.substring(ss.indexOf("#") + 1, ss
.length() - 2));
printnode(c);
}
}
}
}
}
测试所用的本体为10M多的大本体,这样可以增加说服力,当然随便一个OWL文件也可以用来测试推理机的速度。