问题描述
我想根据构建的本体验证 RDF 数据(无论格式如何)。
我们能否以编程方式(模型检查器)解决此程序以识别数据集本体的一致性?
例如,
aaa <http://bbb/date> "2004"^^<http://www.w3.org/2001/XMLSchema#integer> .
上面的三元组有一个属性日期,需要对象位置有日期。假设本体中提到了这个约束,我想在没有人为干预的情况下以编程方式自动验证这个三元组。
解决方法
需要注意的是,本体中指定的数据类型不是约束。相反,当在 OWL 定义中指定数据类型时,它是关于该数据类型范围的声明。推理引擎可以使用它来对图中的数据进行推断。对于域和范围声明,也如此。如果您说关系 hasBoyfriend
的范围是 schema:Person
,但向图中添加了一个表示 Person_A hasBoyfriend Dog_A
的关系,推理引擎将创建一个表示 {{1} } 既是狗 又是 Dog_A
。
正如 Henriette 在评论中提到的,对于一致性检查,您需要使用一种单独但相关的技术:shex 或 shacl。在尝试之前,请确保您使用的任何堆栈都支持其中一个!
,您可以通过将本体和数据组合在一起并使用推理器来测试 RDF 数据与本体的一致性。对此有不同的方法:将所有内容加载到推理器的数据结构中并从那里测试一致性,或者使用数据库来具体化推断数据并寻找矛盾的事实。
例如,如果您有一个本体说:
onto:date a owl:DatatypeProperty;
rdfs:range xsd:date .
并且您的数据具有:
ex:aaa onto:date "2004"^^xsd:integer .
那么根据 OWL 推理器,甚至支持数据类型 xsd:date
和 xsd:integer
的 RDFS 推理器,两者的合并将是不一致的。如果您使用物化,矛盾就会变得明显,因为数据需要:
ex:aaa onto:date _:bnode .
_:bnode rdf:type xsd:integer .
并且这些数据与本体的结合需要:
_:bnode rdf:type xsd:date .
因此我们有一个节点属于两种不兼容的数据类型,这是一个直接的矛盾。
如果您知道自己只处理某些类型的不一致,例如数据类型不一致,那么使用成熟的推理器并不是最有效的选择。另外,从您的问题来看,不清楚您是要测试逻辑一致性还是某种完整性约束,因为数据类型的情况很特殊。很多人混淆了公理和约束。这就是为什么她评论中的 Henriette Hamrse 和 Thomas 中的 his answer 都指的是 ShEx 和 SHACL,它们更适合测试约束。