jena推理

jena推理

1.本体

本体概念
本体(Ontology)首先是哲学上提出来的,简单来说就是一种概念,如人这个概念集合,它是一种抽象集合用来表达世界上的具体的实际的物体,而在人工只能领域上我们主要将本体论的观念用在知识表达上,即借由本体论中的基本元素:概念及概念间的关连,作为描述真实世界的知识模型。当我们输入鱼这个名词,我们知道鱼是一种动物且居住在水里。

本体语言
本体用来描述特定领域中的相关知识,主要包括该领域中的概念和这些概念直接的关系,本体描述语言不同,知识描述的性能也各有区别。基于Web标准的本体描述语言包括RDF,RDF(S),OIL,DAML,和OWL等,本实验中采用OWL语言构建本体。

本体要素
OWL的本体构成要素包括:

  1. 类:类与面向对象中的类概念相似,是指本体中的一些实例集合,这些实例具有共同的抽象属性。本体中的类也有子类、父类继承关系,继承关系可以应用于推理机制。
  2. 属性:属性包括数据属性和对象属性,其中对象属性又可以称为实例之间的关系。数据属性是指个体的属性是数据值,例如中国银行的公司地址;对象属性是指个体的属性是另一个对象,例如贵州茅台的董事长。
  3. 实例:实例是指类的实例化个体,个体是领域中我们要扑捉的各个对象,例如三一重工、贵州茅台都是“公司”类的实例,梁稳根、袁仁国则都是“董事长”类的实例。

本体构建
在本体构建时,比较著名的软件有Protégé等,Protégé工具的特点是独立于特定的语言,可以导入和导出多种基于Web的本体描述语言格式(如XML,RDF(S),OWL等),支持本体开发生命周期中的大多数活动,并且因为都是基于组件的结构,很容易通过添加新的模块来提供更多的功能,具有良好的可扩展性。
但protégé最大的缺陷在于不能批量导入数据,构建大规模本体费时费力,手工输入错误率比较高,效率较低。当数据非常大时使用Protégé会非常的耗时耗力,靠人工创建所有本体是不现实的。因此用程序操作本体是很必要的。Jena是惠普公司开发的一套操作本体的程序。

2.jena

Jena框架
Jena框架主要包括:

  • 以RDF/XML、三元组形式读写RDF
  • RDFS,OWL,DAML+OIL等本体的操作
  • 利用数据库保存数据
  • 查询模型
  • 基于规则的推理

RDF操作
Jena是一个Java API,可用于创建和操作RDF图。

static String personURI    = "http://somewhere/JohnSmith";
static String fullName     = "John Smith";
Model model = ModelFactory.createDefaultModel();	//创建一个空的模型
Resource johnSmith = model.createResource(personURI);	//创建资源
johnSmith.addProperty(VCARD.FN, fullName);	//添加fullName属性

如下图所示,通过上述操作,可以生成一个RDF资源,并用统一资源标识符(URI)标识,在本例中用“http://…/JohnSmith”来表示。资源有属性,在本例中生成了一个属性名为fullName的属性。
jena推理_第1张图片

本体操作
本体模型(OntModel)是对Jena RDF模型的扩展,提供了处理本体数据的功能。使用Jena处理本体首先就是要建立一个本体模型,之后就能够通过本体模型中所定义的方法操作模型。

OntModel ontModel = ModelFactory.createOntologyModel();	//创建本体模型

下面的语句创建了一个使用DAML语言内存本体模型。直观地讲,内存模型就是只在程序运行时存在的模型,它没有将数据写回磁盘文件或者数据库表。

OntModel ontModel = ModelFactory.createOntologyModel( OntModelSpec.DAML_MEM );

我们所使用的本体是从OWL文件获得的,也就是说,是从磁盘读取的。读取的方法是调用Jena OntoModel提供的Read方法。

ontModel.read("file:D:/temp/Creatrue/Creature.owl");

下面通过一个例子展示如何对本体进行各种操作。
定义一个类作为模型中Animal类的等等价类,并添加注释。

