我创建了一个本体论文章。
我有一个名为AlcoholicBeverage的班级,在这个班级下有子类Beer,Wine。这些子类是不相交的。
我有一个名为Person的类(没有子类)。另一个名为Behavior的类有两个子类“PositiveChange”和“NegativeChange”。
我有一个对象属性“using”,有两个子属性“drink”和“consume”。 “使用”属性的域是Person类,范围是AlcoholicBeverage类。
NegativeChange类具有使用此语句“使用一些AlcoholicBeverage”指示的超类。
当我写DL查询,例如“使用一些啤酒”或“喝一些啤酒”或“消费一些啤酒”时,它应该将其归类为NegativeChange,但事实并非如此。但是,它只在我写“使用一些AlcoholicBeverage”时进行分类,这与AlcoholicBeverage超类部分中写的完全相同。它没有考虑类或对象继承。我希望它应该将啤酒分类为酒精饮料或将“消费”对象属性归类为“使用”对象属性。
感谢您的帮助。
答案 0 :(得分:1)
根据您制定的查询,您似乎想要检索使用酒精的人。
对于您当前的构造,Behavior类首先被“错误地”归类为Person,因为使用对象属性的域。此外,您应该将使用一些AlcoholicBeverage 的匿名表达式声明为NegativeChange类的等效,而不是当前的情况。查询使用一些啤酒或饮用一些葡萄酒然后将在NegativeChange下正确分类。
检索酒精消费者的语义正确的解决方案是创建一个名为AlcoholConsumer的类,Person的子类。 AlcoholConsumer的等效定义是使用一些AlcoholicBeverage 。使用Brain实施:
public static void main(String[] args) throws BrainException {
//Declare all the axioms
Brain brain = new Brain();
brain.addClass("AlcoholicBeverage");
brain.addClass("Beer");
brain.subClassOf("Beer", "AlcoholicBeverage");
brain.addClass("Wine");
brain.subClassOf("Wine", "AlcoholicBeverage");
brain.addClass("Person");
brain.addObjectProperty("using");
brain.addObjectProperty("drinking");
brain.subPropertyOf("drinking", "using");
brain.addObjectProperty("consuming");
brain.subPropertyOf("consuming", "using");
brain.addClass("AlcoholConsumer");
brain.subClassOf("AlcoholConsumer", "Person");
brain.equivalentClasses("AlcoholConsumer", "using some AlcoholicBeverage");
//Add the queries
brain.addClass("Query1");
brain.equivalentClasses("Query1", "using some Beer");
brain.addClass("Query2");
brain.equivalentClasses("Query2", "drinking some Beer");
brain.addClass("Query3");
brain.equivalentClasses("Query3", "consuming some Wine");
List<String> subClasses = brain.getSubClasses("AlcoholConsumer", false);
//Should list all the queries
System.out.println(subClasses);
brain.sleep();
brain.save("/home/samuel/Desktop/so.owl");
}