Jena对描述逻辑构造的支持
前言
本文依据"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对描述逻辑构造的支持的更多相关文章
- 描述逻辑(DL)基础知识
Logic逻辑理论实际上是一个规范性(normative)的理论,而不是一个描述性的(descriptive)理论.即,它并不是用来描述人类究竟是采用何种的形式来推理的,而是来研究人类应该如何有效的进 ...
- Odoo 12 开发手册指南(八)—— 业务逻辑 – 业务流程的支持
在前面的文章中,我们学习了模型层.如何创建应用数据结构以及如何使用 ORM API 来存储查看数据.本文中我们将利用前面所学的模型和记录集知识实现应用中常用的业务逻辑模式. 本文的主要内容有: 以文件 ...
- 第八章 Odoo 12开发之业务逻辑 - 业务流程的支持
在前面的文章中,我们学习了模型层.如何创建应用数据结构以及如何使用 ORM API 来存储查看数据.本文中我们将利用前面所学的模型和记录集知识实现应用中常用的业务逻辑模式. 本文的主要内容有: 以文件 ...
- EnumHelper.cs枚举助手(枚举描述信息多语言支持)C#
C#里面经常会用到枚举类型,枚举是值类型对象,如果你想用枚举类型的多属性特性,或者你想在MVC页面上通过简单的值类型转换,将某字段值所代表的含义转换为文字显示,这时候必须要将枚举扩展,是它支持文本描述 ...
- CMWAP上网补丁描述文件!!支持ios9
由于ios移动4G使用cmnet网络,某些情况下需要使用cmwap,因此就有了这些文字... 两个网址都可以: http://www.clore.net/iphone/cmwap.html https ...
- 使用openSSL构造一个支持https的nodejs服务器
首先通过下面的链接下载openSSL https://slproweb.com/products/Win32OpenSSL.html 下载完毕后,执行openssl进入交互式界面: 使用命令生成pri ...
- 最小栈问题:题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.get ...
- Outline of Apache Jena Notes
1 description 这篇是语义网应用框架Apache Jena学习记录的索引. 初始动机见Apache Jena - A Bootstrap 2 Content 内容组织基本上遵循Jena首页 ...
- Jena语义Web开发101
2015/05/28更新 代码在 https://github.com/zhoujiagen/semanticWebTutorialUsingJena 前言 该手册参考和扩展“Hebeler J, F ...
随机推荐
- C#带小括号的运算
计算类的封装 jisuan.cs using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- C++11带来的优雅语法
C++11带来的优雅语法 自动类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作; auto是在编译时对变量进行了 ...
- 一步一步学习underscore的封装和扩展方式
前言 underscore虽然有点过时,这些年要慢慢被Lodash给淘汰或合并. 但通过看它的源码,还是能学到一个库的封装和扩展方式. 第一步,不污染全局环境. ES5中的JS作用域是函数作用域. 函 ...
- ThinkPHP 3.2 模板中的Angularjs 的变量{{$first}} 无法被解析
ThinkPHP 3.2 模板中的Angularjs 的变量"{{$first}}" 无法被解析, 模板解析冲突,例如在angularjs 的变量"{{$first}}& ...
- timer控件、三级联动
timer控件: 实现时间日期自增长: using System; using System.Collections.Generic; using System.ComponentModel; usi ...
- 学习mongo系列(四) find().pretty() remove() 查询
一.find() 方法以非结构化的方式来显示所有文档.如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:db.collection_name.find().pretty ...
- Delphi TDatabase 组件
TDatabase 组件是一个能与远程数据库通过 BDE 建立连接的组件,可使本地端的程序获取远程的数据. 通过 TDatabase 组件的使用,可以减少与远程数据库连接的窗口,当远程数据库的设置变动 ...
- Spring <bean> 参数意义
1.id bean的唯一标识, 2.class 类的完全限定名, 3.parent 父类bean定义的名字. 如果没有任何声明,会使用父bean,但是也可以重写父类.重写父类时,子bean 必须与父b ...
- 实现文本框默认灰色文字,点击消失,如果没输入内容可再返回原来的灰色文字(js版)
$(document).ready(function(){ $("#biaoqian").val('这里是默认的灰色文字'); $("#biaoqian").c ...
- python中requests
#发送无参数的get请求import requests def get_html(url): res = requests.get(url) return res.text #发送无参数的post请求 ...