自言自语

I'm Wang Xianyuan, writing for myself, more studying, more experience…

小蛇、青蛙、癞蛤蟆

By

一条不懂事的美丽小蛇在水边看见了一只有着漂亮花纹、皮肤超好的青蛙,不禁生出了爱慕之心。
小蛇对青蛙说:我们可以交往吗?
青蛙说:好啊好啊。于是他们两个生活在了一起。
有一天,他们在睡觉的时候,小蛇在睡梦中不由自主地用身体将青蛙缠了起来,青蛙感觉要窒息了,就奋力挣扎,用两条强壮而有力的后腿重重地蹬在小蛇的腹部,弹了出去,然后迅速地逃走了,再也没有回来。
伤心的小蛇养好了身上的伤,却无法养好心中的伤,她对帅气漂亮的青蛙产生了恐惧感,认为会被伤害,从此她过着单身生活。
这一天,一只丑陋的癞蛤蟆发现了小蛇,觉得她十分美丽,不禁生出了爱慕之心。
癞蛤蟆对小蛇说:我们可以交往吗?
小蛇看了看丑陋的癞蛤蟆,觉得他的眼神很真诚,她那颗寂寞的心动摇了,她想这只癞蛤蟆这么丑陋,应该会好好珍惜她这么漂亮的小蛇的,于是她说:好吧好吧。于是他们两个生活在了一起。
有一天,他们在睡觉的时候,小蛇在睡梦中不由自主地用身体将癞蛤蟆缠了起来,癞蛤蟆感觉要窒息了,就奋力挣扎,他的背上喷出了毒汁,射进了小蛇的眼睛,小蛇受痛展开了身体,癞蛤蟆趁机逃走了,再也没有回来。

这个故事告诉我们:别以为只有帅哥才会伤害女孩,丑男一样会伤害女孩?
这个故事还告诉我们:适当的缠绵是可以的,但是如果你的性要求太频繁,给男人压力太大,那么男人会被你吓跑的。

蛇与龟

By

一条大蟒蛇和一条小毒蛇是朋友。
这天他们在路边发现了一只巨大的乌龟。
蛇兄弟想,这么大的个儿,可是一顿美餐啊。
蟒蛇说:我来对付他。
于是蟒蛇施展自己的绝技,用身体将大乌龟牢牢地缠住。
而大乌龟早已将身体缩进了壳里,任凭蟒蛇怎么缠绕,也无法伤害到大乌龟。
泄气的蟒蛇,气喘吁吁地爬到了一边。
大乌龟谨慎地露出脑袋,在他露出脑袋的那一瞬间,小毒蛇闪电般地在乌龟脑袋上咬了一口,大乌龟又急忙缩回壳中。
但是几分钟后,大乌龟因为中毒而死了。
蟒蛇说:哇!我花了那么大力气也没能伤害乌龟,你却轻而易举地办到了啊。
小毒蛇说:因为我了解他的要害。
可是接下来的还是有一个问题,大乌龟死后依然缩在壳里,两条蛇都是吞食性的动物,而他们又无法脱下乌龟的外壳,只好怏怏地离开了……

这个故事告诉我们:即使你擅长死缠烂打,也未必能泡到那个妞,要了解那个妞才可以。
这个故事还告诉我们:如果你无法脱下那个妞的衣服,就不要再花力气去泡她了。

博易QQ群满,开源社区进入筹备阶段

By

博易v1.5 发布以来的推广效果不错。昨天收到了 51asp.com 的友情链接合作请求,很快就给加上了。巧合的是他们的一个内部员工也准备做BlogEngine的本地化,因为种种原因没有继续。而看到我们的博易,他们表示十分的支持,并将尽最大努力支持我们的作为。对此我很感激他们。

昨天ChenBL联系我,告诉了我一个让我吃惊的消息。于是我Down了一份CVC来研究,发现这正是我们目前需要的。预计不久,博易就要开通开源社区了。
推广的这些天,博易的QQ群也快满员了,开通这个开源社区也是很有必要的!

什么是OWL本体

By

译注:本文是对文档A Practical Guide To Building OWL Ontologies Using The Protege-OWL Plugin and CO-ODE Tools Edition 1.0第三章的翻译,并省略了其中的图片。Protégé是一个斯坦福大学开发的本体编辑器,为开放源码软件,具有优秀的设计和众多的插件,是目前使用最广泛的本体编辑器之一。

