如何在 OWL 中表示地图?
How to represent maps in OWL?
这是我的 ontology:
的简化摘录
<owl:Class rdf:ID="Role" />
<owl:Class rdf:ID="Location" />
<owl:Class rdf:ID="SalaryRange">
<rdfs:subClassOf rdf:resource="#HasLocation" />
</owl:Class>
<owl:Class rdf:ID="HasLocation" />
<owl:ObjectProperty rdf:ID="location">
<rdfs:domain rdf:resource="#HasLocation" />
<rdfs:range rdf:resource="#Location" />
</owl:ObjectProperty>
<owl:DataProperty rdf:ID="salaryRangeOfRole">
<rdfs:domain rdf:resource="#Role" />
<rdfs:range rdf:resource="#SalaryRange" />
</owl:DataProperty>
我现在如何确保 SalaryRange
中的 Location
每个 Role
都是唯一的?
我已阅读有关 FunctionalProperty
的内容,但不知道如何在这种情况下使用它。
您在这里面临的挑战是您基本上想要对 Role
和 Location
以及 SalaryRange
的唯一约束。功能属性实际上是为单个 属性 定义的 - 除非您通过 class 表达式对某些功能 属性 进行建模。
实现此目的的一个简单方法(如果您使用 OWL)是通过键约束。我努力理解你的例子。因此,我进一步简化了您的示例,假设您有一个 SalaryRange
,其中 Role
和 Location
需要是唯一的。我认为,如果您了解总体思路,您将能够对其进行修改以完全适合您的示例。
我们有您定义的 classes Location
和 Role
。
<owl:Class rdf:about="Location"/>
<owl:Class rdf:about="Role"/>
然后我定义对象属性 role
和 location
如下:
<owl:ObjectProperty rdf:about="location">
<rdfs:domain rdf:resource="SalaryRange"/>
<rdfs:range rdf:resource="Location"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:about="role">
<rdfs:domain rdf:resource="SalaryRange"/>
<rdfs:range rdf:resource="Role"/>
</owl:ObjectProperty>
然后为了确保 SalaryRange
将具有唯一的角色和位置,您可以强制执行如下:
<owl:Class rdf:about="SalaryRange">
<owl:hasKey rdf:parseType="Collection">
<rdf:Description rdf:about="location"/>
<rdf:Description rdf:about="role"/>
</owl:hasKey>
</owl:Class>
您可以对以下人员进行测试:
<owl:NamedIndividual rdf:about="location1">
<owl:sameAs rdf:resource="location2"/>
</owl:NamedIndividual>
<owl:NamedIndividual rdf:about="location2"/>
<owl:NamedIndividual rdf:about="role1">
<owl:sameAs rdf:resource="role2"/>
</owl:NamedIndividual>
<owl:NamedIndividual rdf:about="role2"/>
<owl:NamedIndividual rdf:about="salaryRange1">
<location rdf:resource="location1"/>
<role rdf:resource="role1"/>
</owl:NamedIndividual>
<owl:NamedIndividual rdf:about="salaryRange2">
<location rdf:resource="location2"/>
<role rdf:resource="role2"/>
</owl:NamedIndividual>
对于这些人,像 Hermit 这样的推理者会推断出 salaryRange1
和 salaryRange2
是同一个人。但是,如果您声明 salaryRange1
和 salaryRange2
是 不同的 个个体,您将得到不一致的结果。
<rdf:Description>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AllDifferent"/>
<owl:distinctMembers rdf:parseType="Collection">
<rdf:Description rdf:about="salaryRange1"/>
<rdf:Description rdf:about="salaryRange2"/>
</owl:distinctMembers>
</rdf:Description>
要解决不一致,您可以声明 role1
和 role2
是不同的个体,或者 location1
和 location2
是不同的个体。
这是我的 ontology:
的简化摘录 <owl:Class rdf:ID="Role" />
<owl:Class rdf:ID="Location" />
<owl:Class rdf:ID="SalaryRange">
<rdfs:subClassOf rdf:resource="#HasLocation" />
</owl:Class>
<owl:Class rdf:ID="HasLocation" />
<owl:ObjectProperty rdf:ID="location">
<rdfs:domain rdf:resource="#HasLocation" />
<rdfs:range rdf:resource="#Location" />
</owl:ObjectProperty>
<owl:DataProperty rdf:ID="salaryRangeOfRole">
<rdfs:domain rdf:resource="#Role" />
<rdfs:range rdf:resource="#SalaryRange" />
</owl:DataProperty>
我现在如何确保 SalaryRange
中的 Location
每个 Role
都是唯一的?
我已阅读有关 FunctionalProperty
的内容,但不知道如何在这种情况下使用它。
您在这里面临的挑战是您基本上想要对 Role
和 Location
以及 SalaryRange
的唯一约束。功能属性实际上是为单个 属性 定义的 - 除非您通过 class 表达式对某些功能 属性 进行建模。
实现此目的的一个简单方法(如果您使用 OWL)是通过键约束。我努力理解你的例子。因此,我进一步简化了您的示例,假设您有一个 SalaryRange
,其中 Role
和 Location
需要是唯一的。我认为,如果您了解总体思路,您将能够对其进行修改以完全适合您的示例。
我们有您定义的 classes Location
和 Role
。
<owl:Class rdf:about="Location"/>
<owl:Class rdf:about="Role"/>
然后我定义对象属性 role
和 location
如下:
<owl:ObjectProperty rdf:about="location">
<rdfs:domain rdf:resource="SalaryRange"/>
<rdfs:range rdf:resource="Location"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:about="role">
<rdfs:domain rdf:resource="SalaryRange"/>
<rdfs:range rdf:resource="Role"/>
</owl:ObjectProperty>
然后为了确保 SalaryRange
将具有唯一的角色和位置,您可以强制执行如下:
<owl:Class rdf:about="SalaryRange">
<owl:hasKey rdf:parseType="Collection">
<rdf:Description rdf:about="location"/>
<rdf:Description rdf:about="role"/>
</owl:hasKey>
</owl:Class>
您可以对以下人员进行测试:
<owl:NamedIndividual rdf:about="location1">
<owl:sameAs rdf:resource="location2"/>
</owl:NamedIndividual>
<owl:NamedIndividual rdf:about="location2"/>
<owl:NamedIndividual rdf:about="role1">
<owl:sameAs rdf:resource="role2"/>
</owl:NamedIndividual>
<owl:NamedIndividual rdf:about="role2"/>
<owl:NamedIndividual rdf:about="salaryRange1">
<location rdf:resource="location1"/>
<role rdf:resource="role1"/>
</owl:NamedIndividual>
<owl:NamedIndividual rdf:about="salaryRange2">
<location rdf:resource="location2"/>
<role rdf:resource="role2"/>
</owl:NamedIndividual>
对于这些人,像 Hermit 这样的推理者会推断出 salaryRange1
和 salaryRange2
是同一个人。但是,如果您声明 salaryRange1
和 salaryRange2
是 不同的 个个体,您将得到不一致的结果。
<rdf:Description>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AllDifferent"/>
<owl:distinctMembers rdf:parseType="Collection">
<rdf:Description rdf:about="salaryRange1"/>
<rdf:Description rdf:about="salaryRange2"/>
</owl:distinctMembers>
</rdf:Description>
要解决不一致,您可以声明 role1
和 role2
是不同的个体,或者 location1
和 location2
是不同的个体。