我想使用rdf和rdfs表示以下关系:
“评估技术”具有“评估特性”(AC)的性质。在数据库中,这将由两个表表示,一个用于AT,另一个用于与AC中的外键链接,指向AT中的主键。
因此,到目前为止,我使用rdf和rdfs得到的是表示这两个表的以下类:
ex:AssessmentTechnique rdfs:label "Assessment Technique" .
ex:AssessmentCharacteristic rdfs:label "Assessment Characteristic" .我的问题是关于AC表中的具体特征。这些是否可以--或者它们--正确地称为hasAssessmentCharacteristics的子属性?或者每个特定的特征都应该是它自己的属性?我尝试将它们创建为子属性,但是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中使用容器的一些方法,但从我对参比物质的阅读来看,这似乎涉及到母鸡的房子和其中所包含的母鸡,而不是包含或收集母鸡不同类型的特征的一种方法(将隐喻的使用范围扩展到以下内容)
因此,如果我要创建一长串的属性,而没有任何“标记”,以保持它们的组织,我将做一些评论。但是,如果有一种方法来组织这些使用rdf,rdfs或猫头鹰,那么我会感谢有人指点我的方式。
保罗
发布于 2015-09-21 13:47:11
我的问题是关于AC表中的具体特征。这些是否可以--或者它们--正确地称为hasAssessmentCharacteristics的子属性?或者每个特定的特征都应该是它自己的属性?
甚至不知道域模型的细节,答案在于子属性的实际意义。在以下情况下,属性p是属性q的子属性:
(x,y)隐含q(x,y)
这就是在RDFS推理中如何使用子属性断言。如果一个属性是另一个属性的子属性,那么每当您看到第一个属性的用法时,就可以推断另一个属性。例如,hasDaughter是hasChild的一个子属性,因为我们知道,如果某人有x作为女儿,那么他们就有x作为子属性。
听起来,您需要一个toplevel属性(名称简化) hasCharacteristic,并定义一些指定单个特征的子属性。这没什么问题。例如,在描述一个人时,我们可以:
:hasCharacteristic a rdfs:Property .
:hasHeightInInches rdfs:subPropertyOf :hasCharacteristics ;
rdfs:range xsd:int .
:hasName rdfs:subPropertyOf :hasCharacteristic ;
rdfs:range xsd:string .但是,对于域和范围,您是正确的;如果子属性的域或范围不兼容,那么您需要确保在超级属性上有一个足够公共的超类,或者根本不声明它们。在上面的示例中,您可以请求所有的值:hasCharacteristic,您将得到它们的名称和身高(以英寸为单位),并且得到数字和字符串这一事实不会有问题。
关于域和范围,请记住,具有域D的属性p仅意味着:
(x,y)隐含D(x)
拥有R范围意味着:
(x,y)隐含R(y)
其后果之一是域和范围由子属性“继承”。设p是q的一个子性质,Q是D域,然后从p(x,y)出发,我们可以推论q(x,y) (因为p是q的子性质),然后我们可以推论D(x) (因为D是q的一个域)。这意味着在上面的示例中,您可以在超级属性上声明一个公共域:
:hasCharacteristic a rdfs:Property ;
rdfs:domain :Person .
:hasHeightInInches rdfs:subPropertyOf :hasCharacteristics ;
rdfs:range xsd:int .
:hasName rdfs:subPropertyOf :hasCharacteristic ;
rdfs:range xsd:string .现在,每当你看到,例如,
(x,y)
您可以推断出以下附加信息:
(x,y)
(B)xsd(Y)
发布于 2015-09-20 20:20:49
我尝试将它们创建为子属性,但是hasAssessmentCharacteristics的范围是一个类,子属性的范围通常是xsd:string或xsd:int类型,这违反了子属性具有相同域和范围以及父属性的规则。
那么,为什么不将hasAssesmentCharacteristics的范围定义为类呢?
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 .上面的内容非常好(并且是一致的)。
我能想到这样做的唯一方法是忽略AC表中的每一列都来自同一个表,而是有一系列属性赋值语句,如下所示:
在RDF模型中,您所要解决的问题实际上是非常基本的:与许多其他建模范式不同,属性是一流的公民。属性本身就是“事物”,而不仅仅是类的属性(没有类就不能存在)或表的列(没有表就不能存在)。因此,在某种程度上,人们期望属性的定义与类没有那么紧密的联系。
尽管如此,使用rdfs:subPropertyOf关系将多个属性捆绑在一起的想法是绝对正确的。诀窍是在很高的层次上对域和范围的定义保持沉默。
顺便说一句,如果您从RDFS转到一种更有表现力的语言(如OWL ),那么您可以更好地控制这类事情。OWL允许您指定特定于类的域和范围的限制(尽管仍然不能完全“覆盖”域和父属性的范围)。迁移到OWL是否值得(缺点之一是必须处理更复杂的语言和数据模型)取决于您实际打算使用该模型的目的。
https://stackoverflow.com/questions/32680982
复制相似问题