我如何从 OWL 中的两个不同属性中传递地推断出某些东西?

How can I infer something transitively from two different properties in OWL?

我正在尝试使用 Protege 和 OWL 制作我最喜欢的幻想世界的 ontology,但我卡住了。我有 2 个问题,我无法弄清楚自己。但首先是设置:

在我的幻想世界里有很多种族,每个种族又分为很多小派系——每个小派系都有不同的国王,崇拜不同的神等等。

Q1:我希望能够做到的是,知道一个角色A是B阵营的,B是C种族的一个阵营,那么我们应该能够推断 A 来自种族 C.

每个派系都可能包含一些命名角色。我用以下三个 类:

表达了这一点

以及以下属性:

并且我已将属性添加到相应的 类。我知道一般来说一个 Faction 可以有多个类型为“isOfRace”的属性,所以如果是这种情况,推理引擎将不知道其中哪些可以考虑角色的“真实”种族,但我又做了这些属性“ isOfRace”和“isOfFaction”的功能,所以我认为这应该不是问题。

Q2:只有当我在 Q1 中提出的问题可行时,Q2 才有意义。不管怎样,让我们​​再次布置一下设置:

每个派系可以有多个城市(每个城市都属于一个派系),每个城市都位于一个大陆上。每个派系也按对立面“秩序”或“混乱”分类。 OWL 是否支持表示以下内容的结构:

一个派系与另一个派系冲突(传递)当且仅当:

  1. 双方在同一大陆至少拥有一座城市
  2. 他们的阵营不同——例如一个是“秩序”,另一个是“混乱”

或者换句话说,可以推断出 属性 如果是,我应该如何实施上述限制?

谢谢!

在我们深入 OWL 之前,您甚至可以将 RDFS 用于此类事情,但没有您的自定义属性:

ex:SomeFaction rdfs:subClassOf ex:SomeRace .

ex:SomePerson a ex:SomeFaction .

但是我不喜欢这种方法,因为我认为 classes 是描述实体不变的本质和结构的东西,至少派系肯定不会。它也可能导致 OWL 中的冲突,因为某些配置文件不允许将 class 视为个人,如果您想将其用于其他用途。


你的问题类似于试图用 OWL 描述 foaf:membershipClass,这通常很难做到(如果没有 hack 可能是不可能的)。但是,可以逐个描述它:

[
  a owl:Restriction ;
  owl:onProperty ex:isOfFaction ;
  owl:hasValue ex:SomeFaction
] rdfs:subClassOf [
  a owl:Restriction ;
  owl:onProperty ex:hasRace ;
  owl:hasValue ex:SomeRace
]

这基本上是一种暗示,表明任何具有特定派系的人都有特定的种族。

不过,我认为您可以在这里利用传递性来发挥自己的优势:

ex:isOfGroup a owl:TransitiveProperty .

ex:isOfRace rdfs:subPropertyOf ex:isOfGroup .
ex:isOfFaction rdfs:subPropertyOf ex:isOfGroup .

ex:SomeFaction ex:isOfRace ex:SomeRace .
ex:SomePerson ex:isOfFaction ex:SomeFaction .

我们可以推断ex:SomePerson ex:isOfGroup ex:SomeRace.

加上OWL2,简化为属性链:

[
  owl:propertyChainAxiom ( ex:isOfFaction ex:isOfRace )
] rdfs:subPropertyOf ex:hasRace .

第二个问题需要类似的推理。我将尝试使用 OWL 2,因为我怀疑它是否可以在 OWL 1.

中表达
ex:occupiesContinent owl:propertyChainAxiom ( ex:controlsCity ex:onContinent ) .
ex:occupiedByFaction owl:inverseOf ex:occupiesContinent .

ex:sharesContinentWith owl:propertyChainAxiom ( ex:occupiesContinent ex:occupiedByFaction ) .

ex:alignmentOf owl:inverseOf owl:hasAlignment .

ex:hasSameAlignment owl:propertyChainAxiom ( ex:hasAlignment ex:alignmentOf ) .

问题在于我们无法对属性的合取和取反建模。然而,我们可以使用上面的示例来模拟特定派系的敌人:

[
  owl:intersectionOf (
    [
      a owl:Restriction ;
      owl:onProperty ex:sharesContinentWith ;
      owl:hasValue ex:SomeFaction
    ] [
      owl:complementOf [
        a owl:Restriction ;
        owl:onProperty ex:hasSameAlignment ;
        owl:hasValue ex:SomeFaction
      ]
    ]
  )
] owl:equivalentClass [
  a owl:Restriction ;
  owl:onProperty ex:isInConflict ;
  owl:hasValue ex:SomeFaction
] .

这表示任何与一个特定派系共享同一大陆且不具有相同阵营的派系都必须与该派系相关ex:isInConflict

我不确定是否有更好的方法,但如果找到更好的方法,我会更新此答案。