前言

本文依据"The Description Logic Handbookd"中Appendxi1 Description Terminology中基本的描述逻辑构造,考察Jena对这些构造的支持,以自说明的代码片段予以说明。

内容

1 概念构造

2 关系构造

3 公理构造

1 概念构造

概念构造的具体语法

package constructor;

import java.util.List;

import com.hp.hpl.jena.ontology.AllValuesFromRestriction;
import com.hp.hpl.jena.ontology.CardinalityRestriction;
import com.hp.hpl.jena.ontology.ComplementClass;
import com.hp.hpl.jena.ontology.EnumeratedClass;
import com.hp.hpl.jena.ontology.HasValueRestriction;
import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.ontology.IntersectionClass;
import com.hp.hpl.jena.ontology.MaxCardinalityRestriction;
import com.hp.hpl.jena.ontology.MinCardinalityRestriction;
import com.hp.hpl.jena.ontology.ObjectProperty;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.ontology.SomeValuesFromRestriction;
import com.hp.hpl.jena.ontology.UnionClass;
import com.hp.hpl.jena.ontology.impl.OWLProfile;
import com.hp.hpl.jena.rdf.model.InfModel;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFList;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.ResIterator;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.reasoner.Reasoner;
import com.hp.hpl.jena.reasoner.ReasonerRegistry;
import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.OWL2;

public class ConceptConstruct {

    public static void main(String[] args) {
        String ns = "http://jena/demo/constructors/concept";
        OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM, null);
        // (1) Top
        System.out.println("(1)");
        OWLProfile owlProfile = new OWLProfile();
        Resource top = owlProfile.THING();
        System.out.println(top);

        // (2) Bottom
        System.out.println("(2)");
        Resource bottom = owlProfile.NOTHING();
        System.out.println(bottom);

        // (3) Intersection: C = A and B
        System.out.println("(3)");
        OntClass aClass = ontModel.createClass(ns + "A");
        System.out.println(aClass);
        OntClass bClass = ontModel.createClass(ns + "B");
        RDFNode[] nodes = new RDFNode[] { aClass, bClass };
        RDFList members = ontModel.createList(nodes);
        IntersectionClass intersection = ontModel.createIntersectionClass(ns + "C", members);
        System.out.println(intersection);
        List<? extends OntClass> operands = intersection.listOperands().toList();
        for (OntClass operand : operands) {
            System.out.println(operand);
        }
        Property operator = intersection.operator();
        System.out.println(operator);// http://www.w3.org/2002/07/owl#intersectionOf

        // (4) Union: D = A or B
        System.out.println("(4)");
        UnionClass union = ontModel.createUnionClass(ns + "D", ontModel.createList(new RDFNode[] { bClass, aClass }));
        System.out.println(union);
        operands = union.listOperands().toList();// BooleanClassDescription
        for (OntClass operand : operands) {
            System.out.println(operand);
        }
        operator = union.operator();
        System.out.println(operator);// http://www.w3.org/2002/07/owl#unionOf

        // (5) Negation: E = not A
        System.out.println("(5)");
        ComplementClass negation = ontModel.createComplementClass(ns + "E", aClass);
        System.out.println(negation);
        operands = negation.listOperands().toList();
        for (OntClass operand : operands) {
            System.out.println(operand);
        }
        operator = negation.operator();
        System.out.println(operator);// http://www.w3.org/2002/07/owl#complementOf

        // (6) Value restriction: G = all R.A
        System.out.println("(6)");
        ObjectProperty role = ontModel.createObjectProperty(ns + "R");
        System.out.println(role);
        AllValuesFromRestriction valueRestriction = ontModel.createAllValuesFromRestriction(ns + "G", role, aClass);
        System.out.println(valueRestriction);
        System.out.println(valueRestriction.getAllValuesFrom());
        System.out.println(valueRestriction.getOnProperty());
        // list all restrictions
        // List<Restriction> restrictions = ontModel.listRestrictions().toList();
        // for (Restriction restriction : restrictions) {
        // System.out.println(restriction);
        // }

        // (7) Limited existential quantification: H = some R
        System.out.println("(7)");
        SomeValuesFromRestriction limitedExistentialQuantification = ontModel.createSomeValuesFromRestriction(ns + "H", role, top);
        System.out.println(limitedExistentialQuantification);
        System.out.println(limitedExistentialQuantification.getSomeValuesFrom());
        System.out.println(limitedExistentialQuantification.getOnProperty());

        // (8) Existential quantification: I = some R A
        System.out.println("(8)");
        SomeValuesFromRestriction existentialQuantification = ontModel.createSomeValuesFromRestriction(ns + "I", role, aClass);
        System.out.println(existentialQuantification);
        System.out.println(existentialQuantification.getSomeValuesFrom());
        System.out.println(existentialQuantification.getOnProperty());

