知识图谱之知识推理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangfengling1023/article/details/82226563

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

知识推理的任务:

可满足性

分类

实例化

 

1)可满足性

本体可满足性:如男性和女性的交集为空,即不存在一个人既是男,也是女。若小明既是男,又是女,小明这个本体就是不可满足的本体

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

2)分类

与机器学习中的分类不同

如母亲是女性的一个子类,女性是人类的一个子类,则母亲是人类的一个子类

3)实例化

 

推理的例子:

图谱结构:

 

下面的代码知识知识库中的部分三元组:

package jena;

import org.apache.jena.rdf.model.*;

import org.apache.jena.reasoner.Reasoner;

import org.apache.jena.reasoner.ReasonerRegistry;

import org.apache.jena.reasoner.ValidityReport;

import org.apache.jena.util.PrintUtil;

import org.apache.jena.vocabulary.OWL;

import org.apache.jena.vocabulary.RDF;

import org.apache.jena.vocabulary.RDFS;

import java.util.Iterator;

public class Jena_tutorial_2 {

public static void main(String[] args) {

//Model:Jena最核心的数据结构,其本质就是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);

myMod.add(myMod.createResource(finance+"贾跃亭"), control, myMod.createResource(finance+"乐视网"));// 贾跃亭 执掌 乐视网

myMod.add(myMod.createResource(finance+"融创中国"), RDF.type, myMod.createResource(finance+"地产公司"));// 融创中国 是一种地产公司

myMod.add(myMod.createResource(finance+"地产公司"), RDFS.subClassOf, myMod.createResource(finance+"公司"));

        myMod.add(myMod.createResource(finance+"公司"), RDFS.subClassOf, myMod.createResource(finance+"法人实体"));

        myMod.add(myMod.createResource(finance+"孙宏斌"), RDF.type, myMod.createResource(finance+"公司"));

        myMod.add(myMod.createResource(finance+"孙宏斌"), RDF.type, myMod.createResource(finance+"人"));

        myMod.add(myMod.createResource(finance+"人"), OWL.disjointWith, myMod.createResource(finance+"公司"));

        // 创建RDFS推理机

        InfModel inf_rdfs = ModelFactory.createRDFSModel(myMod);

        // 创建OWL推理机 在普通的Model之上加了一个OWL推理机

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

        Reasoner reasoner = ReasonerRegistry.getOWLReasoner();

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

        // 查询原模型中 地产公司 与 法人实体 之间是否存在上下位关系

// 查询输入类别s和o之间有无上下位关系

        Jena_tutorial_2.subClassOf(inf_rdfs, myMod.getResource(finance+"地产公司"), myMod.getResource(finance+"法人实体"));

Jena_tutorial_2.subClassOf(inf_rdfs, myMod.getResource(finance+"融创中国"), myMod.getResource(finance+"法人实体"));

        // 类别补全,输出推理后 融创中国 的类型

        printStatements(inf_owl, rczg, RDF.type, null);

        // 不一致检测   通过validate接口检测不一致

        ValidityReport validity = inf_owl.validate();

        if (validity.isValid()) {

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

        } else {

            System.out.println("Conflicts");//存在不一致性

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

                ValidityReport.Report report = (ValidityReport.Report)i.next();

                System.out.println(" - " + report);

            }

        }

    }

    /**

     * 查询输入资源s与o之间是否存在上下位关系,存在则输出 yes,否则输出 no

     * @param m - 模型

     * @param s - 资源1

     * @param o - 资源2

     */

    public static void subClassOf(Model m, Resource s, Resource o) {

        // 遍历模型中的三元组

        for (StmtIterator i = m.listStatements(s, RDFS.subClassOf, o); i.hasNext(); ) {

            Statement stmt = i.nextStatement();

            System.out.println("yes!" );

            return;

        }

        System.out.println("no!");

    }

    /**

     * 输出模型m中满足给定模式的三元组

     */

    public static void printStatements(Model m, Resource s, Property p, Resource o) {

        for (StmtIterator i = m.listStatements(s,p,o); i.hasNext(); ) {

            Statement stmt = i.nextStatement();

            System.out.println(" - " + PrintUtil.print(stmt));

        }

    }

}

OWL推理机可以针对个体类别做出玩呗推理,即补充完整该个体的所有类别,在查询的时候,可以直接打印出所有的类别

上述的代码运行之后的结果如下所示:

 

RDF/RDFs中通过rdfs:range定义了属性的值域,该值域是全局性的,无法说明该属性应用于某些具体的类时具有的特殊值域限制

同道者可以互相交流哦

猜你喜欢

转载自blog.csdn.net/yangfengling1023/article/details/82226563