OntClass cls = ontModel.createClass(":DongwuClass");
cls.addComment("the EquivalentClass of Animal...", "EN");

通过完整的URI取得模型中的Animal类。

OntClass oc = ontModel.
getOntClass("http://www.owl-ontologies.com/marine.owl#Animal");
oc.addEquivalentClass(cls);	 // 将先前定义的类添加为Animal的等价类

迭代显示模型中的类,在迭代过程中完成各种操作。

for (Iterator i = ontModel.listClasses(); i.hasNext();) {
OntClass c = (OntClass) i.next();	 // 返回类型强制转换
if (!c.isAnon()) { 	// 如果不是匿名类,则打印类的名字
System.out.print("Class");
// 获取类的URI并输出,在输出时对URI做了简化(将命名空间前缀省略)
System.out.println(c.getModel().getGraph().
getPrefixMapping().shortForm(c.getURI()));
}

本体持久化到数据库
本体存储在OWL或RDF文件中,在对本体进行操作时没有使用数据库进行操作方便,因此可以将本体持久化到数据库中。具体的流程是将本体从OWL文件中读出,建立一个数据库的连接,将Model存入数据库。操作如下:

IDBConnection con = getConnection(url, user, pwd, db);
Class.forName(driver);	//创建数据库连接
String path = “your owl file path”;	//owl文件路径
createModel(con, “model name”, path);	//创建模型连接到数据库
con.close();

本体查询
Jena提供了ARQ查询引擎,它实现SPARQL查询语言和RDQL,从而支持对模型的查询。另外,查询引擎与关系数据库相关联,这使得查询存储在关系数据库中的本体时能够达到更高的效率。

SELECT ?subject ?o ?object 
WHERE { ?subject    "John Smith" }

如上所示,”?subject”表示的是三元组的head,“?O”表示的是relation,“?object”表示的是三元组的tail。通过上述sqarql语句可以查询全名为John Smith的人是谁。

3.jena推理

本体推理规则库
本体的推理规则库是由一条条规则组成的。每条规则由主体(body)和头(head)组成,一条规则可以有一个主体和一个头,例如规则:[rule1:(?a fa:hasHusband ?b)(?a fa:isMotherOf ?c)->(?b fa:isFatherOf ?c)],其中规则的主体为:?a @hasHusband ?b,?a @isMotherOf ?c,头为:?b @isFatherOf ?c,也就是说有所有的主体可以推出头。?a @hasHusband ?b,?a @isMotherOf ?c,?b @isFatherOf ?c三者有一个称谓:ClauseEntry。

Jena推理支持
Jena支持基于规则的简单推理,其推理机制支持将推理器(inference reasoners)导入Jena,创建模型时将推理器与模型关联以实现推理。
应用程序通常使用将ModelFactory 数据集与某个推理器相关联来创建新模型来访问推理机制。对创建的模型的查询不仅会返回原始数据中存在的那些语句,还会返回使用规则或由推理器实现的其他推理机制从数据派生的其他语句。

Jena推理实现
首先我们连接数据库,获取推理的本体。

Class.forName(strDriver);
IDBConnection conn = getConnection(strURL, strUser, strPassWord,strDB);
OntModel model = getModelFromRDB(conn, MODLE_NAME);

然后创建一个推理机。

String file=RULE_URL+“.rule”;		//推理规则库
Reasoner reasoner=new GenericRuleReasoner(Rule.rulesFromURL(file));	//创建推理机

然后我们创建一个推理的本体模型,其中InfModel是对常规Model的扩展,支持任何相关的推理能力。

InfModel infmodel=ModelFactory.createInfModel(reasoner, model); 

最后执行查询语句,程序将会首先查询不经过推理的结果,然后在根据推理规则库进行推理查询

QueryExecution qe = QueryExecutionFactory.create(query, infmodel);	//查询

jena的推理库需要jena2.6.4版本的包
下载链接:https://pan.baidu.com/s/1YIKOJcKGQA8-8ZRL1WQikQ
提取码:e850

你可能感兴趣的:(知识图谱推理)