        // (9) At-least number restriction: J = at-least n R
        System.out.println("(9)");
        int cardinality = 2;
        MinCardinalityRestriction atLeastNumberRestriction = ontModel.createMinCardinalityRestriction(ns + "J", role, cardinality);
        System.out.println(atLeastNumberRestriction);
        System.out.println(atLeastNumberRestriction.getMinCardinality());
        System.out.println(atLeastNumberRestriction.getOnProperty());

        // (10) At-most number restriction: K = at-least n R
        System.out.println("(10)");
        MaxCardinalityRestriction atMosttNumberRestriction = ontModel.createMaxCardinalityRestriction(ns + "K", role, cardinality);
        System.out.println(atMosttNumberRestriction);
        System.out.println(atMosttNumberRestriction.getMaxCardinality());
        System.out.println(atMosttNumberRestriction.getOnProperty());

        // (11) Exact number restriction: L = exactly n R
        System.out.println("(11)");
        CardinalityRestriction exactNumberRestriction = ontModel.createCardinalityRestriction(ns + "L", role, cardinality);
        System.out.println(exactNumberRestriction);
        System.out.println(exactNumberRestriction.getCardinality());
        System.out.println(exactNumberRestriction.getOnProperty());

        // (12) Qualified at-least restriction : M = at-least n R A, OntModelSpec.OWL_DL_MEM不支持
        System.out.println("(12)");
        // (13) Qualified at-most restriction: N = at-most n R A, OntModelSpec.OWL_DL_MEM不支持
        System.out.println("(13)");
        // (14) Qualified exact restriction: O = exactly n R A, OntModelSpec.OWL_DL_MEM不支持
        System.out.println("(14)");

        // (15) Same-as, agreement: i1 = i2
        System.out.println("(15)");
        Individual i1 = ontModel.createIndividual(ns + "i1", aClass);
        Individual i2 = ontModel.createIndividual(ns + "i2", aClass);
        i1.addSameAs(i2);
        // navigate
        ResIterator sameIter = ontModel.listSubjectsWithProperty(OWL2.sameAs);
        while (sameIter.hasNext()) {
            Resource sameAsLeft = sameIter.next();
            System.out.println(sameAsLeft);
            System.out.println(sameAsLeft.as(Individual.class).getSameAs());
        }

        // (16) Role-value-map: subset R1 R2
        System.out.println("(16)");
        ObjectProperty role2 = ontModel.createObjectProperty(ns + "R2");
        role.addSuperProperty(role2);
        System.out.println(role.getSuperProperty());

        // (17) Role fillers: P = fillers R i1 i2
        System.out.println("(17)");
        HasValueRestriction hasValueRestriction = ontModel.createHasValueRestriction(null, role, i1);
        HasValueRestriction hasValueRestriction2 = ontModel.createHasValueRestriction(null, role, i2);
        OntClass pClass = ontModel.createClass(ns + "P");
        pClass.addEquivalentClass(ontModel.createIntersectionClass(null,
                ontModel.createList(new RDFNode[] { hasValueRestriction, hasValueRestriction2 })));
        System.out.println(pClass.getEquivalentClass());// 匿名

        // (18) One-of: Q = {i1, i2}
        System.out.println("(18)");
        EnumeratedClass oneOf = ontModel.createEnumeratedClass(ns + "Q", ontModel.createList(new RDFNode[] { i1, i2 }));
        List<? extends OntResource> instances = oneOf.listOneOf().toList();
        for (OntResource instance : instances) {
            System.out.println(instance);
        }
    }

    public static InfModel bindReasoner(Model model) {
        Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
        reasoner = reasoner.bindSchema(model);
        return ModelFactory.createInfModel(reasoner, model);
    }

    public static OntClass createCardinalityQRestriction(OntModel model, String uri, Property prop, int cardinality, OntClass clas) {
        OntClass klass = model.createCardinalityRestriction(uri, prop, cardinality);
        klass.removeAll(OWL.cardinality);
        klass.addLiteral(OWL2.qualifiedCardinality, cardinality);
        klass.addProperty(OWL2.onClass, clas);
        return klass;
    }
}

Jena暂不支持存在量词约束(qualified at-least/at-most/exact)的直接构造,采用下述URL中方法支持该构造的RDF序列化

http://mail-archives.apache.org/mod_mbox/jena-users/201303.mbox/%3CCA+Q4Jn=bDM2wiPSh4DHj58hzxR_oWx2jJoQxnroFScac=E7t3Q@mail.gmail.com%3E

2 关系构造

关系构造的具体语法

package constructor;

import com.hp.hpl.jena.ontology.ObjectProperty;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.TransitiveProperty;
import com.hp.hpl.jena.ontology.impl.OWLProfile;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;

/**
 * TransitiveProperty ,FunctionalProperty ,SymmetricProperty,InverseFunctionalProperty
 */
