Pau*_*ney 5 rdf semantic-web rdfs
我想使用 rdf 和 rdfs 表示以下关系:
“评估技术”(AT)具有“评估特征”(AC)的属性。在数据库中,这将表示为有两个表,一个用于 AT,另一个 AC 与 AC 中的外键链接,指向 AT 中的主键。
所以到目前为止,我使用 rdf 和 rdfs 提出的是以下代表两个表的类:
ex:AssessmentTechnique rdfs:label "Assessment Technique" .
ex:AssessmentCharacteristic rdfs:label "Assessment Characteristic" .
Run Code Online (Sandbox Code Playgroud)
我的问题是关于 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 .
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一另一种方法是忽略 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....
Run Code Online (Sandbox Code Playgroud)
我已经看到有一些方法可以在 rdfs 中使用容器,但是从我阅读参考资料来看,这似乎与鸡舍和其中包含的母鸡有关,而不是包含或收集不同类型的母鸡特征的方法(将比喻的使用扩展到诸如
因此,如果我要创建一长串没有任何“标记”的属性以保持井井有条,我将使用注释做一些事情。但是如果有一种方法可以使用 rdf 或 rdfs 或 owl 来组织这些,那么我会很感激有人指点我。
保罗
我的问题是关于 AC 表中的特定特征。这些可以 - 或者它们 - 正确地称为 hasAssessmentCharacteristics 的子属性吗?或者每个特定的特征都应该是它自己的属性?
甚至不知道域模型的细节,答案就在于子属性的实际含义。在以下情况下,属性 p 是属性 q 的子属性:
p(x,y) 意味着 q(x,y)
这就是在 RDFS 推理中使用子属性断言的方式。如果一个属性是另一个属性的子属性,那么每当您看到第一个属性的用法时,您就可以推断出另一个。因此,例如,hasDaughter 是 hasChild 的子属性,因为我们知道如果某人有 ax 作为女儿,那么他们有 x 作为孩子。
听起来您希望拥有一个顶级属性(名称简化) hasCharacteristic 并定义一些指定个人特征的子属性。这没有问题。例如,在描述一个人时,我们可能会这样做:
:hasCharacteristic a rdfs:Property .
:hasHeightInInches rdfs:subPropertyOf :hasCharacteristics ;
rdfs:domain xsd:int .
:hasName rdfs:subPropertyOf :hasCharacteristic ;
rdfs:domain xsd:string .
Run Code Online (Sandbox Code Playgroud)
不过,您对域和范围的看法是正确的;如果子属性的域或范围不兼容,那么您需要确保在 super 属性上有足够通用的超类,或者根本不声明它们。在上面的示例中,您可以询问一个人的 :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 的域)。这意味着在我上面的示例中,您可以在超级属性上声明一个公共域:
:hasCharacteristic a rdfs:Property ;
rdfs:domain :Person .
:hasHeightInInches rdfs:subPropertyOf :hasCharacteristics ;
rdfs:domain xsd:int .
:hasName rdfs:subPropertyOf :hasCharacteristic ;
rdfs:domain xsd:string .
Run Code Online (Sandbox Code Playgroud)
现在,每当你看到,例如,
hasName(x,y)
您可以推断出以下附加信息:
hasCharacteristic(x,y)
Person(x)
xsd:string(x)