知识推理

2020-12-14 15:15:44 浏览数 (2)

参考链接: 从列表中移除满足Java中给定谓词元素

目录 

 本体知识推理简介与任务分类 

OWL本体语言 

知识推理任务 

OWL本体推理 

​ 实例化(materialization)的一个例子: 

OWL本体推理:不一致性检测 

OWL本体非标准推理:计算辩解 

 本体推理方法与工具介绍 

基于Tableaux运算的方法 

​  Tableaux运算的正确性 

相关工具简介 

​ 基于逻辑编程改写的方法 

相关工具介绍 

​ RDFox实践 

​ 

基于一阶查询重写的方法 

​ 相关工具介绍 

基于产生式规则的方法 

​ 产生式规则推理用于辅助证券交易 

相关工具介绍 

 实践展示: 使用Jena进行知识推理 

 本体知识推理简介与任务分类 

OWL本体语言 

 OWL本体语言 

 是知识图谱语言中最规范,最严谨,表达能力最强的语言 

 基于RDF语法,使表示出来的文档具有语义理解的结构基础 

 促进了统一词汇表的使用,定义了丰富的语义词汇 

 允许逻辑推理 

 语法 

 RDF语法,三元组 

 逻辑基础: 描述逻辑 

 描述逻辑系统 

 一个描述逻辑系统包括四个基本的组成部分 

1)最基本的元素:概念、关系和个体 

2)TBox术语集 (概念术语的公理集合) 

3)ABox断言集 (个体的断言集合) 

4)TBox和ABox上的推理机制 

 不同的描述逻辑系统的表示能力与推理机制由于对这四个组成部分的不同选择而不同。 

 概念 

 解释为一个领域的子集 

 例如,学生: x|student(x) 

 关系 

 解释为该领域上的二元关系(笛卡尔乘积) 

 例如,朋友: x, y |friend(x, y) 

 个体 

 一个领域内的实例 

 例如,小明: Ming 

 TBox——泛化的知识 

 描述概念和关系的知识,被称之为公理 (Axiom) 

 描述逻辑的公理可以用来定义术语,所以称为Terminological Box,简称Tbox 

 ABox——具体个体的信息 

 ABox包含外延知识 (又称断言 (Assertion)),描述论域中的特定个体 

描述逻辑的知识库K ≔ T, A , T即TBox, A即ABox 

 Tbox语言 

 定义: 引入概念以及关系的名称 

 例如,Mother,Person,has_child 

 包含: 声明包含关系的公理 

 例如, Mother ⊑ ∃has_child. Person 

 Abox语言 

 概念断言——表示一个对象是否属于某个概念 

 例如,Mother(Alice),Person(Bob) 

 关系断言——表示两个对象是否满足特定关系 

 例如,has_child(Alice, Bob) 

概念和概念,关系和概念之间可以组成更复杂的概念:交 (⊓),并(⊔),非 (¬),存在量词 (∃)和全称量词 (∀) 

 描述逻辑语义 

 解释I 是一个映射 

  给定解释I 

 TBox公理的模型 

 I ⊨ C ⊑ D 如果 C I  D I 

 I ⊨ R ⊑ S 如果 R I  S I 

 ABox断言的模型 

 I ⊨ C(a) 如果 a I  C I 

 I ⊨ R(a,b) 如果 (a I ,b I )  R I 

 描述逻辑语义 

 解释I是知识库K的模型,当且仅当I是K中每个公理或者断言的模型 

 若一个知识库K有一个模型,则称K是可满足的 

 若断言σ对于K的每个模型都是满足的,则称K逻辑蕴含σ,记为K ⊨ σ 

 对概念C,若K有一个模型I使得C I ≠ ∅,则称C是可满足的 

知识推理任务 

可满足性 (satisfiability) 

分类 (classification) 

实例化 (materialization) 

不一致性检测 

推理就是通过各种方法获取新的知识或者结论,这些知识和结论满足语义。 