public class RoleConstruct {

    public static void main(String[] args) {
        String ns = "http://jena/demo/constructors/role#";
        OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM, null);
        // (1) Universal role
        System.out.println("(1)");
        OWLProfile owlProfile = new OWLProfile();
        Resource topObjectProperty = owlProfile.OBJECT_PROPERTY();
        Resource topDatatypeProperty = owlProfile.DATATYPE_PROPERTY();
        System.out.println(topObjectProperty);
        System.out.println(topDatatypeProperty);

        // (2) Intersection: r = atomR1 and atomR2
        System.out.println("(2)");

        // (3) Union
        System.out.println("(3)");

        // (4) Complement
        System.out.println("(4)");

        // (5) Inverse
        System.out.println("(5)");
        ObjectProperty r = ontModel.createObjectProperty(ns + "r");
        ObjectProperty inverse_r = ontModel.createObjectProperty(ns + "ir");
        r.addInverseOf(inverse_r);
        System.out.println(inverse_r);
        System.out.println(inverse_r.getInverse());
        System.out.println(r.getInverse());// null

        // (6) Composition
        System.out.println("(6)");

        // (7) Transitive closure
        System.out.println("(7)");
        TransitiveProperty tr = ontModel.createTransitiveProperty(ns + "tr");
        System.out.println(tr);
        System.out.println(tr.isTransitiveProperty());

        // (8) Reflexive-transitive closure
        System.out.println("(8)");

        // (9) Role Restriction
        System.out.println("(9)");
        ObjectProperty rrest = ontModel.createObjectProperty(ns + "rrest");
        OntClass aClass = ontModel.createClass(ns + "A");
        rrest.addRange(aClass);
        System.out.println(rrest);
        System.out.println(rrest.getRange());

        // (10) Identity
        System.out.println("(10)");

    }

}

同OWL规范一样,Jena将关系划分对象属性(ObjectProperty)和数值属性(DatatypeProperty),显式支持传递属性TransitiveProperty, 函数属性FunctionalProperty, 对称属性SymmetricProperty, 逆函数属性InverseFunctionalProperty。

不支持关系与/并/补、关系链(role chain)、类标识(Identity)构造。、

3 公理构造

公理的具体语法

package constructor;

import java.util.List;

import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.ontology.ObjectProperty;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Statement;

public class AxiomConstruct {

    public static void main(String[] args) {
        String ns = "http://jena/demo/constructors/axiom#";
        OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM, null);
        // (1) Concept definition
        System.out.println("(1)");
        OntClass aClass1 = ontModel.createClass(ns + "A1");
        OntClass cClass1 = ontModel.createClass(ns + "C1");
        aClass1.addEquivalentClass(cClass1);
        System.out.println(aClass1.getEquivalentClass());
        System.out.println(cClass1.getEquivalentClass());

        // (2) Primitive concept introduction
        System.out.println("(2)");
        OntClass aClass2 = ontModel.createClass(ns + "A2");
        OntClass cClass2 = ontModel.createClass(ns + "C2");
        aClass2.addSuperClass(cClass2);
        System.out.println(aClass2.getSuperClass());
        System.out.println(cClass2.getSubClass());

        // (3) General inclusion axiom
        System.out.println("(3)");
        // mostly like (2)

        // (4) Role definition
        System.out.println("(4)");
        ObjectProperty r11 = ontModel.createObjectProperty(ns + "r11");
        ObjectProperty r12 = ontModel.createObjectProperty(ns + "r12");
        r11.addEquivalentProperty(r12);
        System.out.println(r11.getEquivalentProperty());
        System.out.println(r12.getEquivalentProperty());

        // (5) Primitive role introduction
        System.out.println("(5)");
        ObjectProperty r21 = ontModel.createObjectProperty(ns + "r21");
        ObjectProperty r22 = ontModel.createObjectProperty(ns + "r22");
        r21.addSuperProperty(r22);
        System.out.println(r21.getSuperProperty());
        System.out.println(r22.getSubProperty());

        // (6) Concept assertion
        System.out.println("(6)");
        OntClass concept = ontModel.createClass(ns + "C");
        Individual indv = concept.createIndividual(ns + "c1");
        System.out.println(indv.getOntClass());
        List<? extends OntResource> indvs = concept.listInstances().toList();
        for (OntResource ind : indvs) {
            System.out.println(ind);
        }

        // (7) Role assertion
        System.out.println("(7)");
        ObjectProperty role = ontModel.createObjectProperty(ns + "R");
        OntClass roleDomain = ontModel.createClass(ns + "Domain");
        Individual d1 = roleDomain.createIndividual(ns + "domain1");
        OntClass roleRange = ontModel.createClass(ns + "Range");
        Individual r1 = roleRange.createIndividual(ns + "range1");
        role.addDomain(roleDomain);
        role.addRange(roleRange);
        Statement stmt = ontModel.createStatement(d1, role, r1);
        System.out.println(stmt);
        ontModel.add(stmt);
    }

}

