我一直在四处寻找但是找不到一个很好的方法来模拟以下内容,我在owl中有两个类,另一个是另一个类的基类:
:Base rdf:type owl:Class .
:Sub rdf:type owl:Class;
rdfs:subClassOf :Base .
:hasDescription rdf:type owl:DatatypeProperty .
我想要所有的实例:Base有一个固定的描述(:hasDescription" BASE"),以及所有的实例:Sub有不同的固定描述(:hasDescription" SUB&#34 )。但我想避免为每个实例创建一个三元组,例如
:Base1 rdf:type :Base;
:hasDescription "BASE" .
我尝试使用猫头鹰:限制:
:Base rdf:type owl:Class .
rdf:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty :hasDescription ;
owl:hasValue "BASE"
] .
:Sub rdf:type owl:Class;
rdfs:subClassOf :Base ,
[ rdf:type owl:Restriction ;
owl:onProperty :hasDescription ;
owl:hasValue "SUB"
] .
但这不会起作用,因为那样:Sub会同时拥有" BASE"和" SUB"作为描述,因为它是Base的子类,Base又是带有值" BASE"的限制的子类。任何人都有关于如何在猫头鹰中做到这一点的建议?谢谢。
答案 0 :(得分:0)
我认为这可能是可能的,但它突出了面向对象编程语言与OWL中存在的类层次结构之间的差异。它们是非常不同的东西,考虑更改模型可能是有意义的,因为您可能找不到满意的解决方案。
子类的每个实例都是其所有祖先的实例。这就是为什么你断言像
这样的东西Base SubClassOf(hasDescription value“BASE”)
Base的子类的所有实例也将具有该值。 (当然,你已经知道了;你在问题中描述过它。)
你可以说,不 Sub实例的Base实例的值为“BASE”,Sub的实例的值为“SUB”,带有两个公理。有人说Sub的实例的值为“SUB”(你已经知道如何做了):
Sub SubClassOf(hasDescription value“SUB”)
要说,不 Sub的实例的Base实例的值为“BASE”,您可以使用类似的通用类公理:
Base和(不是Sub)SubClassOf(hasDescription值“BASE”)
在其他问题和答案中已经讨论了创建一般类公理的过程,并不难。参见,例如:
你可能遇到的困难是要使用这个公理。通常,当您断言某个东西是Base的实例时,您没有明确断言它是不是子类的实例。这是开放世界假设的一种表现:仅仅因为你不知道某些事情是真的并不意味着你不知道这是假的。
当然,您可以通过向个人添加其他类型断言来实现这一点。例如,如果x是Base而不是Sub,则只需要说:
x:基地
x:不是Sub