【问题标题】:OWL Intersection on class levelOWL 班级级别的交叉路口
【发布时间】:2014-03-06 10:23:13
【问题描述】:

我有一个这样的类层次结构:

Thing
  - ClassA
    -ClassC
    -ClassD
  - ClassB
    -ClassC
    -ClassE

C 类是 ClassA 和 ClassB 的子类,而 ClassD 和 ClassE 只是 ClassA 或 ClassB 的子类

现在我想指定一个类,它相当于 ClassA 和 ClassB 的子类的交集。以下不起作用:

NamedClass a owl:Class
NamedClass owl:equivalentClass (ClassA and ClassB)

原因是推理器将使用这种规则对个体进行分类,即我是否有一个属于 ClassA 和 ClassB 类型的个体 Ind1,它也会被分类为 NamedClass 类型。这不是(唯一)我想要的。我希望 ClassC 本身成为 NamedClass 的子类。

我知道这可以通过使用规则(例如 SPIN)来实现,但可以在没有规则的情况下完成吗?

【问题讨论】:

  • F owl:equivalentClass (A and B) 有什么问题?如果您检查推理器,您会发现CF 的子类。这是一个简单的推论:某物是 C,那么它就是 A;如果某物是 C,那么它就是 B;因此,如果某物是 C,那么它就是 A 和 B;因此,如果是 A 和 B,那么它是 F;因此,如果某物是 C,那么它就是 F。这就是子类关系的定义。
  • 不,Joshua,它不起作用。例如,当我有像 owl:equivalentClass(property1 some ClassB) 这样的关系但我的示例中的 Intersection 不起作用时,它确实有效。当我启动推理器时(不管是哪一个),ClassC 不属于 NamedClass 的子类。
  • 我添加了一个答案,显示了一个具有 Protégé 结构的本体。 Pellet 正确地将我的 C 类归类为 F 的子类(您一直称之为 NamedClass)。
  • 我看到你已经接受了答案,谢谢!您是否有机会查明您一直看到的有问题的行为?其他一些建模结构可能没有达到预期的效果,我们也许可以追踪到……
  • 看我对你的回答的评论:)

标签: type-inference owl inference reasoning


【解决方案1】:

让我们从初始层次结构开始,包括 F,但在我们声明 F 等价于 A 和 B 的交集之前:

然后我们将 (A 和 B) 添加为等价于 F 的类。Protégé 足够聪明,可以在每个相交的类下渲染等价的东西或交集的子类,因此我们看到 F 出现在此处的两个位置。

推理者也可以确认这种关系。在这里,我打开了 Pellet,在 DL 查询中输入了 F,并要求提供子类。果然C是F的子类:

这是您可以复制和粘贴的本体:

@prefix :      <http://stackoverflow.com/q/22221549/1281433/> .
@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#> .

:ontology a owl:Ontology .

:A a owl:Class .
:B a owl:Class .
:C a owl:Class ; rdfs:subClassOf  :A , :B .
:D a owl:Class ; rdfs:subClassOf  :A .
:E a owl:Class ; rdfs:subClassOf  :B .
:F a owl:Class ;
     owl:equivalentClass [ a owl:Class ;
                           owl:intersectionOf  ( :A :B ) ] .

【讨论】:

  • 谢谢,我注意到我有一个不同的问题,由于某种原因阻止了类级别的推理在我的模型中持续存在,所以当我在推理后在 Protege 中打开它时(使用 Jena API),它不完整,在不完整模型上使用推理器也无济于事。尽管我以完全不同的方式解决了我的问题,但您的回答很好地说明了交叉点。
  • 啊,我明白了。好吧,回答你自己的问题没有任何问题。如果您认为您实际遇到的问题可能发生在其他人身上,您也可以将其写成问题并提供答案!
【解决方案2】:

是的,您可以使用 OWL 将一个类定义为两个其他类的交集。 检查OWL 2 Primer

希望我能帮上忙!

PS 如果您想对模型应用更高级的规则,我建议您使用 SWRL,这是 w3c 推荐的。

【讨论】:

  • 我试图这样定义它 但是如上所述,这仅适用于个人。我知道我可以使用 SWRL(我更喜欢 SPIN),但没有它会更好。
  • 有些 ClassC 是另外两个类的子类,这完全没有关系。不存在类不相交的假设,因此既是 ClassA 又是 ClassB 的东西没有任何问题,因此作为 ClassC 的东西也没有问题。所有子类关系都是“如果 X 是 C,则 X 是 A”、“如果 X 是 C,则 X 是 B”形式的 if then。除非另有说明,否则既是 A 又是 B 的东西绝对没有错。
  • 你说得对……我将删除我的编辑,以免给可能的读者造成混淆。
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多