a) RDF/XML主要讲的就是如何用XML的方式来表示RDF的图。
b) 例子图:
注:在RDF图中,椭圆表示基于URI标识的节点。矩形表示文本。弧线表示谓语。
c) 空节点
由于RDF的语法只能表示两者之间的关系,所以,当我们需要表示一对多的关系时,RDF推荐的方案就是引入一个空节点(Blank Node),空节点的作用就是作为一个临时节点,或者说作为一个容器。
d) A(节点描述)
<rdf:Description rdf:about="A"></rdf:Description>
e) A->d->D(属性表述)
<rdf:Description rdf:about="A">
<d>D</d>
</rdf:Description>
f) A->d->D(简化方式)
<rdf:Description rdf:about="A" d="D"></rdf:Description>
g) A->a->_->b->B(空节点,,多节点描述)
<rdf:Description rdf:about="A">
<a rdf:nodeID="abc"/> // 引用空节点
</rdf:Description>
<rdf:Description rdf:nodeID="abc"> // 声明空节点的内容
<b>
<rdf:Description rdf:about="B"></rdf:Description>
</b>
</rdf:Description>
注:我们通过为空节点取定一个内部唯一的id值,来指定和引用空节点。
h) A->a->_->b->B(简化空节点)
<rdf:Description rdf:about="A">
<a rdf:parseType="Resource">
<b>
<rdf:Description rdf:about="B"></rdf:Description>
</b>
</a>
</rdf:Description>
注:通过rdf:parseType="Resource"来约去空节点定义。
i) A->a->_->b->B(简化子节点)
<rdf:Description rdf:about="A">
<a>
<rdf:Description>
<b rdf:resource="B"></b>
</rdf:Description>
</a>
</rdf:Description>
注:通过谓词rdf:resource来指定宾语。能使用该语法的宾语,必须是不带其他子节点或属性。
j) XML文本,普通文本
<rdf:RDF>
<rdf:Description rdf:about="http://example.org/item01">
<ex:prop rdf:parseType="Literal" xmlns:a="http://example.org/a#">
<a:Box required="true">
<a:widget size="10" />
</a:Box>
</ex:prop>
</rdf:Description>
</rdf:RDF>
注:通过谓词rdf:parseType="Literal",指明节点的内容是普通文本,解释器不需要对其进行解释。
k) 有类型的文本
<rdf:RDF>
<rdf:Description rdf:about="http://example.org/item01">
<ex:size rdf:datatype="http://www.w3.org/2001/XMLSchema#int">123</ex:size>
</rdf:Description>
</rdf:RDF>
注:通过谓词rdf:datatype,指定该值所使用的数据类型。
l) 有类型的节点
RDF也支持部分的面向对象的概念,即节点可能是属于某一种类型,为此,我们可以如此表示带类型的节点。
<rdf:Description rdf:about="A">
<rdf:type rdf:resource="http://example.org/stuff/1.0/Document"/>
…
</rdf:Description>
注:通过谓词rdf:type,来指定某一个节点所属的类型
m) 有类型的节点(简化方式)
<ex:Document rdf:about="A">
…
</ex:Document>
注:通过把类型名直接作为节点名,而不使用rdf:Description的方式,可以无需声明rdf:type。
n) URI
如前文所说,RDF使用URI作为词汇表,所以,不管是节点还是谓词,我们都可以使用http://aaa#bbb来唯一进行标识,所以,上述的节点A他的完整表示可能会是http://aaa#A。但使用这种方式会带来的一个问题就是,当我们要替换词汇表时,可能会需要进行大量的替换动作,为此,RDF提供了一些简便措施。
<rdf:RDF xml:base="http://aaa">
<rdf:Description rdf:ID="A">
…
</rdf:Description>
</rdf:RDF>
注:通过定义xml:base,和使用谓词rdf:ID,而不是rdf:about,解释器在解释时就会将xml:base的值和ID值进行合并,得出节点的URI。
o) 容器
RDF支持三种容器类型,rdf:Bag(无序,可重复),rdf:Seq(有序,可重复),rdf:Alt(多个中的一个),这三者的语法基本一致。
p) A包含B,C,D(手工编号)
<rdf:Seq rdf:about="A">
<rdf:_1 rdf:resource="B"/>
<rdf:_2 rdf:resource="C"/>
<rdf:_3 rdf:resource="D"/>
</rdf:Seq>
注:这里用户需要手工的使用rdf:_n的方式对节点进行编号。编号的作用就是可以使得,在通过父节点进行引用时,可以引用到子节点。
q) A包含B,C,D(自动编号)
<rdf:Seq rdf:about="A">
<rdf:li rdf:resource="B"/>
<rdf:li rdf:resource="C"/>
<rdf:li rdf:resource="D"/>
</rdf:Seq>
注:通过声明rdf:li,解释器在解释时,将自动生成编号。
r) 集合
集合和容器的区别在于,容器只说明了什么包含在容器当中,但没有说明什么不在容器之中,也就是说容器并没有对内容的范围进行限定。而集合则对范围作了限定,凡是不在集合声明当中出现的,都不是集合的元素。
s) A包含B,C,D
<rdf:Description rdf:about="A">
<a rdf:parseType="Collection">
<rdf:Description rdf:about="B"/>
<rdf:Description rdf:about="C"/>
<rdf:Description rdf:about="D"/>
</a>
</rdf:Description>
注:集合的元素不需要排序。集合通过谓词rdf:parseType="Collection"来指定。
t) RDF/XML解释
由于RDF文件是使用XML进行表述,所以我们可以使用一般的解释器进行分析。并根据识别出的节点,进行进一步的语义解释。