正确使用 rdfs:subPropertyOf

Proper use of rdfs:subPropertyOf

我想用 rdf 和 rdfs 表示以下关系:

"Assessment Technique" (AT) has a property of "Assessment Characteristics" (AC). In a database, this would be represented by there being two tables, one for AT and the other AC linked with a foreign key in AC pointing back to the primary key in AT.

到目前为止,我使用 rdf 和 rdfs 得到的是以下 classes,它们代表两个 tables:

ex:AssessmentTechnique rdfs:label "Assessment Technique" .
ex:AssessmentCharacteristic rdfs:label "Assessment Characteristic" .

我的问题是关于 AC table 中的具体特征。这些可以——或者它们——被恰当地称为 hasAssessmentCharacteristics 的子属性吗?或者每个特定的特征应该是它自己的 属性?我试图将它们创建为子属性,但是 hasAssessmentCharacteristics 的范围是 class,而子属性的范围通常是 xsd:string 或 xsd:int 类型,这违背了子属性具有与父属性相同的域和范围的规则 属性。所以以下是不正确的,尽管它表达了意图。

ex:hasAssessmentCharacteristics
  rdf:type rdfs:Property;
  rdfs:label "has Assessment Characteristics";
  rdfs:domain ex:AssessmentTechnique;
  rdfs:range ex:AssessmentCharacteristics .

ex:hasNumberOfItems
  rdfs:subPropertyOf ex:hasAssessmentCharacteristics;
  rdfs:label "has Number of Items";
  rdfs:domain ex:AssessmentTechnique;
  rdfs:range xsd:int .

我能想到的唯一其他方法是忽略这样一个事实,即 AC table 中的每一列都来自相同的 table,而是有一系列 属性 像这样的赋值语句:

ex:hasNumberOfItems
  rdf:type rdfs:Property;
  rdfs:domain ex:AssessmentTechnique;
  rdfs:range xsd:int .    

ex:hasPublicAvailability
  rdf:type rdfs:Property;
  rdfs:domain ex:AssessmentTechnique;
  rdfs:range xsd:string .

ex:hasURL
  rdf:type rdfs:Property;
  rdfs:domain ex:AssessmentTechnique;
  rdfs:range xsd:string .

and so on....

我看到有一些方法可以在 rdfs 中放置容器,但从我对 reference material 的阅读来看,这似乎与 鸡舍和其中包含的母鸡有关 而不是包含或收集母鸡不同类型特征的方式(以扩展隐喻的使用)到

因此,如果我要创建一长串没有任何 "tagging" 的属性来使它们井井有条,我会做一些带有注释的事情。但是,如果有一种方法可以使用 rdf 或 rdfs 或 owl 来组织这些,那么我将不胜感激有人为我指路。

保罗

I have tried to create them as sub-properties, but then the range of hasAssessmentCharacteristics is a class and those of sub-properties are usually of type xsd:string or xsd:int, and this goes against the rule that sub-properties have the same domain and range adn the parent property.

那么,为什么不hasAssesmentCharacteristics的范围定义为class呢?

  ex:hasAssessmentCharacteristics
    rdf:type rdfs:Property;
    rdfs:label "has Assessment Characteristics" .

  ex:hasNumberOfItems
    rdfs:subPropertyOf ex:hasAssessmentCharacteristics;
    rdfs:label "has Number of Items";
    rdfs:domain ex:AssessmentTechnique;
    rdfs:range xsd:int .

以上内容非常好(并且一致)。

The only other way I have been able to think of doing this is to ignore the fact that each column from the AC table comes from the same table and instead have a series of property assignment statements like this:

您正在努力解决的问题实际上是 RDF 模型的基础:与许多其他建模范例不同,属性是第一个 class 公民。 属性 本身就是 "thing",而不仅仅是 class 的属性(没有 class 就不可能存在)或 [= 的列37=](没有 table 就不可能存在)。因此,在某种程度上,可以预期属性的定义与 classes 的联系不那么紧密。

也就是说,您使用 rdfs:subPropertyOf 关系将多个属性捆绑在一起的想法绝对没问题。诀窍是在高级别定义域和范围时非常谨慎。

顺便说一句,如果您从 RDFS 转向 OWL 等更具表现力的语言,您对此类事物的控制会更多一些。 OWL 允许您指定 class 特定的域和范围限制(尽管您仍然不能完全 "override" 父属性的域和范围)。迁移到 OWL 是否值得(缺点之一是必须处理更复杂的语言和数据模型)取决于您实际打算使用该模型的目的。

My question is about the specific characterstics in the AC table. Can these be - or are they - properly called sub-properties of hasAssessmentCharacteristics? Or should each specific characteristic be its own property?

甚至不知道你的域模型的细节,答案就在于 sub属性 的实际含义。 A 属性 p 是 属性 q 的子属性 恰好在:

p(x,y) 表示 q(x,y)

这就是在 RDFS 推理中使用 sub属性 断言的方式。如果一个 属性 是另一个的子属性,那么只要您看到第一个的用法,就可以 推断 另一个。因此,例如,hasDaughter 是 hasChild 的子属性,因为我们知道如果某人有一个 x 作为女儿,那么他们就有一个 x 作为 child.

听起来您想要一个顶层 属性(名称简化)hasCharacteristic 并定义一些子属性来指定各个特征。这没有问题。例如,在描述一个人时,我们可能会这样做:

:hasCharacteristic a rdfs:Property .

:hasHeightInInches rdfs:subPropertyOf :hasCharacteristics ;
                   rdfs:range xsd:int .

:hasName           rdfs:subPropertyOf :hasCharacteristic ;
                   rdfs:range xsd:string .

不过,您对域和范围的看法是正确的;如果子属性的域或范围不兼容,那么您需要确保在超级 属性 上有一个足够通用的超类,或者根本不声明它们。在上面的例子中,你可以要求一个人的所有 :hasCharacteristic 值,你会得到他们的名字和身高(以英寸为单位),而且你得到数字和字符串也没有问题.

关于域和范围,请记住具有域 D 的 属性 p 仅意味着:

p(x,y) 表示 D(x)

并且具有范围 R 意味着:

p(x,y) 表示 R(y)

其后果之一是域和范围由子属性“继承”。假设p是q的sub属性,q有定义域D。那么从p(x,y)我们可以推导出q(x,y)(因为p是q的sub属性 ),然后我们可以推断出 D(x)(因为 D 是 q 的域)。这意味着在我上面的示例中,您可以在 super属性:

上声明一个公共域
:hasCharacteristic a rdfs:Property ;
                   rdfs:domain :Person .

:hasHeightInInches rdfs:subPropertyOf :hasCharacteristics ;
                   rdfs:range xsd:int .

:hasName           rdfs:subPropertyOf :hasCharacteristic ;
                   rdfs:range xsd:string .

现在,每当你看到,例如,

hasName(x,y)

您可以推断此附加信息:

hasCharacteristic(x,y)
人(x)
xsd:字符串(x)