正确使用 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)
我想用 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)