以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  语义web服务中本体的作用  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=74281)


--  作者:lixiaoming
--  发布时间:4/17/2009 10:57:00 AM

--  语义web服务中本体的作用
从axis构建web服务到转换成owl-s以后,感觉了一下这个本体的作用,但不知道理解的对不对,请高手指教,owl-s是web服务的本体语言,owl是知识库的本体语言(自己的理解),用owl构造一个领域本体(owl结构上类似于rdfs),然后在生成的owl-s的服务本体文件中就可以使用owl构造的领域本体里面的概念和属性来描述自己的服务了,举个例子:
现在有一个关于旅游的知识库的本体owl
<?xml version="1.0"?>
<rdf:RDF
    xmlns="http://keg.cs.tsinghua.edu.cn/ontology/travel#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
  xml:base="http://keg.cs.tsinghua.edu.cn/ontology/travel">
  <owl:Ontology rdf:about=""/>
  <owl:Class rdf:ID="CarNum">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="CarDomain"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="Date">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="DomainIndependent"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="#CarDomain">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="SubDomain"/>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:ID="ReserveConfirm">
    <rdfs:subClassOf>
      <owl:Class rdf:ID="ConfirmInfo"/>
    </rdfs:subClassOf>
  </owl:Class>
.....................................................
(这个不是我小气,是因为这是实验室的资料,所以不方便说太多)
接着我做了一个旅游方面的服务(checkhotel.owl这个服务文件)这里贴出主要的部分:
<grounding:wsdlInputMessageParts rdf:parseType="Collection">
                  <grounding:wsdlMessageMap>
                    <grounding:wsdlMessagePart>hotelarea</grounding:wsdlMessagePart>
                    <grounding:owlsParameter>
                      <process:Input rdf:ID="in0">
                        <rdfs:label>hotelarea</rdfs:label>
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#Address"/>
                      </process:Input>
                    </grounding:owlsParameter>
                  </grounding:wsdlMessageMap>
                  <grounding:wsdlMessageMap>
                    <grounding:wsdlMessagePart>entrancedate</grounding:wsdlMessagePart>
                    <grounding:owlsParameter>
                      <process:Input rdf:ID="in1">
                        <rdfs:label>entrancedate</rdfs:label>
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#Date"/>
                      </process:Input>
                    </grounding:owlsParameter>
                  </grounding:wsdlMessageMap>
                  <grounding:wsdlMessageMap>
                    <grounding:owlsParameter>
                      <process:Input rdf:ID="in2">
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#HotelType"/>
                        <rdfs:label>hotelgrade</rdfs:label>
                      </process:Input>
                    </grounding:owlsParameter>
                    <grounding:wsdlMessagePart>hotelgrade</grounding:wsdlMessagePart>
                  </grounding:wsdlMessageMap>
                  <grounding:wsdlMessageMap>
                    <grounding:owlsParameter>
                      <process:Input rdf:ID="in3">
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#RoomType"/>
                        <rdfs:label>roomgrade</rdfs:label>
                      </process:Input>
                    </grounding:owlsParameter>
                    <grounding:wsdlMessagePart>roomgrade</grounding:wsdlMessagePart>
                  </grounding:wsdlMessageMap>
                </grounding:wsdlInputMessageParts>
                <grounding:wsdlOperation>
                  <grounding:WsdlOperationRef>
                    <grounding:portType>CheckHotelPort</grounding:portType>
                    <grounding:operation>CheckHotel</grounding:operation>
                  </grounding:WsdlOperationRef>
                </grounding:wsdlOperation>
                <grounding:wsdlOutputMessageParts rdf:parseType="Collection">
                  <grounding:wsdlMessageMap>
                    <grounding:owlsParameter>
                      <process:Output rdf:ID="out0">
                        <rdfs:label>hotelname</rdfs:label>
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#HotelName"/>
                      </process:Output>
                    </grounding:owlsParameter>
                    <grounding:wsdlMessagePart>hotelname</grounding:wsdlMessagePart>
                  </grounding:wsdlMessageMap>
                  <grounding:wsdlMessageMap>
                    <grounding:wsdlMessagePart>hoteladdress</grounding:wsdlMessagePart>
                    <grounding:owlsParameter>
                      <process:Output rdf:ID="out1">
                        <rdfs:label>hoteladdress</rdfs:label>
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#Address"/>
                      </process:Output>
                    </grounding:owlsParameter>
                  </grounding:wsdlMessageMap>
                  <grounding:wsdlMessageMap>
                    <grounding:wsdlMessagePart>hoteltel</grounding:wsdlMessagePart>
                    <grounding:owlsParameter>
                      <process:Output rdf:ID="out2">
                        <rdfs:label>hoteltel</rdfs:label>
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#Phone"/>
                      </process:Output>
                    </grounding:owlsParameter>
                  </grounding:wsdlMessageMap>
                  <grounding:wsdlMessageMap>
                    <grounding:owlsParameter>
                      <process:Output rdf:ID="out3">
                        <rdfs:label>leftroom</rdfs:label>
                        <process:parameterType rdf:resource="http://www.w3.org/2001/XMLSchema#int"/>
                      </process:Output>
                    </grounding:owlsParameter>
                    <grounding:wsdlMessagePart>leftroom</grounding:wsdlMessagePart>
                  </grounding:wsdlMessageMap>
                  <grounding:wsdlMessageMap>
                    <grounding:wsdlMessagePart>roomprice</grounding:wsdlMessagePart>
                    <grounding:owlsParameter>
                      <process:Output rdf:ID="out4">
                        <rdfs:label>roomprice</rdfs:label>
                        <process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#Fare"/>
                      </process:Output>
                    </grounding:owlsParameter>
                  </grounding:wsdlMessageMap>
                </grounding:wsdlOutputMessageParts>
