简单数据映射
在 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
with 与 withAnimalId 72
是相同的资源Animal
,AnimalId 72
但如果您已经实现了关系数据的直接映射,这应该不是问题。
协会
在纯 RDF(S) 中,您只能做继承。当然,您可以声明属性的域和范围,并推断一些类型信息,但您确实无法做太多事情来确保每个Animal
人至少有一种最喜欢的食物。至少,您应该用rdfs:comment
s 注释您的属性和类,以指示数据应该包含的内容。例如:
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 模拟也同样有效。