我想使用 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 想到的是以下代表两个表的类:
ex:AssessmentTechnique rdfs:label "Assessment Technique" .
ex:AssessmentCharacteristic rdfs:label "Assessment Characteristic" .
我的问题是关于AC表中的具体特征。这些可以 - 或者它们 - 正确地称为 hasAssessmentCharacteristics 的子属性吗?或者每个特定特征都应该是它自己的属性(property)?我尝试将它们创建为子属性,但是 hasAssessmentCharacteristics 的范围是一个类,而子属性的范围通常为 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 表中的每一列都来自同一个表的事实,而是具有一系列如下所示的属性赋值语句:
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 的阅读来看似乎这涉及鸡舍和其中包含的母鸡,而不是包含或收集母鸡不同类型特征的方式(以扩展隐喻的使用)到诸如
- 解剖
- 饮食
- 行为
- 等等......
因此,如果我要创建一长串属性,而不使用任何“标记”来保持它们井井有条,我会用注释做一些事情。但如果有一种方法可以使用 rdf 或 rdfs 或 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?
即使不知道域模型的具体细节,答案就在于子属性的实际含义。在以下情况下,属性 p 是属性 q 的子属性:
p(x,y) 蕴含 q(x,y)
这就是 RDFS 推理中使用子属性断言的方式。如果一个属性是另一个属性的子属性,那么每当您看到第一个属性的用法时,您就可以推断另一个属性。因此,例如,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 .
不过,您对域和范围的看法是正确的;如果子属性的域或范围不兼容,那么您需要确保您在 super 属性上有足够通用的父类(super class),或者根本不声明它们。在上面的示例中,您可以询问一个人的 :hasCharacteristic 的所有值,并且您将获得他们的姓名和高度(以英寸为单位),并且您获得数字和字符串这一事实不会有任何问题.
关于域和范围,请记住具有域 D 的属性 p 仅意味着:
p(x,y) 蕴含 D(x)
并且范围 R 意味着:
p(x,y) 蕴含 R(y)
这样做的后果之一是域和范围被子属性“继承”。假设p是q的子属性,q有定义域D。那么从p(x,y),我们可以推断出q(x,y)(因为p是q的子属性),然后我们可以推断出D( x)(因为 D 是 q 的域)。这意味着在上面的示例中,您可以在 super 属性上声明一个公共(public)域:
: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)
您可以推断以下附加信息:
有特征(x,y)
人(x)
xsd:字符串(y)
关于rdf - 正确使用rdfs :subPropertyOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32680982/