简单的数据映射
在 RDF 中表示关系数据库中的数据有很多不同的方法,而最好的方法很大程度上取决于您手头的特定数据。您提到您有继承、关联和聚合关系,但是如果没有数据示例,很难知道最好的方法是什么。不过,您可能对其中的一些资源感兴趣,例如:
继承
继承、关联和聚合的关系通常在类的上下文中讨论,这在关系数据库的上下文中可能有意义,也可能没有意义。在不知道您的信息在数据库中是如何表示的情况下,很难说是否
ChildTable rdfs:subClassOf ParentTable
有意义与否。在我看来,例如,如果您有一个 Animal 表,其中每一行代表一个动物的单个实例,然后还有一个 Mammal 表,其中的每一行代表一个哺乳动物的一个个体实例,每个哺乳动物实例也将有一个对应动物行的键。例如,您可能有以下表格:
Animal
AnimalId, LatinName, CasualName, FavoriteFood
71, Heloderma suspectum, "Jim the Gila Monster", "Eggs"
72, Canis lupus familiaris, "Semour", "Pizza"
73, Canis lupus familiaris, "Spot", "Kibble"
74, Felis catus, "Fluffy", "Fish"
75, Homo sapiens, "Fry", "Bachelor Chow"
Mammal
AnimalId, isBipedal
72, false
73, false
74, false
75, false
为了代表哺乳动物和动物之间的遗传,你可以说
Mammal rdfs:subClassOf Animal
当然,您需要确保 Mammal 和 AnimalId 72 与 Animal 和 AnimalId 72 的资源相同,但如果您已经实现了关系数据的直接映射,则此应该不是问题。
联想
在纯 RDF(S) 中,您只能做继承。当然,您可以声明属性的域和范围,并推断一些类型信息,但是您确实无法确保例如每个Animal 至少有一种最喜欢的食物。至少,您应该使用rdfs:comments 注释您的属性和类,以指示数据应该包含的内容。例如:
Animal rdfs:comment "Each animal instance MUST have:
exactly one ID (hasID);
exactly one latin name (hasLatinName); and
exactly one favorite food (hasFavoriteFood).
Each animal instance MAY have:
up to one casual name (hasCasualName)." .
但是,如果您可以使用 OWL,则可以使用限制类和子类公理来表达这些类型的关系。例如,以下 OWL 公理代表前面注释中表达的约束:
Animal SubClassOf (hasId exactly 1 xsd:integer)
Animal SubClassOf (hasLatinName exactly 1 xsd:string)
Animal SubClassOf (hasFavoriteFood exactly 1 xsd:string)
Animal SubClassOf (hasCasualName max 1 xsd:string)
聚合
RDF(和 OWL)用于以声明方式表示关于个人的信息,而不是面向对象编程的对象。由于没有内置的对象生存期或所有权概念,因此关联和聚合之间的区别在很大程度上消失了。可以在 OWL 中表达的公理类型同样可以描述属性如何适应聚合关系,就像它们适用于关联关系一样。
不过,需要注意的一点是,RDF 和 OWL 类更恰当地被认为是集合,而不是面向对象的编程类。这样做的一个很好的特点是,与许多流行的编程语言不同,类不限于只有一个父类。这意味着在需要聚合的面向对象编程中的某些情况下,多继承的 RDF 模拟也可以正常工作。