SPARQL 更新验证
SPARQL UPDATE validation
我有一个 Sesame triplestore,其中导入了 ontology。
我知道我可以通过插入实例、删除实例和更新事物来对其执行 SPARQL 更新操作。
但是如果以错误的方式使用这些操作怎么办,比如插入一个没有逻辑且不遵守 ontology 规则的无效三元组。三重像:
foo:Anna foo:likesToEat foo:arsenic.
ontology 看起来像这样:
@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.
如您所见,三元组 "foo:Anna foo:likesToEat foo:arsenic" 无效,因为不遵守 objectProperty 的范围。
我的问题是:
是否有验证此类更新的方法,以便仅在 ontology 得到遵守时才会执行更新操作?有没有办法设置三重存储来验证这些东西,或者必须手动完成?
As you can see the triple "foo:Anna foo:likesToEat foo:arsenic" is invalid because the range of the objectProperty is not respected.
这不是 (RDF(S)) 本体的工作方式。从 ontology 的角度来看,这个三元组是完全有效的。 foo:likesToEat
的范围被定义为 class foo:Food
只是意味着我们可以推断出 foo:arsenic
是 foo:Food
类型。在您的 ontology 中没有任何内容使它无效或不一致:毕竟您在任何地方都说过某物不能 两者 是食物和金属。
更一般地说:RDF Schema 中的domain/range 语句不是关于"closing" 可以使用属性 的内容。 RDF 的语义以相反的方式工作:domain/range 对 属性 P
的限制指定 if 某个个体 X
使用属性P
,我们可以推断X
属于P
的domain/rangeclass。
Sesame 中没有内置功能来执行您要求的那种验证,主要是出于这个原因。
但是,如果您真的想要,您当然可以实施一些在插入您认为无效的三元组(无论出于何种原因)时拒绝或发出警告的东西。根据您的用例,您有多种选择:
- 实施
Sail(Connection)Wrapper
或 Repository(Connection)Wrapper
来拦截插入操作并进行必要的验证。
- 实施一个
RDFHandler
(例如 RDFInserter
的子 class)来进行验证,并使用该处理程序来处理 add/validate 数据(而不是使用标准RepositoryConnection.add
直接方法)。
任何一种方法都允许您检查每个传入的三元组,在数据库中快速查找其谓词,检查是否有 domain/range 限制,以及三元组是否 "violates" 该限制抛出一个错误。第二种方法可能最容易做到,也最灵活:您可以在代码中的某些用例中使用这种验证,并且可以在您知道不需要的地方完全跳过它(因为很明显,这种验证会带来性能损失)。
Jeen 在描述 RDFS 或 OWL 在这种情况下的工作原理时非常准确。
正如他提到的,要执行验证,您需要一个封闭的世界,这不是您通常使用 RDFS 或 OWL 语义所能获得的。
话虽如此,想要验证您的数据是一件非常合理的事情! W3C 正试图在此 area 中定义某些内容,但尚未标准化。 iirc,TopBraid 对它有一些支持,但随着工作组发展标准,它可能会有点移动目标。不知道有没有芝麻API,我以为TopBraid用的是Jena,不过应该是值得一看
Stardog ships with Integrity Constraint Validation (tutorial available here),这是一种不同的数据验证方式,使用 OWL、SPARQL 或规则作为定义约束的语法。免责声明是我正在研究这个,但它是相关的,因为 a) 它确实像你正在寻找的那样进行验证,并且 b) 它支持芝麻 API.
我有一个 Sesame triplestore,其中导入了 ontology。
我知道我可以通过插入实例、删除实例和更新事物来对其执行 SPARQL 更新操作。
但是如果以错误的方式使用这些操作怎么办,比如插入一个没有逻辑且不遵守 ontology 规则的无效三元组。三重像:
foo:Anna foo:likesToEat foo:arsenic.
ontology 看起来像这样:
@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.
如您所见,三元组 "foo:Anna foo:likesToEat foo:arsenic" 无效,因为不遵守 objectProperty 的范围。
我的问题是:
是否有验证此类更新的方法,以便仅在 ontology 得到遵守时才会执行更新操作?有没有办法设置三重存储来验证这些东西,或者必须手动完成?
As you can see the triple "foo:Anna foo:likesToEat foo:arsenic" is invalid because the range of the objectProperty is not respected.
这不是 (RDF(S)) 本体的工作方式。从 ontology 的角度来看,这个三元组是完全有效的。 foo:likesToEat
的范围被定义为 class foo:Food
只是意味着我们可以推断出 foo:arsenic
是 foo:Food
类型。在您的 ontology 中没有任何内容使它无效或不一致:毕竟您在任何地方都说过某物不能 两者 是食物和金属。
更一般地说:RDF Schema 中的domain/range 语句不是关于"closing" 可以使用属性 的内容。 RDF 的语义以相反的方式工作:domain/range 对 属性 P
的限制指定 if 某个个体 X
使用属性P
,我们可以推断X
属于P
的domain/rangeclass。
Sesame 中没有内置功能来执行您要求的那种验证,主要是出于这个原因。
但是,如果您真的想要,您当然可以实施一些在插入您认为无效的三元组(无论出于何种原因)时拒绝或发出警告的东西。根据您的用例,您有多种选择:
- 实施
Sail(Connection)Wrapper
或Repository(Connection)Wrapper
来拦截插入操作并进行必要的验证。 - 实施一个
RDFHandler
(例如RDFInserter
的子 class)来进行验证,并使用该处理程序来处理 add/validate 数据(而不是使用标准RepositoryConnection.add
直接方法)。
任何一种方法都允许您检查每个传入的三元组,在数据库中快速查找其谓词,检查是否有 domain/range 限制,以及三元组是否 "violates" 该限制抛出一个错误。第二种方法可能最容易做到,也最灵活:您可以在代码中的某些用例中使用这种验证,并且可以在您知道不需要的地方完全跳过它(因为很明显,这种验证会带来性能损失)。
Jeen 在描述 RDFS 或 OWL 在这种情况下的工作原理时非常准确。
正如他提到的,要执行验证,您需要一个封闭的世界,这不是您通常使用 RDFS 或 OWL 语义所能获得的。
话虽如此,想要验证您的数据是一件非常合理的事情! W3C 正试图在此 area 中定义某些内容,但尚未标准化。 iirc,TopBraid 对它有一些支持,但随着工作组发展标准,它可能会有点移动目标。不知道有没有芝麻API,我以为TopBraid用的是Jena,不过应该是值得一看
Stardog ships with Integrity Constraint Validation (tutorial available here),这是一种不同的数据验证方式,使用 OWL、SPARQL 或规则作为定义约束的语法。免责声明是我正在研究这个,但它是相关的,因为 a) 它确实像你正在寻找的那样进行验证,并且 b) 它支持芝麻 API.