OWL本体推理 

 可满足性 (satisfiability) 

 本体可满足性 

 检查一个本体是否可满足,即检查该本体是否有模型。如果本体不可满足,说明存在不一致 

 概念可满足性 

  检查某一概念的可满足性,即检查是否具有模型,使得针对该概念的解释不是空集 

 分类 (classification) 

 针对Tbox的推理,计算新的概念包含关系 

  实例化 (materialization) 

 实例化即计算属于某个概念或关系的所有实例的集合 

 实例化(materialization)的一个例子: 

一个兼并重组 (可以是业务兼并,不是收购)套利策略: 

策略思想: 与大盘股公司兼并重组的上市企业有很高的预期收益。 

∃merge.BigCapital ⊑ ValueSecurity 

定义什么是大盘股 (按照策略自己调整): 

上证50和沪深300指数中的标的属于大盘股。 

SZ50 ⊑ BigCapital, HS300 ⊑ BigCapital, SZ180 ⊑ HS300 

选股目标: 找出兼并重组策略下所有高预期公司:使用OWL的实例化推理 

一个兼并重组套利策略: 

∃merge.BigCapital ⊑ ValueSecurity 

SZ50 ⊑ BigCapital, HS300 ⊑ BigCapital, SZ180 ⊑ HS300 

选股目标: 找出兼并重组策略下所有高预期公司: 

merge(SZ300377, SH600570) 赢时胜和恒生电子在区块链方面有业务兼并 

SZ180(SH600570) 恒生电子是上证180的成分股 

推理: 

HS300(SH600570), BigCapital(SH600570), ValueSecurity(SZ300377) 

结论: SZ300377赢时胜在短期内是一家高收益公司。 

这本质上用基于消息面的套利,推理机可以完成复杂股票筛选的过程。 

OWL本体推理:不一致性检测 

• 不一致检测 : 

“不一致”也是本体错误的一种形式。在丰富与演化知识库的时候,我们需要声明不相交性的知识或者公理(disjointness)。比如我们若用A,B来分别代表概念“心脏病”和“脑科疾病”,那么我们便有如下的声明: 

A disjoin B 或者A ⊓ B ≡ ⫠ 

因为“心脏病”和“脑科疾病”肯定是不相交的集合。如果我们在构建知识库的时候,将“心内膜炎”这条知识既归为A的实例,又归为B的实例。那么这里就出现了一个“不一致”。对“不一致”进行检测也是提升知识库质量的重要一环。 

OWL本体非标准推理:计算辩解 

• 辩解是什么 :辩解原始本体当中可以解释结论的公理集 1 

• 利用辩解来修正知识库 : 

 通过分类,我们发现一个错误的事实“Meningitis⊑ ∃has-loc.Heart”,脑膜炎不可能发生在心脏。所以一定是原始本体有错。通过计算辩解,我们发现引起错误的原因是这条公理“Meningitis⊑HeartDisease”。遂修改之。 

 本体推理方法与工具介绍 

基于Tableaux运算的方法 

 Tableaux运算 

 适用场合 

 检查某一本体的可满足性,以及实例检测 

 基本思想 

 通过一系列规则构建Abox,以检测可满足性,或者检测某一实例是否存在于某概念 

 基本思想类似于一阶逻辑的归结反驳 

 Tableaux运算规则 ( 以主要DL算子举例 ) 

初始情况下, ∅ 是原始的Abox,迭代运用如下规则: 

⊓ -规则:若C⊓D(x) ∊ ∅, 且C(x),D(x)∉ ∅,则∅ :=∅∪{C(x),D(x)}; 

⊓ − -规则:若C x , D(x) ∊ ∅, 且C ⊓ D(x)∉ ∅,则∅ :=∅∪{C ⊓ D(x)}; 

∃-规则:若∃R.C x ∊ ∅, 且R(x,y),C(y)∉ ∅,则∅ :=∅∪{R(x,y),C(y)}, 

