今天在尝试构建京剧本体的时候发现了一个问题,继而引发了一系列思考。
第一步,打开Protege,构建一个京剧本体,构建本体时起的名字是http://OperaOntology.owl,然后创建类,对象属性以及数据类型属性。
第二步,我创建了一个类OperaArtists,一个类是Show,一个属性agentIn,该属性用来描述演员参加了某场演出。
第三步,创建OperaArtists的实例,MeiLanFang和ShangXiaoYun,Show类的实例,BeijingOpera_100_Anniversary,对MeiLanFang和ShangXiaoYun两个实例分别添加对象属性,如下:
MeiLanFang agentIn BeijingOpera_100_Anniversary
ShangXiaoYun agentIn BeijingOpera_100_Anniversary
第四步,将上述本体架构以所创建的内容存盘,存盘时我选择的名字以及文件类型是:ShowRecord.owl
第五步,当我完成以上步骤后,到我指定的存储路径看了一下,没有OperaOntology.owl这个文件,只有ShowRecord.owl一个文件。
第六步,我打开Eclipse,创建一个Java工程,起名为QueryShowRecord,编写以下代码:
import com.hp.hpl.jena.ontology.OntDocumentManager;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.InfModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.reasoner.Reasoner;
import com.hp.hpl.jena.reasoner.ReasonerRegistry;
public class QueryShowRecord{
public static void QuerySelect(String select, String where, InfModel model){
Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
Query query = QueryFactory.create(select + where);
InfModel inf = ModelFactory.createInfModel(reasoner, model);
QueryExecution qe = QueryExecutionFactory.create(query, inf);
ResultSet results = qe.execSelect();
ResultSetFormatter.out(System.out,results,query);
}
public static void main(String args[]){
OntModel model = ModelFactory.createOntologyModel();
OntDocumentManager dm = model.getDocumentManager();
dm.addAltEntry("http://OperaOntology.owl#", "file:" + "OperaOntology.owl");
model.read("file:e:/ontologies/OperaOntology.owl");
String select = "select ?x ?agentIn ";
String where = "where { ?x " + "<http://OperaOntology.owl#agentIn> ?agentIn . }";
QuerySelect(select,where,model);
}
}
这是我第一次编写的代码,程序没有输出结果。
后来我把下面这句语句更改为:
dm.addAltEntry("http://OperaOntology.owl#", "file:" + "ShowRecord.owl");
model.read("file:e:/ontologies/ShowRecord.owl");
程序的输出结果就是我想要的了,也就是输出“所有参加了《京剧百年》演出的演员”。
第七步,通过解决以上问题,我发现我好象有点理解了什么是语义网。当我在构建一个本体时,第一步总是输入一个网站的地址,也就是一个http网址,比如http://OperaOntology.owl,然后我在这个本体里创建的每一个类,每一个属性,每一个类下面生成的实例都有一个唯一的URI,那么所有这些全体构成了一个网站,而这些URI之间彼此都是有联系的。比如“梅兰芳 出演 《京剧百年》”,其实这就是这三个URI之间的联系,也就是说这个三元组表示了一个陈述。那么这个语义网站里其实全是三元组,我可以将这些三元组存储在文件里,也可以存储在数据库里,然后对数据库里的数据进行查询。
在构建这个本体时,本体里有一个类是Document,而该类可以生成很多实例,那怎么对这些实例进行查询呢?