我想根据构建的本体来验证 RDF 数据(无论格式如何)。
我们可以通过编程方式(模型检查器)解决这个程序来识别数据集本体的一致性吗?
例如,
aaa <http://bbb/date> "2004"^^<http://www.w3.org/2001/XMLSchema#integer> .
上面的三元组有一个属性 date,它需要对象位置的日期。假设在本体中提到了这个约束,我想以编程方式自动验证这个三元组,而无需人工干预。
我想根据构建的本体来验证 RDF 数据(无论格式如何)。
我们可以通过编程方式(模型检查器)解决这个程序来识别数据集本体的一致性吗?
例如,
aaa <http://bbb/date> "2004"^^<http://www.w3.org/2001/XMLSchema#integer> .
上面的三元组有一个属性 date,它需要对象位置的日期。假设在本体中提到了这个约束,我想以编程方式自动验证这个三元组,而无需人工干预。
需要注意的是,本体中指定的数据类型不是约束。相反,当在 OWL 定义中指定数据类型时,它是关于该数据类型范围的声明。这可以被推理引擎用来对图中的数据进行推断。对于域和范围声明也是如此。如果您说关系的范围hasBoyfriend
是 aschema:Person
但在图中添加一个关系 表示Person_A hasBoyfriend Dog_A
,推理引擎将创建一个新谓词,表示Dog_A
既是狗又 schema:Person
是。
正如 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
. 如果您使用物化,则矛盾变得明显,因为数据需要:
ex:aaa onto:date _:bnode .
_:bnode rdf:type xsd:integer .
并且这些数据与本体的结合需要:
_:bnode rdf:type xsd:date .
因此,我们有一个节点属于两种不兼容的数据类型,这是直接矛盾的。
如果您知道您只处理某些类型的不一致,例如数据类型不一致,那么使用成熟的推理器并不是最有效的选择。另外,从您的问题来看,尚不清楚您是要测试逻辑一致性还是某种完整性约束,因为数据类型的情况很特殊。很多人混淆了公理和约束。这就是为什么Henriette Hamrse在她的评论中和Thomas在他的回答中都提到了 ShEx 和 SHACL,这更适合测试约束。