其中,y是新加进来的个体; 

∀-规则:若∀R.C x ∊ ∅, R(x,y) ∊ ∅ ,且C(y)∉ ∅,则∅ :=∅∪{C(y)}; 

⊑-规则:若C x ∊ ∅, C ⊑ D,且D(x)∉ ∅,则∅ :=∅∪{D(x)}; 

⊥-规则:若⊥ x ∊ ∅, 则拒绝∅ ; 

 Tableaux运算规则举例 

给定如下本体,检测实例Allen是否在Woman中? 

给定如下本体,检测是否可满足? 

  Tableaux运算的正确性 

 基于Herbrand模型 

 利用Tableaux算法构建的Abox本质上是该本体的Herbrand模型 

 一个本体的Herbrand模型与该本体任意模型的一个子集是同构的 

 拒绝Herbrand模型,就是拒绝了本体的所有模型,因此该本体一定是不可满足的 

 无法拒绝Herbrand模型,那么该模型本身就是本体的一个模型;只要本体有模型,那么一定是可满足的 

相关工具简介 

 FaCT  

 曼彻斯特大学开发的描述逻辑推理机 

 使用C 实现,且能与Protégé 集成 

 Java版本名为Jfact,基于OWL API 

 使用举例 

构建推理机 

OWLReasonerFactory reasonerFactory = new JFactFactory(); 

OWLReasoner reasoner = this.reasonerFactory.createReasoner(ontology); 

进行推理 (分类) 

reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY); 

 Racer 

 美国Franz Inc.公司开发的以描述逻辑为基础的本体推理,也可以用作语义知识库 

 支持OWL DL,支持部分OWL 2 DL 

 支持单机和客户端/服务器两种模式 

 用Allegro Common Lisp实现 

 使用举例 

进行TBox推理 

(classify-tbox &optional (tbox (current-tbox))) 

进行ABox推理 

(realize-abox &optional (abox (current-abox))) 

 Pellet 

https://github.com/stardog-union/pellet 

 马里兰大学开发的本体推理机 

 支持OWL DL的所有特性,包括枚举类和XML数据类型的推理 

 支持OWL API以及Jena的接口 

 使用举例 

构建一个推理机 

PelletReasoner reasoner =PelletReasonerFactory.getInstance().createReasoner(ontology); 

通过查询接口进行推理 

NodeSet<OWLNamedIndividual> individuals =reasoner.getInstances(Person, true); 

 HermiT 

 牛津大学开发的本体推理机 

 基于hypertableau运算,更加高效 

 支持OWL 2规则 

 使用举例 

构建一个推理机 

Reasoner hermit = new Reasoner(ontology); 

一致性检测 

System.out.println(hermit.isConsistent()); 

相关工具总结 

 基于逻辑编程改写的方法 

 规则推理 

 本体推理的局限: 

(1) 仅支持预定义的本体公理上的推理(无法针对自定义的词汇支持灵活推理) 

(2) 用户无法定义自己的推理过程 

 引入规则推理 

(1) 可以根据特定的场景定制规则,以实现用户自定义的推理过程 

(2) Datalog语言可以结合本体推理和规则推理 

 Datalog语言 

 面向知识库和数据库设计的逻辑语言,表达能力与OWL相当,支持递归 

 便于撰写规则,实现推理 

 Datalog语法 

 原子 (Atom) 

 p t 1 , t 2 , ... , t n 

 其中p是谓词,n是目数,t i 是项 (变量或常量) 

 例如:has_child(X, Y) 

 规则 (Rule) 

 H: −B 1 , B 2 , ... , B m . 

 由原子构建,其中H是头部原子, B 1 , B 2 , ... , B m 是体部原子 

 例如:has_child X, Y : −has_son X, Y . 

 事实 (Fact) 

 F c 1 , c 2 , ... , c n : − 

 没有体部且没有变量的规则 

 例如:has_child Alice, Bob : − 

 Datalog程序是规则的集合 

 例如: 

