正确使用 rdfs:subPropertyOf

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 来组织这些,那么我会很感激有人指点我。

保罗

Jos*_*lor 5

我的问题是关于 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)