什么是OWL本体
  我们使用本体(Ontology)来获取某一领域的知识,本体描述该领域的概念,以及这些概念之间的关系。目前有很多种不同的本体语言,它们各有千秋,而W3C(World Wide Web Consortium)目前的最新标准是OWL。和Protégé一样,OWL让描述各种概念成为可能,与此同时,它还提供了其他很多功能。它具有更丰富的操作符——例如与、或和非;它立足于一个不同的逻辑模型(logical model),该模型能够更好的定义概念,可以用从简单概念构造出复杂的概念,不仅如此,该模型还允许你使用推理机(reasoner)来检查本体中的陈述(statement)和定义(definition)是否一致,或者判断出哪个概念更适合于哪个概念,从而帮你维护一个正确的本体等等,当允许一个类(Class)拥有多个父类的时候,这一点至关重要。

一、三类OWL
  可以把OWL分为三个子语言:OWL-Lite、OWL-DL和OWL-Full,主要的分类依据就是它们的表达能力。其中,OWL-Lite是表达能力最弱的子语言,OWL-Full具有最强的表达能力,而OWL-DL的表达能力则在它们之间。我们可以认为OWL-DL是OWL-Lite的扩展,而OWL-Full是OWL-DL的扩展。

1.1 OWL-Lite
  从语法上来说,OWL-Lite是三个之中最简单的一个,当你的本体中类的层次结构很简单,并且只有简单的约束(constraint)时适合使用它来描述本体。例如,在需要把一个已存在的辞典(thesauri)移植到另一个差不多简单的概念层次时,OWL-Lite可以做得又快又好。

1.2 OWL-DL
  和OWL-Lite相比,OWL-DL的表达能力要丰富许多,它的基础是描述逻辑(Description Logics,即DL的由来)。描述逻辑是一阶逻辑(First Order Logic)的一个可判定的变种(译注:不一定准确,原文decidable fragment),因此可以用来进行自动推理,计算机从而可以知道本体中的分类层次,以及本体中的各种概念是否一致。

1.3 OWL-Full
  OWL-Full是OWL的三种子语言中表达能力最强的一个,适合在那些需要非常强的表达能力,而不用太关心可判定性(decidability)或是计算完全性的场合下使用。不过也正是由于表达能力太强这个原因,用OWL-Full表示的本体是不能进行自动推理的。

二、该使用哪一种子语言
  首先,要想确切的知道这三种子语言之间的区别,请参考OWL Web本体语言概要。尽管有很多因素需要考虑以决定该使用它们中的哪一个,但这里是一些最简单常用的原则。

对于OWL-Lite和OWL-DL,考虑OWL-Lite提供的那些简单构造子(construct)是否足以描述你的本体,若是使用OWL-Lite,否则使用OWL-DL。
对于OWL-DL和OWL-Full,考虑在你的应用中,是自动推理比较重要还是高表达能力(例如是否需要元类来建模)更重要,如果是前者,请使用OWL-DL,否则该使用OWL-Full。
  Protégé的OWL插件在编辑OWL-Lite和OWL-DL的本体时不做区分,但可以在选项里选择以OWL-DL或是OWL-Full方式编辑本体。

三、OWL本体的组成
  OWL本体的组成与Protégé提供的本体相似,基本上,只是在对组成部分的称呼有一些分别。例如OWL有个体(Individual)、属性(Property)和类(Class),而Protégé则分别称它们为实例(Instance)、槽(Slot)和类(Class)。

3.1 个体(Individual)
  个体代表(领域中)我们实际感兴趣的那些对象,Protégé和OWL有一个重要的区别就是OWL不使用唯一命名假设(Unique Name Assumption,UNA),也就是说,两个不同的名称可以对应到同一个个体。例如“伊丽莎白女王”、“女王”和“伊丽莎白?温莎”可能都对应同一个人。在OWL里,你必须明确的表达个体之间是否为相同的,否则它们可能相同也可能不相同。

  注:个体(Individual)有时也被称作实例(Instance),个体相当于类的实例。