Datalog程序P: 

has_child X, Y : −has_son X, Y . 

has_child Alice, Bob : − 

 Datalog推理举例 

相关工具介绍 

 KAON2 

 OWL推理机、本体管理API 

 基于一阶消解原理 

 针对大规模ABox进行优化 

 使用举例 

创建本体 

OntologyManager ontologyManager=KAON2Manager.newOntologyManager(); 

Ontology ontology=ontologyManager.createOntology("http://kaon2.semanticweb.org/example04",new 

HashMap<String,Object>()); 

创建推理机 

Reasoner reasoner=ontology.createReasoner(); 

并用于查询 

Query whatDoPeopleKnowAbout=reasoner.createQuery(new Literal[] { 

KAON2Manager.factory().literal(true,person,new Term[] { X }), 

KAON2Manager.factory().literal(true,personKnowsAboutTopic,new Term[] { X,Y }), 

},new Variable[] { X,Y}); 

  RDFox 

https://www.cs.ox.ac.uk/isg/tools/RDFox/ 

 由牛津大学开发的可扩展、跨平台、基于内存的 

RDF三元组存储系统 

 支持并行Datalog推理、SPARQL查询 

 使用举例 

创建本体与存储 

OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 

OWLOntology ontology =manager.loadOntologyFromOntologyDocument(IRI.create(“test.owl")); 

DataStore store = new DataStore(DataStore.StoreType.ParallelSimpleNN, true); 

导入本体进行推理 

store.importOntology(ontology); 

store.applyReasoning(); 

相关工具简介 

 RDFox实践 

 本体、数据格式 

 命名空间 

 finance: http://www.example.org/kse/finance# 

 URI 

 http://www.example.org/kse/finance#孙宏斌 

 使用命名空间简写为 finance:孙宏斌 

 三元组 

 finance:融创中国 rdf:type finance:地产事业 

  本体 (Tbox) 

  数据 (Abox) 

  自定义规则 

1)执掌一家公司就一定是这家公司的股东; 

2)某人同时是两家公司的股东,那么这两家公司一定有关联交易; 

 形式化为 

finance:hold_share(X,Y) :- finance:control(X,Y). 

finance:conn_trans(Y,Z) :- finance:hold_share(X,Y), finance:hold_share(X,Z). 

RDFox实战 

 代码 (Java) 

 数据导入 

  代码 (Java) 

 推理 

  结果输出 

基于一阶查询重写的方法 

 查询重写的目的 

 高效地结合不同数据格式的数据源 

 重写方法关联起了不同的查询语言 

 一阶查询 

q(x) ← worksFor( x, y ),Project( y ) 

 具有一阶逻辑形式的查询语言 

 Datalog是数据库的一种查询语言,同时具有一阶逻辑形式 

 针对本体基于一阶查询进行重写 

 以Datalog语言为中间语言,首先重写SPARQL语言为Datalog,再将Datalog重写为SQL查询 

  查询重写举例 

给定如下本体,查询所有研究人员及其所从事的项目? 

Coordinator 

⊑ Researcher 

⊑ Researcher 

∃worksFor− ⊑ Project 

∃worksFor 

Researcher 

Project 

∃name− 

⊑ ∃worksFor 

⊑ ∃worksFor− 

SELECT ?r ?p 

