我已经创建了一个可以保存本体的本体。

我有一个名为AlcoholicBeverage的类,该类下有啤酒,葡萄酒等子类。这些子类是不相交的。

我有一个叫做Person的类(没有子类)。另一个名为Behavior的类具有两个子类“ PositiveChange”和“ NegativeChange”。

我有一个对象属性“正在使用”以及两个子属性“饮用”和“消费”。 “使用”属性的域是Person类,范围是AlcoholicBeverage类。

NegativeChange类具有此语句“使用某些AlcoholicBeverage”指示的超类。

当我编写“使用一些啤酒”,“喝一些啤酒”或“喝一些啤酒”之类的DL查询时,应将其分类为NegativeChange,但不能。但是,仅当我编写“使用某些AlcoholicBeverage”时才进行分类,这与在AlcoholicBeverage超类部分中编写的定义完全相同。它不考虑类或对象的继承。我希望它将啤酒归类为含酒精饮料,或者将“消费”对象属性归为“使用”对象属性。

谢谢你的帮助。

最佳答案

根据您制定的查询,您似乎想要检索正在使用酒精的人。

对于当前的构造,由于using对象属性的域,首先将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");
}

10-06 07:10