类表达式
hasTopping 一些 CheeseTopping
是一组个体,每个个体都通过 hasTopping 属性与某个 CheeseTopping 相关联。在没有个体的 Pizza 本体中,您仍然可以获得此查询的类子类结果,因为某些类型的 Pizzas(例如 American)的定义是这样的,任何美国人的 Pizza 都必须有这样的浇头。
现在,结构相似的查询
isToppingOf 一些美国人
是一组个体,每个个体都通过 isToppingOf 属性与某个美国披萨相关联。但是,Pizza 本体没有定义特定的个体,因此没有任何个体作为候选者。但是那些可能是这个表达式的子类的类呢?例如,您提到了 FourCheeseTopping。现在,FourCheeseTopping 的某些特定实例,例如,fourCheeseTopping23 可能是一些美国披萨的浇头,例如:
fourCheeseTopping23 isToppingOf AmericanPizza72
但是,fourCheeseTopping 可能还没有放在任何特定的比萨饼上。当我们选择一个 FourCheeseTopping 类型的任意个体时,我们不能推断它是某个美国披萨的浇头,因此我们不能推断 FourCheeseTopping 类是
isToppingOf 一些美国人
因为并非FourCheeseTopping 的每个实例 都必须是某些美国披萨的浇头。对于可能使逻辑结构更清晰的类似情况,请考虑类 Employer 和 Person,以及对象属性雇员及其逆雇员。我们可以说每个 Employer 都必须有一些 Person 作为 Employee(否则他们就不是雇主):
雇主 ⊑雇用一些人
但是,由于一个人可能会失业,所以 不是
人 ⊑受雇于一些雇主
即使employees 和employedBy 是相反的。
但是,如果您想知道特定类型的浇头是否可以放入特定类型的比萨饼中,您可以做的是询问
PizzaType ⊓ ∃hasTopping.ToppingType
等价于 owl:Nothing 或其子类。例如,由于美国披萨只有 TomatoTopping、MozzarellaTopping 和 PeperoniTopping [sic] 类型的配料,因此该类
美国⊓ ∃hasTopping.MixedSeafoodTopping
相当于owl:Nothing:
另一方面,由于美国披萨必须有 MozzarellaTopping,所以类
美国⊓ ∃hasTopping.MozzarellaTopping
相当于美式: