以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  一个关于RDF的简单问题(关于rdf:ID,rdf:about,rdf:resource的用法)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=11536)


--  作者:ChouBill
--  发布时间:11/3/2004 10:25:00 AM

--  一个关于RDF的简单问题(关于rdf:ID,rdf:about,rdf:resource的用法)
我用Protege建立一个本体,关于Pizza的,有三个类,包括Pizza, PiazzaBase和PizzaTopping,他们互相Disjointwith,我原以为这三个类既然是在层次上对等的,那代码也应该差不多。但是当我查看源代码时发现自动生成的代码中,这三个类是不一样的,主要是有些用的是rdf:ID,有些用的是rdf:about,还有用rdf:resource的,如下:

<?xml version="1.0"?>

<rdf:RDF

    xmlns:owl="http://www.w3.org/2002/07/owl#"

    xmlns="http://www.owl-ontologies.com/unnamed.owl#"

    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"

    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

  xml:base="http://www.owl-ontologies.com/unnamed.owl">

  <owl:Ontology rdf:about=""/>

  <owl:Class rdf:ID="PizzaBase">

    <owl:disjointWith>

      <owl:Class rdf:ID="Pizza"/>

    </owl:disjointWith>

    <owl:disjointWith>

      <owl:Class rdf:ID="PizzaTopping"/>

    </owl:disjointWith>

  </owl:Class>

  <owl:Class rdf:about="#Pizza">

    <owl:disjointWith rdf:resource="#PizzaBase"/>

    <owl:disjointWith>

      <owl:Class rdf:about="#PizzaTopping"/>

    </owl:disjointWith>

  </owl:Class>

  <owl:Class rdf:about="#PizzaTopping">

    <owl:disjointWith rdf:resource="#PizzaBase"/>

    <owl:disjointWith rdf:resource="#Pizza"/>

  </owl:Class>

</rdf:RDF>

我的疑问是同样的结构,为什么有些要用rdf:resource有些又用rdf:about,还有些用rdf:ID?这几个有什么区别呢?


[此贴子已经被orangebench于2004-11-8 11:58:08编辑过]

--  作者:orangebench
--  发布时间:11/3/2004 10:00:00 PM

--  
1)rdf:ID和rdf:about的区别:
rdf:about的值是一个完整URIref,注意也可以是相对URI,(相对于xml:base);
rdf:ID是对rdf:about的值的缩写,其值是一个“ XML Name”,所以,不能是数字开头,不能有“/”符号等。

例如:rdf:ID="PizzaBase" 等价于rdf:about="(xml:base)+‘#’+‘PizzaBase’ "
这个xml:base的值可以在XML文件头声明,如你例子中的,xml:base="http://www.owl-ontologies.com/unnamed.owl", 如果没有声明,则其值是RDF文件所放在的位置uri。

2)rdf:resource 和rdf:about

<owl:disjointWith rdf:resource="#PizzaBase"/> 是

<owl:disjointWith >
   <rdf:Description rdf:about="#PizzaBase" />
</owl:disjointWith >
的缩写。这里必须没有对资源="#PizzaBase" 做进一步的说明。所以,rdf:resource只能出现在表示属性的节点中,如这里的owl:disjointWith节点。

而  <owl:disjointWith>
             <owl:Class rdf:about="#PizzaTopping"/>
    </owl:disjointWith>
是等价于:
<owl:disjointWith >
   <rdf:Description rdf:about="#PizzaTopping" >
         <rdf:type rdf:resource="&rdfs;Class" />
   </rdf:Description>
</owl:disjointWith >

这里不能用rdf:resource了,因为声明了#PizzaTopping是一个类。

所以,我们可以看出:
说明了:  <owl:Class rdf:ID="PizzaBase">
以后,后面的都是用:
<owl:disjointWith rdf:resource="#PizzaBase"/>
了。


--  作者:ChouBill
--  发布时间:11/4/2004 9:54:00 AM

--  
非常感谢orangebench老大的详细说明,我觉得我好像有些理解了,把我的理解说一下看看理解得正不正确。

其实我们可以把rdf:ID看作和rdf:about一样的东西,rdf:ID只是一个缩写而已。所以
  <owl:Class rdf:ID="PizzaBase">

    <owl:disjointWith>

      <owl:Class rdf:ID="Pizza"/>

    </owl:disjointWith>

    <owl:disjointWith>

      <owl:Class rdf:ID="PizzaTopping"/>

    </owl:disjointWith>

  </owl:Class>
中,把所有的rdf:ID="xxx"替换成rdf:about="#xxx"也是可以的,这是我的第一个理解。

