目前我正致力于将关系数据库转换为RDF模型。 在关系数据库中,有三种关系: 1)继承,2)关联,3)聚合。
为了映射继承关系,我添加了一个RDF三元组,
{ Child_Table <rdfs:subClassOf> Parent_Table }
这是怎么写的? 我想将关联和聚合关系映射到RDF模型。应该使用什么Predicates(属性)来映射表之间的关联和聚合关系?它是我想要映射的模式。
让我们说TableA和TableB之间存在聚合关系,有没有办法在RDF中表示这种关系,就像这样。
{ tableA <predicate> tableB}
请指教这个noobie。 :'(
答案 0 :(得分:4)
在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:comment
对您的属性和类进行注释,以指示数据应包含的内容。例如:
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模拟也同样适用。