3.2 属性(Property)
  属性是个体之间的二元关系,也就是说,属性把两个个体连接在一起。例如,属性hasSibling可能会把Matthew和Gemma这两个个体连接起来,而属性hasChild会把Peter和Matthew这两个个体连接起来;属性可以有反向属性(Inverse),例如hasOwner的反向属性是isOwnedBy;属性也可以被限制为只能拥有一个值,即所谓的函数属性(functional);属性还可以是具有传递性(transitive)或是对称的(symmetric)。

  注:这里所说的属性即Protégé中槽(Slot)的概念,在描述逻辑中它们就是角色(Role),在UML等面向对象方法中它们就是关系(Relation),而在GRAIL等形式化表达中将它们称作特性(Attribute)。

3.3 类(Class)
  OWL中的类代表一些个体的集合,OWL使用形式化(数学的)的方法精确描述出该类中成员必须具有的条件,例如,领域中全部猫的个体都属于Cat类。类可以通过继承关系组成层次结构,子类是父类中的特殊情况,例如考虑Animal和Cat这两个类,Cat可以是Animal的一个子类(即Animal是Cat的父类),这就表示了:所有的猫都是动物,所有Cat类的成员都是Animal类的成员,如果你是猫那么你也是动物,Cat类被Animal类所包含,等等。OWL-DL的一个重要特征就是父类和子类之间的(包含)关系可以被推理机自动计算出来。

  注:概念(Concept)这个词有时被用来代替类,实际上,类是概念的一个具体表现。

Posted in Digests, Study | Comments Off on 什么是OWL本体

Jena 简介

By

一、介绍Jena

Jena由 HP Labs(http://www.hpl.hp.com)开发的Java开发工具包, 用于Semantic Web(语义网)中的应用程序开发;Jana是开源的,在下载的文档中有Jena的完整代码。Jena框架主要包括:

a) 以RDF/XML、三元组形式读写RDF

资源描述框架是(RDF)是描述资源的一项标准(在技术上是W3C的推荐标准),Jena文档中有一部分详细介绍了RDF和Jena RDF API,其内容包括对Jena RDF包的介绍、RDF模型的创建、读写、查询等操作,以及RDF容器等的讨论。

b) RDFS,OWL,DAML+OIL等本体的操作

Jena框架包含一个本体子系统(Ontology Subsystem),它提供的API允许处理基于RDF的本体数据,也就是说,它支持OWL,DAML+OIL和RDFS。本体API与推理子系统结合可以从特定本体中提取信息,Jena 2还提供文档管理器(OntDocumentManager)以支持对导入本体的文档管理。

c) 利用数据库保存数据

Jena 2允许将数据存储到硬盘中,或者是OWL文件,或者是关系数据库中。本文处理的本体就是OWL文件读入的。

d) 查询模型  

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

e) 基于规则的推理

Jena 2支持基于规则的简单推理,其推理机制支持将推理器(inference reasoners)导入Jena,创建模型时将推理器与模型关联以实现推理。

Protégé是一个开源的本体编辑器(我们使用的版本是Protégé 3.2),用户可以在GUI环境下创建本体或者知识库。

 

二、Jena Ontology API

Jena2.4的Ontology API包含在ontology包(com.hp.hpl.jena.ontology)中,可以在目录 Jena-2.4srccomhphpljenaontology下查看所有程序的代码,Jena本体部分的说明网页是 Jena-2.4docontologyindex.html,本部分内容以及程序的编写主要参考这两个文档。

在语义网上有很多表示本体信息的本体语言,其中表达能力最强的是OWL,OWL按复杂程度分为 OWL Full、OWL DL和OWL Lite三个版本。其他的本体语言还有RDFS、DAML+OIL。Jena Ontology API为语义网应用程序开发者提供了一组独立于具体语言的一致编程接口。

Jena提供的接口本质上都是Java程序,也就是.java文件经过javac之后生成的.class文件。显然,class文件并不能提示本体创建使用的语言。为了区别于其他的表示方法,每种本体语言都有一个自己的框架(profile),它列出了这种语言使用的类(概念)和属性的构建方式和URI。因此,在DAML框架里,对象属性()的URI是daml:ObjectProperty,而在OWL框架里却是owl:ObjectProperty。RDFS并没有定义对象属性,所以在RDFS框架里,对象属性的URI是null。

在Jena中,这种框架通过参数的设置在创建时与本体模型(Ontology Model)绑定在一起。本体模型继承自Jena中的Model类。Model允许访问RDF数据集合中的陈述(Statements),OntModel对此进行了扩展,以便支持本体中的各种数据对象:类(classes)、属性(properties)、实例(个体individuals)。

 