里面关于输入和输出部分的参数类型
<process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#.../>
通过这个我对本体在语义web服务中的理解:
我觉得本体在语义web服务中的作用应该是用本体中定义的一些概念来描述我们服务的本体,比如说例子中是用旅游的知识库本体中的概念Address,HotelType等概念来描述它的输入参数类型的,可能在Address这种参数类型中包含城市,街道,房门号等信息,而这些信息的类型都是String类型的,这里是不是应该使用jena对旅游本体操作来推理出Address类型所包含的信息的类型,然后从用户输入的数据来提取相关的信息数据,这里比较晕,希望各位可以指教指教


--  作者:jpz6311whu
--  发布时间:4/17/2009 10:48:00 PM

--  
楼主想问啥:)能否具体一点?
--  作者:lixiaoming
--  发布时间:4/18/2009 8:10:00 PM

--  
我通过这个例子,想请教一下
问题一:本体在语义web服务中的作用是不是用本体中定义的一些概念来描述我们服务的本体(wsdl转换后的owl-s),比如说例子中是用旅游的知识库本体中的概念Address,HotelType等概念来描述checkhotel.owl的输入参数类型的

问题二:可能在Address这种参数类型中包含城市,街道,房门号等信息,假设城市,街道,房门号等这些信息的类型都是String类型的,那在做web服务发现系统的时候,通过查询界面,服务请求者输入查询条件:包括输入参数,输出参数。然后将这些信息在自己构建的本体中进行查询,如果这些信息的概念存在于本体中,就把他们转换成owl-s profile的格式.
如果不存在,则计算与用户提供的信息概念语义相似度最近的概念,并转换为owl-s profile的格式,不知道思路对吗?上述的功能是不是要用到jena+racer实现啊?
然后在用这个转换后的owl-s profile,与已经注册到uddi中的已经存在的web服务的owl-s中的profile进行功能匹配,这里是不是就要用matchmaker来做了。

问题三:当决定要调用这个服务的时候,我用owl-s api中的RunService()来试验,可是针对输入参数它难道可以自动解析出输入参数的类型吗?比如说在服务的owl-s描述中,输入参数为:
<process:parameterType rdf:resource="http://localhost:8080/travelontology/travel#Address"/>
它并不是简单的String类型,在本体里面这个Address还包含了街道等别的信息,而这些被包含的信息(如街道等)的类型是String,那么怎么编写RunService()。


--  作者:lixiaoming
--  发布时间:4/18/2009 9:26:00 PM

--  
问题补充,感觉自己构建的知识库的本体(在这里是个旅游本体),主要是用来描述服务本体(从wsdl转换来的owl-s)用的,主要通过使用领域本体来描述服务本体中Profile部分(服务功能性描述),让机器和人都可以理解这种概念。本体除了参与推理以外,在服务请求者经过查找得到需要的服务的owl-s文件,并要调用它时。其实领域本体的作用力就到此为止了,感觉可以通过RunService()这个程序说明,比如我用:
<process:parameterType rdf:datatype="http://www.w3.org/2001/XMLSchema#anyURI">http://www.w3.org/2002/07/owl#ISBN</process:parameterType>来描述我的输入参数,实际上我的输入参数是个String的类型,但我想说明它是个ISBN,所以服务请求者通过语义匹配找到这个服务本体的owl-s文件时,就可以调用它了,用领域本体来描述web服务的owl-s文件,增强了机器理解的能力,然后就可以通过本体查找和匹配,找到最适合的服务,不知道这样理解对吗
--  作者:jpz6311whu
--  发布时间:4/20/2009 11:55:00 PM

