上海小吃夜市:语义Web服务学习之路

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 03:51:33
语义Web服务学习之路  by51cto推荐博客 - ziapple2007-11-17 00:08:39
1---OWL Web本体语言描述  [ http://ziapple.blog.51cto.com/271886/50891 ]       OWL全称Ontology Web Language,是一种Web本体建模语言,她是在RDF基础之上发展起来的,由于RDF在语义描述上存在缺陷,所以OWL应运而生,OWL不是语义的终结,语义的复杂化使得不断有新的标准推出,实际上已经出现了替代OWL的版本,由于OWL是W3C推荐标准,并且与RDF有天然的联系,所以我们简单学习一下OWL。
具体语法可以参考http://www.transwiki.org/tw/owloverview.htm,如果你觉得繁体版看着别扭的化,推荐http://w3school.com.cn/rdf/rdf_owl.asp,该网站翻译比较全,而且还有实例。
如果你要学习Ontology的话,OWL是必不可少的环节,但OWL不是学习中的难点,如果你要对Ontology实际运用有个整体了解的话,可以跟随我学习下面的章节,我们姑且认为你已经学会了OWL的建模(其实我也不会,回头再学也不迟,关键是整体把握)。
2---OWL的应用   [ http://ziapple.blog.51cto.com/271886/51873 ]
前面假设你已经学会了OWL,本章主要讲述OWL具体如何应用,在此之前,你需要掌握
1.protege本体建模工具
2.racer推理机工具
掌握上面两种工具的思想及使用方法你就可以真正步入语义web服务的正轨了,请不要着急,作者会通过实例详细讲述两种工具的使用。今天比较晚了,今天只讲一些思想不讲实例,讲完我就睡。
1.protege是斯坦福大学ksl团队做的东西,其核心是基于知识管理的本体建模工具,她只负责建模不负责推理,建模包括:
1.Class(类)
2.Individual(实体)
3.Rules(规则)
这三者合起来就生成一个owl后缀的文件,所以,建立本体并不复杂,而且很多本体都已经建好了,建议大家在做owl之前先上这个网https://mailman.stanford.edu/pipermail/protege-owl/2006-September/000137.html看看有没有需要的本体,推荐参考如下文章http://protege.stanford.edu/doc/users_guide/这是官方网的使用手册,我从别人那里下了一份离线手册,传上去供大家分享。
2.推理机有很多种,最常见的是jena和racer,jess建议大家最好别用,太低级,jess和clisp是很简单的前向式推理那种,作者本科上专家决策时就学过。jena和racer的区别想了解的可以去g.cn(刚发现的google最短域名)搜一下,保证让你满意,这里用racer,racer可以去官网下http://www.racer-systems.com/,试用版需要注册一下,能下来,花点耐心收几次邮箱就可以了。
不要以为racer就是用来owl推理的,racer在owl以前就有,她有自己的racer格式,只不过owl比较流行racer就有了支持owl的版本。
就说到这,该睡了,其实离语义网已经很近了,接着你就离语义web服务就很近了。语义网有做好的例子,参考http://www.ksl.stanford.edu/people/dlm/webont/wineAgent/,是一个基于强大知识库的葡萄酒智能筛选的例子,这个例子除了源代码看不了外其他什么都可以看,这个作者以后也会详细介绍。
3-实例 [ http://ziapple.blog.51cto.com/271886/57621 ]
很长时间没跟大家分享经验了,写这篇文章的时候,离web语义学习之路2已经有一段时间了,一是没时间,二是最近也是在研究UDDI的东西,路3其实准备的比较仓促,但没有关系了,本来就是个人学习嘛。路3主要讲上会给大家推荐的WineAgent实例,仔细研究了它之后,发现http://www.ksl.stanford.edu/people/dlm/webont/wineAgent/里面涵盖的东西非常多,是一个非常不错的学习web语义的参考。wineAgent主要内容:
1.它采用JTP推理机来完成推理。
jtp是一个非常好的推理机,跟路2介绍的racer不一样,jtp是基于jena推理的,它的好处在于代码开源,完全是用java写的,非常方面我们用java来编程。
2.daml+oil实现
路2我们推荐的本体标准是owl,但这没有关系,daml和owl是一脉相承的,owl就是从daml的基础上发展而来的,而且daml可以很容易转换为owl,所以我们不用担心本体建模的问题。
在整个实现过程中,我们必须知道以下内容
1.owl语法,知道了owl你自然就知道了daml,这其实在我们的路1就已经说明了,另外建模的话大家可以多看看protege可视化建模工具,附件给大家分享一个protege中文入门手册,呵呵,转自别人的成果。
2.jtp语法,目前我还未找到任何关于jtp的详细语法介绍,但既然它是基于jena的,我想会jena语法的话,应该不是问题,本人观察了racer、jena的用户手册以及jtp的一些语法片段,发现推理机的语法几乎是一样的,所以我们学习路2的racer就足够了。附件中本人会附上racer的用户手册,手册有2个,给大家的是具体语法参考,另外一个是userGuide,由于文件大于2M上传不上,其实如果大家能吧racer试用版的下下来里面自带就有。
我的实例
JTP可以在这个网址http://www.ksl.stanford.edu/software/JTP/下载,里面也有很多说明,具体就不说了。里面包含如下内容

jtp-daml.sh和jtp-owl.sh是linux下的运行文件,jtp-daml.bat和jtp-owl.bat是windows下的执行文件,src是源代码,我们也可以不借助.bat运行环境,直接用java来构建推理机。以下是我做的
1.新建一个tomcat工程叫jtptest,把上图的lib下的包拷贝到web-inf/lib下,新建一个test.java,内容如下:
package org.bjtu;
import java.net.URL;
import jtp.*;
import jtp.context.daml.*;
import jtp.fol.*;
public class test
{
//定义知识库,即一个owl/daml文件位置。
public static final String KB_URL = "http://www.daml.org/2001/03/daml+oil-ex";
//public static final String DRC = "http://www.ksl.stanford.edu/software/jtp/drc.ser";
public static void main (String [] argv) throws Exception
{
DamlReasoningContext drc = new DamlReasoningContext();
drc.setUp();
drc.loadKB(new URL (KB_URL));
//推出Peter的年龄
ReasoningStepIterator rsi = drc.ask("(|http://www.daml.org/2001/03/daml+oil-ex#|::age |http://www.daml.org/2001/03/daml+oil-ex#|::|Peter| ?x)");
ReasoningStep rs = null;
while ((rs = rsi.next()) != null)
{
Literal lit = SubstUtils.deReferenceLiteral((Literal)rs.getGoal());
System.out.println("X = " + lit.getArgs().get(1));
}
}
}
运行java Application,结果如下:

4-一个组装web服务的例子 [ http://ziapple.blog.51cto.com/271886/59050 ]
这个例子是从网上一篇《一个用owl组装web服务的例子》的一个改进,OWL-S可以用来描述Web服务,也许对理解Web服务的组装有些作用。这个服务是对已有Web服务进行组装和执行,所以你并不需要发布自己的Web服务。你需要安装Protege和OWL-S Editor插件,我用的版本前者是3.1 beta build 191,后者是build 15,它们在一起运行得还不错。
所用的Web服务在http://www.bs-byg.dk/hashclass.wsdl,它包含两个方法:HashString和CheckHash,前者用指定编码方式(MD5、SHA1等等)对指定字符串编码,后者根据指定编码方式检查一个字符串(HashString)是否是另一个字符串(OriginString)的编码结果。我们将把这两个方法组装成一个服务,对输入的编码方式和待编码字符串先进行编码,然后检查编码的结果是否正确,如果正确返回true,否则返回false。
1、确认你的OWL-S Editor已经安装到Protege里,启动Protege,新建一个owl文件类型的工程,在菜单project->config里勾选上owls选项,按确定后Protege的主界面会多出一个OWL-S Editor页,接着安装graphviz,网上介绍了很多配置graphviz的方法,其实直接安装到C:\Program Files\ATT\graphviz就可以了。
声明:如果你安装不成功的话,那很有可能是版本的问题,笔者用protege3.3.1无论owls-editor用什么版本都不能用,害我调了一天也没调出来,protege3.2.1据说可以和owls-editor build17一起用。安装方法很简单,直接解压owls-editor到protege主目录plugins下。安装后如图1:

2、转到OWL-S Editor页,按左上角的WSDL按钮,在弹出的对话框里输入Web服务的地址http://www.bs-byg.dk/hashclass.wsdl,然后按回车,过一会儿在对话框里会显示出这个Web服务的信息,左边是Operations列表

3、因为每次只能import一个Operation,所以先选择HashString,然后按右下方的Import按钮,这时系统会提示要把生成的owls文件(扩展名为.owl)保存在一个位置,你可以选择任何位置。
说明:从wsdl转到owl可能会花上cpu一点时间,如果电脑没反应不是死机,等个几十秒一分钟应该就可以了。
4、使用同样的方法把CheckHash方法也导入进来,这样我们就有了两个可用于组装的Web服务了。如果你愿意的话,可以单独执行看看,方法是选择一个Service,然后按绿色的执行按钮。

5、现在开始组装它们。为此我们新建一个Service实例(按Create Service按钮)、一个Profile实例、一个CompositeProcess实例和一个WSDLGrounding实例,分别命名为myservice、myprofile、myprocess和mygrounding好了。
6、接下来把它们连接起来,首先选中myservice,把它的describedBy属性置为myprocess,presents属性置为myprofile,supports属性置为mygrounding。
7、现在对myprocess进行编辑,OWL-S Editor提供了一个可视化的编辑界面(Visual Editor),利用它可以很方便的定义CompositeProcess的各个步骤。选中myprocess,右边切换到Visual Editor,这里有一些粉红色的按钮用来定制流程。我们首先创建一个Sequence(表示按顺序执行),然后选中这个Sequence,创建两个Perform和一个Produce,每个Perform代表调用一个Web服务,而Produce的作用是在最后得到返回值。这时右边的图形应该像下面这样,因为我们尚未对Perform和Produce进行定制。

8、在图形的Perform/Produce节点上点一下就可以修改它的属性,先来修改第一个。点一下第一个矩形节点(第一个Perform),在对话框里把process属性设置为wi1:HashStringProcess(注意:如果导入WSDL时改变了前缀,这里就不是wi1),为了方便阅读,把Name属性改为hashPerform。类似的,第二个矩形节点的process属性应该是wi2:CheckHashProcess,Name则改为checkPerform;对于唯一的Produce节点,改名为produce。现在右边的图如下所示。

9、现在从Visual Editor切换到Properties页,在这里为myprocess定义输入和输出参数。它的输入应该是wi1:HashType和wi1:Str,而输出应该是wi2:CheckHashResult,也就是说,对于我们组装出来的Web服务来说,输入是编码类型和待编码字符串,而输出是验证结果。

10、上面我们定义了myprocess拥有的参数,现在就要用到它们了。切换回Visual Editor,在树型列表里选则第一个Perform(hashPerform),把右边切换到Properties页,现在ToParameter属性里还是空白,我们要把myprocess的输入映射到这个Perform,所以按添加按钮把两个输入参数(wi1:HashType和wi1:  Str)加到ToParameter里。选中它们中的一个,可以看到右边有BindingType选项,缺省为valueSource这一项,就用它即可,在下面的FromPerform下拉框里只有一个选项TheParentPerform,选中它。在最下面的FromParameter里选择和你选择的ToParameter项一样的那个选项(wi1:HashType->wi1:HashType,wi1:Str->wi1:Str)。

11、对于checkPerform,它有三个输入参数,我们希望HashType和hashPerform具有同样的值,所以它的设置和上一步里对HashType的设置一样;OriginalString的设置和上一步的Str一样;HashString属性是上一步得到的结果,所以FromPerform属性应该是hashPerform,FromParameter属性则是wi1:HashStringResult。

12、对produce的设置很简单,在ToParameter属性里加入我们要的结果wi2:CheckHashResult,FromPerform选checkPerform,FromParameter选wi2:CheckHashResult。现在,myprocess对应的process图如下所示。

13、对myprocess的设置到此就结束了,最困难的部分完成了,剩下的工作都很简单和显而易见。选中mygrounding,在它的hasAtomicProcessGrounding属性里加上wi1:HashStringAtomicProcessGrounding和wi2:CheckHashAtomicProcessGrounding。
14、现在myservice已经可以执行了(myprofile里还可以增加一些信息用来描述这个服务)。现在选中myservice,按下执行按钮,在弹出的对话框里HashType框填MD5,Str框填test(任意字符串都可以),然后按Execute按钮就会看到结果,当然,这个服务不论你输入什么字符串都会得到true值,原因不用我说了吧。