2

我是 Protégé 的新手。我正在开发一个本体。我的一部分本体类通过“有”关系与其他类连接。例如:

Activity has Location
Household has Location
Intervention has CloseWork

我在 Protege 中将 Activity、Household、Location、Intervention 和 CloseWork 声明为类。我将“有”声明为 ObjectProperty。为了显示类之间的关系,我设置了“具有”ObjectProperty 的域和范围。例如:为了显示“Activity has Location”,我将 Activity 设置为域,将 Location 设置为范围。我将我的本体保存为 RDF/XML 语法。文件显示我的“有”对象属性,如下所示:

<owl:ObjectProperty rdf:about="www.ndssl.vbi.vt.edu/epidl#has">
    <rdfs:domain rdf:resource="www.ndssl.vbi.vt.edu/epidl#Activity"/>
    <rdfs:domain rdf:resource="www.ndssl.vbi.vt.edu/epidl#Household"/>
    <rdfs:range rdf:resource="www.ndssl.vbi.vt.edu/epidl#Location"/>
    <rdfs:domain rdf:resource="www.ndssl.vbi.vt.edu/epidl#Intervention"/>
    <rdfs:range rdf:resource="www.ndssl.vbi.vt.edu/epidl#CloseWork"/>
</owl:ObjectProperty>

从上面的 RDF 语句中,无法确定哪个域连接到哪个范围(例如,Activity 有 Location)。请让我知道如何解决它。

4

1 回答 1

6

你不能以这种方式使用rdfs:domainrdfs:range。通过说 的域has由 组成ActivityHousehold并且Intervention您有效地断言使用该has属性的每个人同时是所有这三个类的实例。这可能不是你想要的。

相反,您需要使用 OWL 限制。在这种情况下,您需要一个owl:allValuesFrom限制。你在他们所持有的班级上表达这些。因此,例如,在类上,Activity您可以表达一些效果(在 Turtle 语法中):

  :Activity rdfs:subClassOf [ a owl:Restriction ; 
                              owl:onProperty :has ; 
                              owl:allValuesFrom :Location . ]

这表示如果类的实例Activity使用该has属性,则该属性的值必须是 a Location

冲洗并重复其他特定类别的限制。

另一种方法是使用更具体的属性,而不是使用相当无意义的一般“有”关系。例如:

:hasLocation a owl:ObjectProperty ;
         rdfs:range :Location .

:hasCloseWork a owl:ObjectProperty ;
         rdfs:domain :Intervention ;
         rdfs:range :CloseWork .

这种方法的另一个优点是您的数据在语义上变得更加丰富,并且更易于查询(假设这是您将来想要做的事情)。

于 2016-01-15T21:51:54.487 回答