我试图弄清楚 Jena(或任何其他 SPARQL 更新服务器)是否会强制执行本体约束。例如,我想强制只允许具有类型 x 的实体具有属性 y,并且属性的值必须具有类型 z。我认为这是 OWL 可以提供的,但我不确定。另外,具体来说,Jena 是否会确保如果我尝试编写不遵循这些规则的 SPARQL 更新查询,该更新将无法插入并返回错误?
2 回答
例如,我想强制只允许具有类型 x 的实体具有属性 y,并且属性的值必须具有类型 z。我认为这是 OWL 可以提供的,但我不确定。
你所要求的不是OWL 提供的。在 OWL 中,您可以这样说:
propertyY rdfs:domain typeX
propertyY rdfs:domain typeZ
但这并不意味着(至少,按照您所期望的方式),只有 X 类型的东西才能具有 propertyY 的值,并且这些值必须是 Z 类型。这意味着每当您看到使用 propertyY 的断言,例如
a 属性 Y b
OWL 推理器可以推断出
a rdf:type X
b rdf:type typeZ
唯一一次这些推论将是任何类型的“违反约束”是如果您有其他方式推断a 不能属于 X 类型,或者b 不能属于 Z 类型。然后 OWL 推理器会识别出不一致。
我试图弄清楚 Jena(或任何其他 SPARQL 更新服务器)是否会强制执行本体约束。…另外,具体来说,Jena 是否会确保如果我尝试编写不遵循这些规则的 SPARQL 更新查询,该更新将无法插入并返回错误?
我不知道 Jena 是否支持这种开箱即用的功能,但您可能也可以:
- 使用附有推理器的 OntModel,并针对该图运行 SPARQL 更新。然后,您可以查询图表,看看是否发现任何不一致的地方。如何做到这一点将取决于推理器如何发出不一致的信号。这可能不是那么难,但请记住,Jena 确实是基于 RDF 的,并且对于完整的 OWL 推理,您需要另一个与 Jena 集成的推理器(例如,Pellet,但我认为还有其他推理器)。
- 或者,您可以使用内置推理的商店,并且可能已经具有这种功能。我认为 Stardog 具有其中的一些功能。
关于OWL,你需要了解的是财产限制:
属性限制是一种特殊的类描述。它描述了一个匿名类,即所有满足限制的个体的类。OWL 区分了两种属性限制:值约束和基数约束。
值约束在应用于此特定类描述时对属性范围施加约束。
在这个特定的类描述的上下文中,基数约束对属性可以取的值的数量施加了约束。
根据您的问题的描述,您需要使用值约束。存在这些值约束:一些 ( someValuesFrom
)、仅 ( allValuesFrom
) 和完全 ( hasValue
)。
例如:
Class: Woman subClassOf: hasGender only Female
Class: Mother subClassOf: hasChild some Child
Class: Employee subClassOf: hasEmployeeID exaclty 1 ID
因此,根据您定义的对个人的限制,这些个人可以由推理器分类到正确的类别下,这将是他们的类型。系统通常不会阻止您输入虚假信息,但该概念将被宣布为无法满足或不一致。在输入与本体中的常量不相容的个体的情况下,本体变得不一致(一切都出错)然后你可以收回我认为的最后一个事实。我不确定 Jena,但是 OWL-API 可以让您暂时向本体管理器添加一个概念,然后您可以检查本体的一致性。通常,当此检查出错时,您可以删除对本体管理器的最后未保存的更改(通过更改侦听器),如果一切正确,