0

我在 protege 中创建了一个本体。

我有一个名为AlcoholicBeverage 的类,在这个类下有子类Beer、Wine。这些子类是不相交的。

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

我有一个对象属性“使用”,其中包含两个子属性“饮用”和“消费”。“使用”属性的域是 Person 类,范围是 AlcoholicBeverage 类。

NegativeChange 类具有用“使用一些酒精饮料”的声明指示的超类。

当我编写诸如“使用一些啤酒”或“喝一些啤酒”或“喝一些啤酒”之类的 DL 查询时,它应该将其归类为 NegativeChange,但事实并非如此。但是,它只在我写“使用一些酒精饮料”时进行分类,这与酒精饮料超类部分中的定义完全相同。它不考虑类或对象继承。我希望它应该将 Beer 归类为酒精饮料或将“消费”对象属性归类为“使用”对象属性。

谢谢你的帮助。

4

1 回答 1

1

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

使用您当前的构造,由于using对象属性的域,Behavior 类首先被“错误地”归类为 Person。此外,您应该使用一些 AlcoholicBeverage将匿名表达式声明为等效于 NegativeChange 类,而不是像现在这样的超类。使用一些啤酒喝一些葡萄酒的查询将被正确分类在 NegativeChange 下。

检索酒精消费者的语义正确解决方案是创建一个名为 AlcoholConsumer 的类,它是 Person 的子类。酒精消费者的等效定义是使用一些酒精饮料。使用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");
}
于 2012-11-06T14:03:05.060 回答