将信息模型表示为 RDF 和 OWL 词汇表





5.00/5 (1投票)
如何将信息模型表示为 RDF 和 OWL 词汇表,以及如何在 Web 文档中嵌入简单的元数据声明(注释)。
本文摘录自书籍《使用 JavaScript 或 Java 进行 Web 应用开发》。
资源描述框架 (RDF) 及其扩展 RDF Schema 是一种逻辑形式,允许
-
将信息模型形式化为 RDF 词汇表,其中包含类定义和属性定义,类名和属性名均为 URI(表示全局唯一标识符)。
-
在 Web 上表示命题信息(以个体声明的形式),嵌入在网页中或作为专门的 Web 数据源。
RDF 是 语义网 的基础。它有多种语法,包括基于 XML 的文本语法 RDF/XML 和 RDF Graph 的可视化语法。
RDF 词汇表
考虑以下类图中定义的 Book
类。
对应的 RDF 词汇表,包含一个类定义和三个属性定义,在下面的 RDF 图中定义。
在 RDF 图中,椭圆形节点表示“资源”(如属性和类),箭头表示由属性定义的关系。两个节点之间的每个箭头代表一个声明(也称为“三元组”)。例如,year
和 xs:int
之间的 rdfs:range
箭头表示 year
属性的范围是 XML Schema 数据类型 xs:int
,其中 xs
是 XML Schema 命名空间 的命名空间 前缀。
请注意,RDF 具有预定义的元类 rdfs:Class
和 rdf:Property
,用于在预定义属性 rdf:type
的帮助下定义类及其属性。例如,year
和 rdf:Property
之间的 rdfs:type
箭头表示 year
的类型是 rdf:Property
,即它被定义为 RDF 属性。
RDF 图是理论目的的形式。它们可用于说明简单的示例。与 UML 类图相反,由于其复杂性和不必要的视觉复杂性,它们不适用于可视化地表达现实的词汇表。
属性的域必须在 RDF 词汇表中显式定义(使用 rdfs:domain
属性声明),而 UML 类图则隐式定义。虽然在类上下文**中定义属性很自然(如 UML 中所示),但 RDF 允许独立于任何类定义属性**。
RDF/XML 语法允许在 Web 上发布 RDF 词汇表。例如,上面 RDF 图中定义的简单 Book
词汇表可以由以下 RDF/XML 文档表示:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:ex="http://example.org/ex1">
<rdfs:Class rdf:ID="#Book"/>
<rdf:Property rdf:ID="#isbn">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
</rdf:Property>
<rdf:Property rdf:ID="#title">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
</rdf:Property>
<rdf:Property rdf:ID="#year">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#int"/>
</rdf:Property>
</rdf:RDF>
请注意,rdf:resource
属性的值必须是 URI。如果属性值是片段标识符(如 #Book
),则它表示相对 URI,并通过将片段标识符附加到作用域内的基本 URI(可能使用 xml:base
属性定义)来解析为完整 URI。
如果属性值是绝对 URI(如“http://www.w3.org/2001/XMLSchema#string”),则它包含一个完整的命名空间 URI(如“http://www.w3.org/2001/XMLSchema”),即使为其定义了命名空间前缀(如“xsd
”或“xs
”)。这是因为命名空间前缀只能用于 XML 元素和属性名称,但不能用于属性值,这不幸地使 RDF/XML 对人类用户难以阅读。
请注意,我们上面简单 UML 类模型的 RDF 形式化存在几个缺点。
-
它没有表达这三个属性都是强制且单值的约束,而这在 UML 中是默认的。
-
它没有表达 ISBN 属性作为标准标识符(或主键)属性是强制且唯一的约束。
我们将在下面展示 OWL 的更强表达能力如何解决这两个问题。
RDF 事实声明
RDF 可表达的命题信息项或事实声明是:
-
分类声明,例如“
ex:Book
是rdfs:Class
”或“urn:isbn:006251587X
是ex:Book
”,以及 -
属性声明,例如“
urn:isbn:006251587X
的ex:isbn
属性值为 '006251587X'”。
因此,对于 UML 对象定义,如
我们得到几个 RDF 事实声明:
-
分类声明
<rdf:Description rdf:about=“urn:isbn:006251587X”> <rdf:type rdf:resource="http://example.org/ex1#Book"/> </rdf:Description>
可以更简洁地表示为:
<ex:Book rdf:ID="urn:isbn:006251587X"/>
-
三个属性声明:
<rdf:Description rdf:about=“urn:isbn:006251587X”> <ex:isbn>006251587X</ex:isbn> <ex:title>Weaving the Web</ex:title> <ex:year>2000</ex:year> </rdf:Description>
也可以合并到一个
rdf:Description
元素中:<rdf:Description rdf:about=“urn:isbn:006251587X”> <rdf:type rdf:resource="http://example.org/ex1#Book"/> <ex:isbn>006251587X</ex:isbn> <ex:title>Weaving the Web</ex:title> <ex:year>2000</ex:year> </rdf:Description>
在 Web 文档中表达结构化数据
在 Web 文档中嵌入机器可读数据(例如,关于人、事件、产品等)有许多用例。例如,Google 等搜索引擎可以使用此类结构化数据提供更有意义的搜索结果。
结构化数据或元数据可以通过添加包含它的 JSON-LD script
元素,或通过使用 RDFa 为文档的内容(例如网页的 HTML 元素)添加注释来嵌入到 Web 文档中。
非常有限的注释方法,称为“微格式”(约 2005 年提出),是通用注释语言 RDFa 的历史前身,RDFa 源自 RDF。一些微格式,如 vCard 和 vEvent,至今仍在被使用,但它们正日益被 RDFa 和 JSON-LD 这两种通用格式之一所取代。
HTML5 的主要作者 Ian Hickson 提出了一种名为微数据的替代通用注释语言,旨在简化 RDFa 并解决其可用性问题(特别是通过放弃使用 XML 命名空间)。尽管(不幸地)选择了使用不同的名称来表示相同的注释概念(例如,“itemprop”而不是“property”),Hickson 的微数据提案成功地展示了
- 如何以更低的可用性成本实现基本相同的注释功能,以及
- 如何将注释与 DOM 集成。
由于 Hickson 结束了他与 W3C 的合作,微数据提案未能获得 W3C 的官方地位,Web 浏览器也已停止支持它。然而,它促使 W3C 提出使用 RDFa 的 Lite 子集,该子集“可以应用于大多数简单到中等的结构化数据标记任务,而不会给作者带来额外的复杂性”。
我们通过一个简单的示例展示如何在网页中使用结构化数据。请考虑以下 HTML 片段:
<p>
My name is Carly Rae Jepsen.
Call me maybe at 1-800-2437715.
</p>
对于此内容,我们可能希望编码以下信息:
- 可用信息是关于类型为
Person
的实体,该实体已由搜索引擎标准词汇表schema.org
定义; - 该人的名字是“
Carly Rae Jepsen
”; - 该人的电话号码是“
1-800-2437715
”。
使用 RDFa 属性 typeof
、vocab
和 property
,我们可以通过将以下注释添加到 HTML 内容来编码此信息:
<p typeof="Person" vocab="http://schema.org/">
My name is <span property="name">Carly Rae Jepsen</span>.
Call me maybe at <span property="telephone">1-800-2437715</span>.
<p>
使用 Google 推荐的 JSON-LD,我们需要添加一个类型为“application/ld+json
”的 script
元素,其中包含元数据。
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Person",
"name": "Carly Rae Jepsen",
"telephone": "1-800-2437715"
}
</script>
使用 RDFa 注释和 JSON-LD 表达的命题信息对应于以下 RDF/XML 代码:
<rdf:Description xmlns:schema="http://schema.org/">
<rdf:type rdf:resource="http://schema.org/Person"/>
<schema:name> Carly Rae Jepsen </schema:name>
<schema:telephone> 1-800-2437715 </schema:url>
</rdf:Description>
OWL 词汇表和约束
OWL 通过添加许多额外的语言元素来扩展 RDF,用于在定义词汇表的上下文中表达约束、相等性和派生类及属性。事实的表达与 RDF 相同(例如,使用 rdf:Description
)。
OWL 提供了自己的预定义语言元素来定义类和属性。
-
预定义类
owl:Class
是rdfs:Class
的子类。 -
预定义类
owl:DatatypeProperty
是rdf:Property
的子类。它对属性进行分类。因此,owl:DatatypeProperty
的值是数据文字。 -
预定义类
owl:ObjectProperty
是rdf:Property
的子类。它对对应于单向二元关联的引用属性进行分类。由于引用属性的值是对象引用,因此owl:ObjectProperty
的值是以资源 URI 形式的对象引用。
我们仅通过一个示例来展示 OWL 词汇表比相应的 RDF 词汇表更能忠实地表示类图,因为它允许表达某些约束。
考虑上面 Book
类中定义的标准标识符属性 isbn
。在 RDF 词汇表中,此属性定义如下:
<rdf:Property rdf:ID="#isbn">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
</rdf:Property>
此属性的 RDF 定义存在两个问题:
- 它没有明确指出定义的属性是属性,而不是引用属性。这只能通过查找范围类是数据类型而不是对象类型来推断。
- 它没有将属性限制为仅具有一个值,这在 UML 类图语义的默认值中隐含。
使用 OWL,我们可以弥补 RDF 的这些缺点。以下 OWL 属性定义明确指出属性 http://example.org/ex1#isbn
是一个属性,而添加的 OWL 约束为其定义了一个“正好一个”的基数约束。
<owl:DatatypeProperty rdf:ID="#isbn">
<rdfs:domain rdf:resource="#Book"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
</owl:DatatypeProperty>
<owl:Restriction>
<owl:onProperty rdf:resource="#isbn" />
<owl:cardinality>1</owl:cardinality>
</owl:Restriction>
由于在上面的 UML 类图中,Book
类的 ISBN 属性被指定为标准标识符属性,因此我们应该为其定义一个唯一性约束。我们可以通过在类定义中包含一个 owl:hasKey
元素来实现这一点。
<owl:Class rdf:ID="#Book">
<owl:hasKey rdf:parseType="Collection">
<owl:ObjectProperty rdf:about="hasSSN">
</owl:hasKey>
</owl:Class>
RDF 和 OWL 的可用性问题
RDF 和 OWL 都存在许多可用性问题。尤其是 OWL 非常难以使用,以至于大多数潜在用户都会望而却步。
由于 OWL 是由一个更关注形式逻辑而非信息建模且不熟悉信息建模中已建立的概念和术语的社区创建的,因此他们为已有概念引入了许多新的不熟悉术语,并命名了它们。他们甚至在 OWL 中引入了重复的名称:属性在大多数地方被称为“数据属性”,但在某些地方被称为“数据类型属性”(特别是在 OWL/RDF 中)。
RDF 的可用性问题是:
-
出于历史原因,RDF 带有奇怪的行话。特别是,它的“主语”-“谓语”-“宾语”术语很糟糕。
-
出于历史原因,RDF 带有两个不同的 XML 命名空间,通常形式为两个命名空间前缀“
rdf
”和“rdfs
”。语言的历史不应强加于其语法。用户不应该费心去想使用哪个前缀。 -
RDF 使用不常见的术语“IRI”(“International Resource Identifier”的缩写),遵循从“URL”到“URI”再到“IRI”的不幸命名历史,而 WHATWG 的URL Living Standard已恢复了此命名历史。
-
出于实际目的,RDF 不完整:
-
它没有明确区分属性(范围为数据类型)和引用属性(范围为对象类型)的语法;
-
它不允许在 RDF 词汇表中表达简单的类定义,这些定义包括强制值和单值约束。
OWL 是获得这些基本功能所必需的。
-
OWL 的可用性问题是:
-
它使用不常见的术语:例如,“data property”而不是 attribute,“restriction”而不是 constraint;
-
它的一些元素名称令人困惑:例如,“
ObjectIntersectionOf
”表示的不是对象交集,而是对象类型的交集,而“DataSomeValuesFrom
”实际上指的是“来自某些数据值”; -
它的许多语言元素有些不自然且难以掌握(更不用说记住了):例如,一个正好一个值的属性约束不能在类的定义中与属性声明一起表达,而需要一个单独的 Restriction 元素(如上所示)。