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