我有一个Sesame triplestore,其中导入了一个本体。
我知道我可以通过插入实例,删除实例和更新内容和东西来对其执行SPARQL Update操作。
但是如果以错误的方式使用这些操作会怎么样,比如插入一个没有逻辑且不遵守本体规则的无效三元组。三重像:
foo:Anna foo:likesToEat foo:arsenic.
本体看起来像这样:
@prefix foo: <http://www.foo.org/ontologies/example#>.
foo:Anna rdf:type foo:Person.
foo:Anna rdf:type owl:NamedIndividual.
foo:Food rdf:type owl:Class.
foo:Metal rdf:type owl:Class.
foo:Person rdf:type owl:Class.
foo:arsenic rdf:type foo:Metal.
foo:arsenic rdf:type owl:NamedIndividual.
foo:likesToEat rdf:type owl:ObjectProperty.
foo:likesToEat rdfs:domain foo:Person.
foo:likesToEat rdfs:range foo:Food.
foo:pizza rdf:type foo:Food.
foo:pizza rdf:type owl:NamedIndividual.
你可以看到三重奏&#34; foo:Anna foo:likesToEat foo:arsenic&#34;是无效的,因为不尊重objectProperty的范围。
我的问题是:
有没有办法验证这些类型的更新,以便只有在尊重本体时才会执行更新操作?有没有办法设置三重存储来验证这些东西,还是必须手动完成?
答案 0 :(得分:2)
正如你所看到的那样,三重“foo:Anna foo:likesToEat foo:arsenic”无效,因为不尊重objectProperty的范围。
这不是(RDF(S))本体的工作原理。从本体论的角度来看,三元组是完全有效的。将add_body_filter
的范围定义为类foo:likesToEat
这一事实只是意味着我们可以推断出foo:Food
属于foo:arsenic
类型。你的本体论中没有任何内容可以使它无效或不一致:毕竟你已经说过什么都不能两者食物和金属。
更一般地说:RDF Schema中的域/范围语句不是“关闭”可以使用的属性。 RDF的语义相反:对属性foo:Food
的域/范围限制指定如果某个人P
使用属性X
,我们可以推断P
属于X
的域/范围类。
Sesame中没有内置功能来执行您要求的验证类型,主要是出于这个原因。
然而,如果你真的想要,你当然可以实现拒绝或警告何时插入你认为无效的三元组(无论出于何种原因)。根据您的使用情况,您有以下几种选择:
P
或Sail(Connection)Wrapper
来拦截插入操作并进行必要的验证。Repository(Connection)Wrapper
(例如RDFHandler
的子类),并使用该处理程序添加/验证数据(而不是直接使用标准RDFInserter
方法)。 这两种方法都允许您检查每个传入的三元组,在数据库中快速查找其谓词,检查是否存在域/范围限制,以及三元组“违反”该限制是否会引发错误。第二种方法可能最容易做,而且最灵活:您可以在代码中的某些用例中使用此验证,并且可以在您不知道不需要的地方完全跳过它(因为很明显,这种验证会有性能损失。)
答案 1 :(得分:2)
Jeen在他描述RDFS或OWL如何在这种情况下起作用的时候很有用。
正如他所提到的,要执行验证,您需要一个封闭的世界,这不是您通常使用RDFS或OWL语义获得的。
话虽如此,想要验证您的数据是一件非常合理的事情! W3C正试图在这个area中定义一些东西,但是它还没有标准化。 iirc,TopBraid对它有一些支持,但随着工作组发展标准,它可能会成为一个移动目标。我不知道是否有芝麻API,我认为TopBraid使用Jena,但它可能值得一看。
Stardog附带Integrity Constraint Validation(可用教程here),这是使用OWL,SPARQL或规则进行数据验证的不同方法,作为定义约束的语法。免责声明是我在这方面的工作,但它是相关的,因为a)它确实像你正在寻找的验证和b)它支持Sesame API。