--  
问题一: 是的,可以这样理解
其他问题,我不太清楚,对OWL-S不太了解,希望其他朋友能帮回答你的问题:)


--  作者:lixiaoming
--  发布时间:4/21/2009 8:41:00 AM

--  
感谢您及时回答我的问题,非常感谢
--  作者:xufeng5264
--  发布时间:10/21/2011 5:33:00 PM

--  
很想问楼主,怎么引用owl-s文件外的其它owl文件中的概念和资源?看上去你的关于旅游的知识库的本体owl是不是经过一个工具发布后生成了resource="http://localhost:8080/travelontology/travel#Address"/等资源后,被owl-s文件引用的?owl文件是怎么发布的?楼主是否使用java对owl-s文件进行解析?能否对本地磁盘目录下的owls文件进行解析?楼主能提供一点源码不能?我现在在这个问题上纠结了好久,快崩溃了,谢谢。

--  作者:lixiaoming
--  发布时间:10/21/2011 6:38:00 PM

--  
我已经毕业了,这个问题有段时间没有研究了,应该是用protege这个工具构建的owl知识本体库,然后用你的eclipse编写代码,使用了jena api,把你的owl本体文件和服务的代码放到你的java web project中,然后用tomacat一起发布,就应该能访问到了
--  作者:lixiaoming
--  发布时间:10/21/2011 6:38:00 PM

--  
使用java可以调用owl-s服务的
--  作者:lixiaoming
--  发布时间:10/21/2011 6:39:00 PM

--  
好像w3c这个论坛里面有讲过,我具体忘了,代码这个东东让我不小心给格掉了
--  作者:xufeng5264
--  发布时间:10/25/2011 11:42:00 AM

--  
我只使用过嵌入到eclipse 中的tomcat发布过jsp网页,是不是即使不安装Eclipse只安装tomcat也能直接运行tomcat发布owl文件,甚至包括word等任何文件?我是把自己开发的web service生成的wsdl文件通过其url导入到owls-editor中,然后将其保存为owl文件,接下来在jsp中对owl文件进行解析实现服务评价和匹配,我看网上的描述服务的owl文件都是发布成网络资源,而不是本地磁盘目录下,解析工具都是用owl-s api 而不是jena,之前我用过jena解析过一般的owl文件(非描述web 服务的owl文件),现在不知道到底用哪个去解析?你看看以下是网上的解析方法,对不对?
import impl.owls.process.execution.ProcessExecutionEngineImpl;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import org.mindswap.owl.EntityFactory;
import org.mindswap.owl.OWLClass;
import org.mindswap.owl.OWLDataProperty;
import org.mindswap.owl.OWLFactory;
import org.mindswap.owl.OWLIndividual;
import org.mindswap.owl.OWLKnowledgeBase;
import org.mindswap.owl.OWLOntology;
import org.mindswap.owl.OWLValue;
import org.mindswap.owls.OWLSFactory;
import org.mindswap.owls.grounding.Grounding;
import org.mindswap.owls.process.AtomicProcess;
import org.mindswap.owls.process.CompositeProcess;
import org.mindswap.owls.process.ForEach;
import org.mindswap.owls.process.Input;
import org.mindswap.owls.process.Local;
import org.mindswap.owls.process.Output;
import org.mindswap.owls.process.Perform;
import org.mindswap.owls.process.Process;
import org.mindswap.owls.process.ProcessList;
import org.mindswap.owls.process.Result;
import org.mindswap.owls.process.Sequence;
import org.mindswap.owls.process.execution.ProcessExecutionEngine;
import org.mindswap.owls.profile.Profile;
import org.mindswap.owls.service.Service;
import org.mindswap.owls.vocabulary.OWLS;
import org.mindswap.query.ValueMap;
import org.mindswap.utils.URIUtils;
import org.mindswap.utils.Utils;

