6

在我的本体中,我有三个类,PlayerTeamCompetition。我也有两个对象属性,employsCompetitionInemployees的域是Team,范围是Player , competitsIn的域是Team Player,范围是Competition

我希望本体推断,如果一个玩家被一个团队雇用并且该团队参加了比赛,那么该球员也参加了该比赛。有没有办法将此信息添加到本体而不为本体中的每个人放入 {Player} CompetitionsIn {Competition}?

4

1 回答 1

11

首先,如果您提供了最小本体作为起点,那么回答这个问题会更容易。幸运的是,这很简单。在 Turtle 序列化中:

@prefix :      <https://stackoverflow.com/q/22688901/1281433/competitions#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<https://stackoverflow.com/q/22688901/1281433/competitions>
        a       owl:Ontology .

:Player  a      owl:Class .
:Team   a       owl:Class .
:Competition  a  owl:Class .

:employs  a          owl:ObjectProperty ;
        rdfs:domain  :Team ;
        rdfs:range   :Player .

:competesIn  a       owl:ObjectProperty ;
        rdfs:domain  [ a            owl:Class ;
                       owl:unionOf  ( :Player :Team )
                     ] ;
        rdfs:range   :Competition .

我们实际上不需要属性上的域和范围声明来完成这项工作,但无论如何我已经包含了它们,因为你提到了它们。你试图表达“如果球队雇佣了一名球员,球队在比赛中竞争,那么球员也在竞争中”。从逻辑上讲,我们可以将其表示为:

雇员(?team,?player) ∧competitionIn(?team,?competition) → CompetitionsIn(?player,?competition)

描绘一下我们拥有的关系以及我们想要得到的关系是很有用的:

在此处输入图像描述

实线箭头是我们实际拥有的,虚线箭头是我们想要推断的。我们可以使用 OWL 中的子属性链来做到这一点。沿着实线箭头从 ?player 到 ?competiton 存在路径或属性链。路径的第一条边沿反向箭头,所以它是一个反向属性(使用-1),第二条边沿正向箭头,它只是竞争。我们试图说,只要有这样的路径,就会在路径的起点和终点之间存在竞争关系。链写成“employs -1 •competitesIn”,我们要断言它是competitsIn的子属性:

雇用-1 • 竞争 ⊑ 竞争

在 Protégé 中,这看起来像这样:

在此处输入图像描述

这给我们留下了最终的本体:

@prefix :      <https://stackoverflow.com/q/22688901/1281433/competitions#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:Player  a      owl:Class .
:Team   a       owl:Class .
:Competition  a  owl:Class .

<https://stackoverflow.com/q/22688901/1281433/competitions>
        a       owl:Ontology .

:employs  a          owl:ObjectProperty ;
        rdfs:domain  :Team ;
        rdfs:range   :Player .

:competesIn  a                  owl:ObjectProperty ;
        rdfs:domain             [ a            owl:Class ;
                                  owl:unionOf  ( :Player :Team )
                                ] ;
        rdfs:range              :Competition ;
        owl:propertyChainAxiom  ( [ owl:inverseOf
                          :employs ] :competesIn ) .

限制适用的主题

最初的问题中没有提到,但在评论中透露,除了球员之外的东西可以被团队使用,其中一些东西不应该被推断为参加比赛。这仍然可以处理,但它会变得更加完整。诀窍是要意识到你需要一个新的公理形式:

p • 雇员-1 • 竞争 ⊑ 竞争

其中 p 是将每个玩家与他或她自己联系起来的一些特殊属性。构建这样的属性称为 rolification。该技术已在另一个 Stack Overflow 问题OWL 2 rolification以及与该问题相关联的学术出版物中进行了详细描述。Stack Overflow 上还有一些其他的答案也涉及到 rolation。answers.semanticweb.com上也有一些。无论如何,想法是定义一个新的属性,对应于类的R Player ,并用公理定义类Player :

Player ≡ R Player some Self

这表示 x 是Player当且仅当R Player (x,x),而这正是我们需要为p填写的属性。这为我们提供了以下本体:

@prefix :      <https://stackoverflow.com/q/22688901/1281433/competitions#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<https://stackoverflow.com/q/22688901/1281433/competitions>
        a       owl:Ontology .

:R_Player  a    owl:ObjectProperty .

:employs  a          owl:ObjectProperty ;
        rdfs:domain  :Team ;
        rdfs:range   :Player .

:competesIn  a                  owl:ObjectProperty ;
        rdfs:domain             [ a            owl:Class ;
                                  owl:unionOf  ( :Player :Team )
                                ] ;
        rdfs:range              :Competition ;
        owl:propertyChainAxiom  ( :R_Player [ owl:inverseOf
                          :employs ] :competesIn ) .

:Team   a       owl:Class .

:Competition  a  owl:Class .

:Player  a                   owl:Class ;
        owl:equivalentClass  [ a               owl:Restriction ;
                               owl:hasSelf     true ;
                               owl:onProperty  :R_Player
                             ] .
于 2014-03-27T15:12:29.020 回答