第二,为什么这里不能用rdf:resource呢,是因为到目前为止,Pizza类和PizzaTopping类还没有被定义,需要在这里申明它是一个类。如果Pizza类在之前就已经定义了,那么这里也可以用rdf:resource来简写。

上述理解正确吗?


--  作者:orangebench
--  发布时间:11/4/2004 12:30:00 PM

--  
我觉得是:
你的理解完全正确。

;-)


--  作者:gengkeming
--  发布时间:11/7/2004 9:35:00 AM

--  
谢谢你们,让我明白了好多东西!我也想问orangebench老大一个问题,是不是rdf是专门用来存储本体中的实例的?请赐教!
--  作者:orangebench
--  发布时间:11/8/2004 11:55:00 AM

--  
RDF当然可以用来存储本体实例,但它设计的目的,是用于描述Web上资源的。它是一种元数据表示语言标准。
--  作者:orangebench
--  发布时间:11/9/2004 12:04:00 AM

--  
再补充一个rdf:ID和rdf:about的区别:

rdf:ID是用来定义一个资源,或者说引入一个新的资源名称;
rdf:about除了也可用来定义资源外,还可用来扩展对这个资源的定义(这可以出现在其他本体文件中)。


[此贴子已经被作者于2004-11-9 11:58:43编辑过]

--  作者:ChouBill
--  发布时间:11/10/2004 9:41:00 AM

--  
能说得再详细点吗,免得理解起来有歧义

上面的例子中,定义了三个类:
<owl:Class rdf:ID="PizzaBase">
<owl:Class rdf:about="#Pizza">
<owl:Class rdf:about="#PizzaTopping">
我原来认为这三个都可以定义成rdf:ID,现在还是这么认为。你的意思是说如果Pizza和PizzaTopping的定义如果不在同一个文件中的话,就只能用rdf:about,对不对?


--  作者:orangebench
--  发布时间:11/10/2004 3:36:00 PM

--  
我也认为这三个定义都可以用rdf:ID来定义。
我的意思是:如果已经有本体定义了Pizza和PizzaTopping(用rdf:ID),你在其他的本体中要增加对Pizza和PizzaTopping的描述,应该用rdf:about,但是不是必须用,我没把握。


以下是引用ChouBill在2004-11-10 9:41:54的发言:
能说得再详细点吗,免得理解起来有歧义

上面的例子中,定义了三个类:
<owl:Class rdf:ID="PizzaBase">
<owl:Class rdf:about="#Pizza">
<owl:Class rdf:about="#PizzaTopping">
我原来认为这三个都可以定义成rdf:ID,现在还是这么认为。你的意思是说如果Pizza和PizzaTopping的定义如果不在同一个文件中的话,就只能用rdf:about,对不对?



--  作者:lngxt
--  发布时间:11/16/2004 10:24:00 AM

--  
以下是引用ChouBill在2004-11-3 10:25:10的发言:
我用Protege建立一个本体,关于Pizza的,有三个类,包括Pizza, PiazzaBase和PizzaTopping,他们互相Disjointwith,我原以为这三个类既然是在层次上对等的,那代码也应该差不多。但是当我查看源代码时发现自动生成的代码中,这三个类是不一样的,主要是有些用的是rdf:ID,有些用的是rdf:about,还有用rdf:resource的,如下:

<?xml version="1.0"?>
<rdf:RDF
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns="http://www.owl-ontologies.com/unnamed.owl#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xml:base="http://www.owl-ontologies.com/unnamed.owl">
   <owl:Ontology rdf:about=""/>
   <owl:Class rdf:ID="PizzaBase">
     <owl:disjointWith>
       <owl:Class rdf:ID="Pizza"/>
     </owl:disjointWith>
     <owl:disjointWith>
       <owl:Class rdf:ID="PizzaTopping"/>
     </owl:disjointWith>
   </owl:Class>
   <owl:Class rdf:about="#Pizza">
     <owl:disjointWith rdf:resource="#PizzaBase"/>
     <owl:disjointWith>
       <owl:Class rdf:about="#PizzaTopping"/>
     </owl:disjointWith>
   </owl:Class>
   <owl:Class rdf:about="#PizzaTopping">
     <owl:disjointWith rdf:resource="#PizzaBase"/>
     <owl:disjointWith rdf:resource="#Pizza"/>
   </owl:Class>
</rdf:RDF>

我的疑问是同样的结构,为什么有些要用rdf:resource有些又用rdf:about,还有些用rdf:ID?这几个有什么区别呢?

[此贴子已经被orangebench于2004-11-8 11:58:08编辑过]