WHERE { 

?r exp:worksFor ?p. 

?p rdf:type exp:Project. 

⊑ xsd:String 

Researcher ⊑ ∃name 

Project ⊑ ∃name 

用户输入如上SPAQRL语言 

  查询重写举例 

步骤一:重写为Datalog查询 

 步骤二:将数据库关系表达式映射成Datalog原子 

 步骤三:将从SPARQL以及数据库重写过来的Datalog规则整合进行查询 

 相关工具介绍 

 Ontop 

最先进的OBDA系统 

兼容RDFS、OWL 2 QL、R2RML、SPARQL标准 

支持主流关系数据库:Oracle、MySQL、SQL Server、Postgres 

开源 (Apache License 2.0) 

基于产生式规则的方法 

 产生式系统 

Feigenbaum研制的化学分子结构专家系统DENDRAL,Shortliffe研制的的诊断感染性疾病的专家系统MYCIN... 

 一种前向推理系统,可以按照一定机制执行规则从而达到某些目标,与一阶逻辑类似,也有区别 

 应用 

 自动规划 

 专家系统 

 产生式系统的组成 

 事实集合 (Working Memory) 

 产生式/规则集合 

 推理引擎 

 事实集/运行内存 (Working Memory, WM) 

 事实 (WME)的集合 

 用于存储当前系统中所有事实 

 事实 (Working Memory Element, WME) 

 描述对象 

 形如(type attr 1 : val 1 attr 2 : val 2 ... attr n : val n ),其中type, attr i , val i 均为原子 (常量)类比类和对象 

 例如: (student name: Alice age: 24) 

 描述关系 (Refication) 

 例如:(basicFact relation: olderThan firstArg: John secondArg: Alice)简记为(olderThan John Alice) 

 产生式集合 (Production Memory, PM) 

 产生式的集合 

 产生式 

 IF conditions THEN actions 

 conditions是由条件组成的集合,又称为LHS 

 actions是由动作组成的序列,又称为RHS 

 LHS 

 条件 (condition)的集合,各条件之间是且的关系 

 当LHS中所有条件均被满足,则该规则触发 

 每个条件形如 (type attr 1 : spec 1 attr 2 : spec 2 ... attr n : spec n ) 

 其中spec i 表示对attr i 的约束,形式可取下列中的一种 

原子,如:Alice 

变量,如:x (斜体) 

表达式,如:[n 4] 

布尔测试,如:{> 10} 

约束的与、或、非操作 

 RHS 

 动作 (action)的序列,执行时依次执行 

 动作的种类如下: 

 ADD pattern 

 向WM中加入形如pattern的WME 

 REMOVE i 

 从WM中移除当前规则第i个条件匹配的WME 

 MODIFY i (attr spec) 

 对于当前规则第i个条件匹配的WME,将其对应于attr属性的值改为spec 

 产生式规则推理用于辅助证券交易 

 推理引擎 

 控制系统的执行 

 模式匹配 

 用规则的条件部分匹配事实集中的事实,整个LHS都被满足的规则被触发,并被加入议程(agenda) 

 解决冲突 

 按一定的策略从被触发的多条规则中选择一条 

 执行动作 

 执行被选择出来的规则的RHS,从而对WM进行一定的操作 

该步骤是产生式系统的核心,具体算法在后面介绍 

产生式系统=事实集 产生式集合 推理引擎 

 产生式系统执行流程 

  模式匹配 

 用每条规则的条件部分匹配当前WM 

(type x y , subClassOf y z ⇒ ADD (type x z) 

 模式匹配 

 RETE算法 

 1979年由Charles Forgy (CMU)提出 

 将产生式的LHS组织成判别网络形式 

 用空间换时间 

  模式匹配 

 RETE算法 

  冲突解决 

 从被触发的多条规则中选择一条 

 常见策略 

 随机选择 在推理的场景下,被触发的多条规则可全被执行 

 从被触发的规则中随机选择一条执行 

 具体性 (specificity) 

 选择最具体的规则 

Student name: x ⇒ ⋯ 

Student name: x age: 20 ⇒ ⋯ 

 新近程度 (recency) 

 选择最近没有被触发的规则执行动作 

相关工具介绍 

 Drools 

rule “name” 

attributes 

when 

LHS 

then 

RHS 

end 

 商用规则管理系统,其中提供了一个规则推理引擎 

 核心算法基于RETE算法改进 

 提供规则定义语言,支持嵌入Java代码 

 使用举例 

创建容器与会话 

KieServices ks = KieServices.Factory.get(); 

KieContainer kContainer = ks.getKieClasspathContainer(); 

KieSession kSession = kContainer.newKieSession("ksession-rules"); 

触发规则 

kSession.fireAllRules(); 

 Jena 

  RDF4J (原Sesame) 

  GraphDB (原OWLIM) 

 相关工具总结 

 Drools实践 

  输入 

 TBox与ABox均以三元组的形式输入 

 创建Triple类,每个三元组都以该类的对象输入 

实例 

  自定义规则 

  DRL文件示例 

  Drools工程结构 

 代码示例 

 结果输出 

注: 此处推理结果与RDFox略有不同是因为Drools只进行规则推理 

 实践展示: 使用Jena进行知识推理 

 使用Jena完成示例图谱知识上的上下位推理、缺失类别补全和一致性检测等 

 构建本体 

其本质上就是Jena中的知识库结构 

 Model: Jena最核心的数据结构 

构建一个最简单的Model 

Model myMod = ModelFactory.createDefaultModel(); 

定义我们这个例子的命名空间 

String finance = “http://www.example.org/kse/finance#”; 

定义一个个体 

Resource shb = myMod.createResource(finance "孙宏斌"); 

Resource rczg = myMod.createResource(finance "融创中国"); 

定义一个关系 

Property control = myMod.createProperty(finance "执掌"); 

往知识库中加入三元组 

myMod.add(shb, control, rczg); 

知识库中的部分三元组: 

finance :孙宏斌 finance :control finance :融创中国 

finance :贾跃亭 finance :control finance :乐视网 

finance :融创中国 rdf:type finance :地产公司 

finance :地产公司 rdfs:subclassOf finance:公司 

finance:公司 rdfs:subclassOf finance:法人实体 

finance:孙宏斌 rdf:type finance:公司 

finance:孙宏斌 rdf:type finance:人 

finance :人 owl:disjointWith finance:公司 

 添加推理机 

 Model: 最核心的数据结构 

构建一个含推理功能的Model 

Model myMod = ModelFactory.createDefaultModel(); 

String finance = “http://www.example.org/kse/finance#”; 

Resource shb = myMod.createResource(finance, “孙宏斌"); 

Resource rczg = myMod.createResource(finance, “融创中国"); 

Property control = myMod.createProperty(finance, “执掌"); 

... // 添加三元组,代码省略 

InfModel inf_rdfs = ModelFactory.createRDFSModel(myMod); 

实际上在原来的Model之上加了个 RDFS 推理机 

 上下位推理 

查询的同时已经做出了推理! 

 查询触发推理 查询输入类别s和o之间有无上下位关系 

  添加推理机 

 OWL推理: 构建OWL推理机 

构建一个含OWL推理功能的Model 

Model myMod = ModelFactory.createDefaultModel(); 

Reasoner reasoner = ReasonerRegistry.getOWLReasoner(); 

InfModel inf_owl = ModelFactory.createInfModel(reasoner, myMod); 

在普通的Model之上加了个 OWL 推理机 

 针对类别的推理 

 类别补全 

  不一致检测 

 通过validate接口检测不一致 

生成data的不一致检测报告 

Model data = FileManager.get().loadModel(fname); 

Reasoner reasoner = ReasonerRegistry.getOWLReasoner(); 

InfModel inf_owl = ModelFactory.createInfModel(reasoner, myMod); 

ValidityReport validity = inf_owl.validate(); 

这里检测不一致基于OWL推理机 

 通过validate接口检测不一致 

打印不一致具体信息 

if (validity.isValid()) { 

System.out.println(“没有不一致"); 

} else { 

System.out.println(“存在不一致,如下:"); 

for (Iterator i = validity.getReports(); i.hasNext(); ) { 

System.out.println(" - " i.next()); 

}

1 人点赞