import com.hp.hpl.jena.rdf.model.RDFList;

 public class newtest {
  
 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // create a URI for the service (note that this is a 0.9 version file)   
     URI uri = new URI("http://www.mindswap.org/2004/owl-s/0.9/ZipCodeFinder.owl");
     // create a KB  
  
     OWLKnowledgeBase kb = OWLFactory.createKB();
   // URI uri = new URI("http://www.mindswap.org/2004/owl-s/0.9/ZipCodeFinder.owl");
     
     //URI uri = new URI("http://www.mindswap.org/2004/owl-s/1.0/Dictionary.owl");
    
     // create a generic reader and a 1.0 writer
     OWLOntology ont = kb.read(uri);
     
     // get the service
     
     
     // write the output to console (a file stream can also be used here)
     ont.write(System.out);
  // create a URI for the service (note that this is a 0.9 version file)   
  // create an execution engine
     ProcessExecutionEngine exec = OWLSFactory.createExecutionEngine();
     // load the service description
   // OWLKnowledgeBase kb1 = OWLFactory.createKB();
     //URI uri1 = new URI("http://www.mindswap.org/2004/owl-s/1.0/Dictionary.owl");
    
     Service service = ont.getService(uri);
     //Service service1 = kb1.readService("http://www.mindswap.org/2004/owl-s/1.0/Dictionary.owl");
     // get the process of the service
     Process process = service.getProcess();
        // create an empty value map
     ValueMap values = new ValueMap();
     
     // set the value of input parameter
     values.setDataValue(process.getInput("InputString"), "computer");    
     // execute the process with the given input bindings
     values = exec.execute(process, values);  
     
     // get the output value as a string
     String outValue = values.getStringValue(process.getOutput());
     
     // display the result
     System.out.println("Output = " + outValue);

 }
 } 
 


--  作者:xufeng5264
--  发布时间:10/26/2011 3:00:00 PM

--  
多谢楼主,我按你说的把owl文件放在web project中果然发布成功了,接下来就是对发布的Owls文件进行解析,相关的代码我再找找吧。我看你的owls文件中有4个输出,但一个服务的一个操作只能有一个输出,一个owls文件中可以描述一个服务的多个操作还是多个服务的多个操作?


[此贴子已经被作者于2011-10-26 16:32:30编辑过]

--  作者:andyneo
--  发布时间:1/7/2012 8:35:00 PM

--  
楼主可否把本体和webservice的发布过程以及本体和发布的webservice之间的关系给小弟解释下呢?
  有相关的代码参照嘛?如果有简单的源程序参考,可以发我邮箱吗?     294017704@qq.com 谢谢!
--  作者:andyneo
--  发布时间:1/7/2012 8:50:00 PM

--  
楼主纠结的关于本体服务发布的问题解决了吗? 是否找到相关参考代码呢?希望楼主不吝赐教!
--  作者:andyneo
--  发布时间:1/7/2012 9:31:00 PM

--  
楼主纠结的关于本体服务发布的问题解决了吗? 是否找到相关参考代码呢?希望楼主不吝赐教!
--  作者:lixiaoming
--  发布时间:1/8/2012 10:36:00 AM

--  
各位朋友,我的代码让我不小心给格掉了,我只能凭印象来说一下过程,当时我用过axis来做过wsdl,这个比较麻烦,建议使用myeclipse上的新建一个web service工程,这样可以很方便的生成wsdl文件,而且可以保证你用owl-eidtor转换后,保证可以使用,我需要说明的是,将wsdl的文件转换成owl的文件后,就可以用owls api来解析服务本体,我这里说的服务本体是指通过wsdl转换后的那个东东(具体是owls还是owl,我忘了,应该是owls),jena+racer包是用来解析知识库本体文件的,比如说一个旅游本体知识库,用jena可以解析并且可以推理知识库中各个名词之间的关系,是subclass还是superclass,用owls api里面的runservice方法,可以调用语义web服务本体,在调用这个runservice方法时,一定要注意,有个部分得修改一下,具体的地方,记得不太清楚了,好像是 values.setDataValue(process.getInput("InputString"), "computer");    这里得对应owls服务本体中的input这个位置,运行一下runservice就能看到效果了。想试验jena的话,就用protege做个简单的知识本体库,然后调用jena+racer的包(好像还有racer得开着),从网上搜一下简单的例子,好像我的帖子里面也有,通过java的io流,读取知识本体的文件,然后写方法推断两个名词之间的关系,如果想要用到语义相似度的计算,大家必须要用到树的概念,将本体文件构建成一颗树,然后判断有几层关系,按照你们的语义相似度计算方法来计算

--  作者:lixiaoming
--  发布时间:1/8/2012 10:46:00 AM

--  
如果大家有兴趣,我以前发过的帖子上有关于用racer+jena来推理本体的例子,可以搜索一下作者,应该可以看到
--  作者:andyneo
--  发布时间:1/9/2012 7:55:00 PM

--  
非常感谢楼主的指点。我用protege3.2.1安装owl-s editor 插件后,组合后的服务的owls文件要到那里去找呢?在protege安装文件夹下面找不到啊。谢谢!!
--  作者:xufeng5264
--  发布时间:3/22/2012 3:04:00 PM

--  
这个流程我是走通了的


--  作者:luozhiyuan
--  发布时间:6/22/2012 2:42:00 PM

--  
期待交流,QQ:516986939
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
8,904.297ms