owl - 表示 OWL 类的部分(分体)传递性的最佳方式?
问题描述
我有基于框架的本体的背景,其中类表示概念,并且对类:类关系的断言没有限制。
我现在正在使用 OWL2 本体,并试图确定表示“规范部分”关系的最佳/推荐方式 - 从概念上讲,这些关系根据定义,对于每个类所代表的事物都是真实的(即,所有实例)。部分关系是可传递的,我想利用这一点,以便能够查询本体中的“(规范)X 的所有部分”。
例如,我可能想代表:
- “engine”是“car”的一部分,并且
- “活塞”是“发动机”的一部分
然后使用 SPARQL 传递地查询汽车的零件,取回发动机和活塞。请注意,我希望以后能够代表个别汽车(并且能够通过参考他们的 来推断它们的零件rdf:type
),当然我也希望能够代表汽车的子类,所以我不能建模上述类作为个体——它们必须是类。
似乎我有 3 个使用 OWL 的选项,都不理想。是否推荐其中之一(或不鼓励),我是否遗漏了任何一个?
- 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))
- OWL2 双关语:通过直接在类上声明对象属性,我可以有效地表示类的规范实例上的 partOf 关系。不过,我不确定这是否会与 SPARQL 透明地工作,因为 partOf 关系将在实例上断言(通过双关语),而任何 subClassOf 关系将在类上断言。因此,例如,如果我有一个 subclass
six_cylinder_engine
,则以下 SPARQL 片段将不会绑定six_cylinder_engine
:
?part (rdfs:subClassOf*/partOf*)+ car
- 注释属性:我可以将 partOf 断言为类的注释属性,其值也是类。我认为这会起作用(减去传递性,但我可以使用上面查询中的 SPARQL 路径很容易地恢复它),但这似乎是对注释属性的预期用途的滥用。
解决方案
我认为您已经对问题以及不同方法的优缺点进行了很好的分析。我不知道是否有人气馁或鼓励。恕我直言,这个问题没有得到足够的重视,并且在某些领域是一个比其他领域更大的问题(我在经常使用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 查询来获得所需的结果。
推荐阅读
- mysql - MySQL选择前三个字母不同的地方
- ios - 如何存储对 UITableView 单元格中发生的用户交互 UI 元素的更改
- python - python脚本:运行前的git checkout
- objective-c - 制作按钮时传递和使用选择器的问题
- tensorflow - 尽管使用了 tf 数据管道,但训练速度很慢
- jsx - 如何解决意外字符 '�' (1:0) 错误
- r - 如何在 R 中的 acf() 路由中使用“一组滞后(时差)来保留”
- python - ValueError: numpy.ndarray 大小在导入 qiskit 时更改
- android - Android Studio - Kotlin - 添加一个可点击的小型谷歌地图
- c# - 迁移不适用于 ON CASCADE DELETE 行为的所有外键