本部分简单介绍要用到的几个java类或者接口。

1.本体模型OntModel

本体模型(OntModel)是对Jena RDF模型的扩展(继承自RDF模型),提供了处理本体数据的功能。使用Jena处理本体首先就是要建立一个本体模型,之后就能够通过本体模型中所定义的方法操作模型,比如导入子模型()、获取模型中本体的信息、操作本体属性以及将本体的表示输出到磁盘文件等等。Jena通过model包中的ModelFactory创建本体模型,ModelFactory是Jena提供用来创建各种模型的类,在类中定义了具体实现模型的成员数据以及创建模型的二十多种方法。一个最简单的创建本体模型的语句如下:

OntModel ontModel = ModelFactory.createOntologyModel();

该语句不含参数,应用默认设置创建一个本体模型ontModel,也就是说:它使用OWL语言、基于内存,支持RDFS推理。可以通过创建时应用模型类别(OntModelSpec)参数创建不同的模型,以实现不同语言不同类型不同推理层次的本体操作。例如,下面的语句创建了一个使用DAML语言内存本体模型。直观地讲,内存模型就是只在程序运行时存在的模型,它没有将数据写回磁盘文件或者数据库表。

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

更多类型设置可以参照OntModelSpec类中的数据成员的说明。

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

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

就是读取位于D盘相应目录下的Creature.owl文件以建立本体模型。Read方法也有很多重载,上面调用的方法以文件的绝对路径作为参数。其他的方法声明如下

read( String url );

read( Reader reader, String base );

read( InputStream reader, String base );

read( String url, String lang );

read( Reader reader, String base, String Lang );

read( InputStream reader, String base, String Lang );

 

2.文档管理器Document manager

本体文档管理器(OntDocumentManager)是用来帮助管理本体文档的类,它包含了导入本体文档创建本体模型、帮助缓存下载网络上的本体等功能。每个本体模型都有一个相关联的文档管理器。在创建本体模型时,可以创建独立的文档管理器并作为参数传递给模型工厂(ModelFactory)。文档管理器有非常多的配置选项,基本可以满足应用的需求。首先,每个文档管理器的参数都可以通过Java代码来设置(注:OntDocumentManager有五种重载的构造函数)。另外,文档管理器也可以在创建的时候从一个RDF格式的策略文件读取相应设定值。

下面的例子创建一个文档管理器并将它与以创建的本体模型关联。

OntModel m = ModelFactory.createOntologyModel();

OntDocumentManager dm = m.getDocumentManager();

 

3.接口OntClass

这个接口中定义了本体中与概念(也就是类Class)相关的操作,通过OntModel中的listClasses()便可以返回模型中的所有概念组成的迭代器(Iterator),然后调用OntClass的各种方法进行具体操作。OntoClass对概念之间的各种关系都有相应的定义方法,典型的有添加子类、添加约束、创建互斥概念、迭代返回某种类型的概念以及相关的逻辑判断等等。

 

4.基本本体类型OntResource

所有本体API中用于表示本体的类继承自OntResource,这样就可以在OntResource中放置所有类公用的功能,并可以为一般的方法设置通用的返回值。Java接口OntResource扩展了Jena的RDF资源接口,所以任何可以接受资源或者RDFNode的方法都可以接受OntResource,并且也就可以接受任何其他本体值。虽然这个类涵盖了涉及本体的所有类,在例子中并没有使用它。从Jena Java Doc可以获得它的详细信息。

 

三、例子

本文实现了一个简单的例子。通过Protégé 3.1创建一个TBT本体,并将其存储到OWL文件TBT.owl,然后使用和Jena通过读取该文件创建本体模型,实践Jena中的一些Ontology API。

jena.java主要是显示类的具体内容。没有涉及Jena的推理功能,没有实现属性的过滤,不能输出间接父类(父类的父类)或间接子类,等等。

清明到了,博易开通了虚拟主机业务

By

今天在博易首次尝试开通虚拟主机业务,这个套餐是按照中等级别的站长设计的,也不知道是否符合大家的胃口。

清明节已经到了,我祝博易的用户们出门踏青的玩好,留守在家的休息好!我呢,本来想和姐姐踏青的,可我积累了一个多星期的事情需要做,而两个项目又在这个周跟上,实在需要回一趟家上网做掉。玩的话,等五一再说吧,不远了,呵呵。