首页 > 解决方案 > 表示 OWL 类的部分(分体)传递性的最佳方式?

问题描述

我有基于框架的本体的背景,其中类表示概念,并且对类:类关系的断言没有限制。

我现在正在使用 OWL2 本体,并试图确定表示“规范部分”关系的最佳/推荐方式 - 从概念上讲,这些关系根据定义,对于每个类所代表的事物都是真实的(即,所有实例)。部分关系是可传递的,我想利用这一点,以便能够查询本体中的“(规范)X 的所有部分”。

例如,我可能想代表:

然后使用 SPARQL 传递地查询汽车的零件,取回发动机和活塞。请注意,我希望以后能够代表个别汽车(并且能够通过参考他们的 来推断它们的零件rdf:type),当然我也希望能够代表汽车的子类,所以我不能建模上述类作为个体——它们必须是类。

似乎我有 3 个使用 OWL 的选项,都不理想。是否推荐其中之一(或不鼓励),我是否遗漏了任何一个?

  1. OWL 限制公理:
rdfs:subClassOf(engine, someValuesFrom(partOf, car))
rdfs:subClassOf(piston, someValuesFrom(partOf, engine))

上面的主要缺点是在 SPARQL 中无法通过 partOf 关系进行传递查询,因为它嵌入在 OWL 限制中。我需要 SPARQL 中的某种通用递归功能 - 或者我需要以下规则,据我所知,这不是任何标准 OWL 配置文件的一部分:

前件(主体):
subClassOf(B, (P some A) ^
subClassOf(C, (P some B) ^
transitiveProperty(P)

结果(头部):
subClassOf(C,(P some A))

  1. OWL2 双关语:通过直接在类上声明对象属性,我可以有效地表示类的规范实例上的 partOf 关系。不过,我不确定这是否会与 SPARQL 透明地工作,因为 partOf 关系将在实例上断言(通过双关语),而任何 subClassOf 关系将在类上断言。因此,例如,如果我有一个 subclass six_cylinder_engine,则以下 SPARQL 片段将不会绑定six_cylinder_engine
?part (rdfs:subClassOf*/partOf*)+ car
  1. 注释属性:我可以将 partOf 断言为类的注释属性,其值也是类。我认为这会起作用(减去传递性,但我可以使用上面查询中的 SPARQL 路径很容易地恢复它),但这似乎是对注释属性的预期用途的滥用。

标签: owlontology

解决方案


我认为您已经对问题以及不同方法的优缺点进行了很好的分析。我不知道是否有人气馁或鼓励。恕我直言,这个问题没有得到足够的重视,并且在某些领域是一个比其他领域更大的问题(我在经常使用partonomies的生物本体中工作,因此这非常重要)。

对于 1,您的规则是有效的,并且由 OWL 语义证明。还有其他方法可以使用 OWL 推理器以及 RDF 级推理器来实现这一点。例如,使用 OWLAPI 的ROBOT命令行包装器,您可以使用Expression Materializing Reasoner运行原因命令。例如

robot reason --exclude-tautologies true --include-indirect true -r emr -i engine.owl -o engine-reasoned.owl

piston subClassOf partOf some car这将为您提供一个可以使用非传递 SPARQL 查询进行查询的公理。

--exclude-tautologies删除对的推论owl:Thing--include-indirect并将包括及物推论。

对于您的选项 2,您必须小心,因为您可能会引入不正确的推论。例如,假设有一些发动机没有活塞,即engine SubClassOf inverse(part_of) some piston支持。但是,在您的双关语影子世界中,这是必然的。这可能是也可能不是问题,具体取决于您的用例。

您的 2 的一个变体是引入不同的映射规则,用于将 OWL T-Tboxes 分层到 RDF,例如我的OWLStar提案中所述。有了这个提议,existentials 将被映射到直接三元组,但是还有另一种机制(例如具体化)来指示预期的量化。这允许编写既安全(没有不希望的推论)又完整(对于 OWL-RL 中可表达的任何内容)的规则。这里没有双关语(根据 OWL 的替代 RDF 解释)。您还可以使用您编写的完全相同的传递 SPARQL 查询来获得所需的结果。


推荐阅读