Jena可以构建描述逻辑公理构造。

Jena对描述逻辑构造的支持的更多相关文章

  1. 描述逻辑(DL)基础知识

    Logic逻辑理论实际上是一个规范性(normative)的理论,而不是一个描述性的(descriptive)理论.即,它并不是用来描述人类究竟是采用何种的形式来推理的,而是来研究人类应该如何有效的进 ...

  2. Odoo 12 开发手册指南(八)—— 业务逻辑 – 业务流程的支持

    在前面的文章中,我们学习了模型层.如何创建应用数据结构以及如何使用 ORM API 来存储查看数据.本文中我们将利用前面所学的模型和记录集知识实现应用中常用的业务逻辑模式. 本文的主要内容有: 以文件 ...

  3. 第八章 Odoo 12开发之业务逻辑 - 业务流程的支持

    在前面的文章中,我们学习了模型层.如何创建应用数据结构以及如何使用 ORM API 来存储查看数据.本文中我们将利用前面所学的模型和记录集知识实现应用中常用的业务逻辑模式. 本文的主要内容有: 以文件 ...

  4. EnumHelper.cs枚举助手(枚举描述信息多语言支持)C#

    C#里面经常会用到枚举类型,枚举是值类型对象,如果你想用枚举类型的多属性特性,或者你想在MVC页面上通过简单的值类型转换,将某字段值所代表的含义转换为文字显示,这时候必须要将枚举扩展,是它支持文本描述 ...

  5. CMWAP上网补丁描述文件!!支持ios9

    由于ios移动4G使用cmnet网络,某些情况下需要使用cmwap,因此就有了这些文字... 两个网址都可以: http://www.clore.net/iphone/cmwap.html https ...

  6. 使用openSSL构造一个支持https的nodejs服务器

    首先通过下面的链接下载openSSL https://slproweb.com/products/Win32OpenSSL.html 下载完毕后,执行openssl进入交互式界面: 使用命令生成pri ...

  7. 最小栈问题:题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

    MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.get ...

  8. Outline of Apache Jena Notes

    1 description 这篇是语义网应用框架Apache Jena学习记录的索引. 初始动机见Apache Jena - A Bootstrap 2 Content 内容组织基本上遵循Jena首页 ...

  9. Jena语义Web开发101

    2015/05/28更新 代码在 https://github.com/zhoujiagen/semanticWebTutorialUsingJena 前言 该手册参考和扩展“Hebeler J, F ...

随机推荐

  1. java关于时间

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created b ...

  2. Install Google Pinyin on Ubuntu 14.04

    Install Google Pinyin on Ubuntu 14.04 I've been spending more and more time on Ubuntu and I'm not us ...

  3. css模块化策略

    为什么要模块化? 分治和复用 封装,不污染全局,不被全局污染. 继承 BEM(block:块,Element:元素,Modifier:修饰符)策略 .block__Element--Modifier ...

  4. 深入浅出设计模式——组合模式(Composite Pattern)

    模式动机 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象,如子文件夹和文件)并调用执行.(递归调用)由于容 ...

  5. 《BI那点儿事》数据流转换——透视

    这个和T-SQL中的PIVOT和UNPIVOT的作用是一样的.数据透视转换可以将数据规范或使它在报表中更具可读性. 通过透视列值的输入数据,透视转换将规范的数据集转变成规范程度稍低.但更为简洁的版本. ...

  6. 《BI项目笔记》多维数据集中度量值设计时的聚合函数

    Microsoft SQL Server Analysis Services 提供了几种函数,用来针对包含在度量值组中的维度聚合度量值.默认情况下,度量值按每个维度进行求和.但是,通过 Aggrega ...

  7. 转!!mybatis在xml文件中处理大于号小于号的方法

    第一种方法: 用了转义字符把>和<替换掉,然后就没有问题了. SELECT * FROM test WHERE 1 = 1 AND start_date  <= CURRENT_DA ...

  8. Linux 下 git连接github的使用

    1.安装git sudo apt-get install git 2.创建github帐号 3.Linux创建SSH密钥: ssh-keygen  //一直默认 4.将公钥加入到Github账户信息A ...

  9. Codeforces #369 div2 D.Directed Roads

    D. Directed Roads time limit per test2 seconds memory limit per test256 megabytes inputstandard inpu ...

  10. 贪心算法 hdu 1009

    1.因为要排序只派j[i]/f[i],不能知道f[i]和j[i]各自排序后的顺序,因此要用到结构体 2.用sort(ware,ware+n,cmp) cmp 为俩个数组的元素比较大小的布尔值 #inc ...