我还有个疑问:这只是引入了Pizza, PiazzaBase和PizzaTopping类,那么怎么具体定义这些类呢?在这个文档外部吗?哪位大侠能不能给个示例,谢了!:)
--  作者:ChouBill
--  发布时间:11/16/2004 4:46:00 PM

--  
虽然也可以在文档外部,但对于Pizza这个简单的本体来说,我认为还是定义在一个文件里面比较合适一些。

具体怎么定义,在W3C上面有一个教程,就是讲Pizza类的定义过程的。


--  作者:ChouBill
--  发布时间:12/8/2004 2:36:00 PM

--  
关于rdf:about和rdf:resource再问Orangebecnhe
在wine.owl中,我看到

  <owl:Class rdf:ID="WhiteNonSweetWine">
    <owl:intersectionOf rdf:parseType="Collection">
      <owl:Class rdf:about="#WhiteWine" />
      <owl:Restriction>
        <owl:onProperty rdf:resource="#hasSugar" />
        <owl:allValuesFrom>
          <owl:Class>
            <owl:oneOf rdf:parseType="Collection">
              <owl:Item rdf:resource="#Dry" />
              <owl:Item rdf:resource="#OffDry" />
            </owl:oneOf>
          </owl:Class>
        </owl:allValuesFrom>
      </owl:Restriction>
    </owl:intersectionOf>
  </owl:Class>

1、在这一段之前已经定义了WhiteWine类,为什么这里还是<owl:Class rdf:about="#WhiteWine" />而不是<owl:Class rdf:resource="#WhiteWine" />?

2、所有的onProperty都定义为rdf:resource,不管这个property之前是否已经定义过,而不是rdf:about,这又是为什么?还有<owl:Item rdf:resource="#Dry" />,为什么这里也是rdf:resource而不是rdf:about?这里的dry也不是之前已经定义过的啊?难道说这里的rdf:resource可以替换为rdf:about?

现在我对rdf:about和rdf:resource的理解又变得糊涂了。


--  作者:nybon
--  发布时间:12/9/2004 12:15:00 AM

--  
嗯,我前面看了这个帖子,感觉明白不少,不过被你讲一下又糊涂了^_^,所以晚上发了一封mail给RDF Primer的Editor Frank Manola,他过了一个小时就回我了,^_^


Have you looked at the RDF Primer (and specifically, Example 4 in
Section 3.1 and its explanation, which is where this is discussed)?
Basically, rdf:about is for expressing the *subject* of an RDF statement
in RDF/XML.  rdf:resource is for expressing the *object* of an RDF
statement in RDF/XML, when the object is another resource rather than a
literal value.  Does that help?  If you have some particular example in
mind that you are trying to express, could you provide it?

--Frank


--  作者:nybon
--  发布时间:12/9/2004 12:20:00 AM

--  
按照Frank的说法,rdf:about用来表示statement的主体,rdf:resource在statement的客体是一个资源而不是文字值时用来表示客体
--  作者:melody
--  发布时间:12/9/2004 10:03:00 AM

--  感谢大家
真的很喜欢这儿,大家都是那么热情,这也是我一直以来的问题,谢谢大家的解答,尤其是orangebench兄,看了你以前的帖子真是佩服呀,快成我偶像了,呵呵
--  作者:admin
--  发布时间:12/9/2004 5:21:00 PM

--  
以下是引用orangebench在2004-11-10 15:36:13的发言:
我也认为这三个定义都可以用rdf:ID来定义。
我的意思是:如果已经有本体定义了Pizza和PizzaTopping(用rdf:ID),你在其他的本体中要增加对Pizza和PizzaTopping的描述,应该用rdf:about,但是不是必须用,我没把握。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果Pizza是用rdf:ID定义的,那么要增加对Pizza的描述,就必须用rdf:about。因为同一个RDF文档中,不能出现两个rdf:ID="Pizza",否则RDF Parser就会报错。参见:

{{//RDF Primer. Section 3.2 的第4段中间

However, using rdf:ID provides an additional check when assigning a set of distinct names, since a given value of the rdf:ID attribute can only appear once relative to the same base URI (the catalog document, in this example).

}}

[quote]以下是引用ChouBill在2004-11-10 9:41:54的发言:
能说得再详细点吗,免得理解起来有歧义

  上面的例子中,定义了三个类:
  <owl:Class rdf:ID="PizzaBase">
  <owl:Class rdf:about="#Pizza">
  <owl:Class rdf:about="#PizzaTopping">
  我原来认为这三个都可以定义成rdf:ID,现在还是这么认为。你的意思是说如果Pizza和PizzaTopping的定义如果不在同一个文件中的话,就只能用rdf:about,对不对?
[/quote]



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