【问题标题】:How to create an ontology in Java?如何在 Java 中创建本体?
【发布时间】:2011-04-30 10:24:56
【问题描述】:

我想用某种基本的 OWL 本体编写一些数据三元组。我有像这样的三胞胎:

Delhi is part of India 

India is an Asian country

请注意,我有“is-a”、“part-of”或“related-to”等关系。构建本体的最简单方法是什么?任何工作示例或对示例网站的引用都会有很大帮助!

【问题讨论】:

  • 您遇到问题的部分是信息提取还是 Jena API?
  • 我需要一个简单的例子来创建一个基于上述语句或三元组的OWL文件。我是初学者,对本体或耶拿了解不多。一个创建猫头鹰模型的简单例子对我有帮助!

标签: java jena ontology


【解决方案1】:

您的问题混杂了很多不同的东西,我强烈建议您花点时间(远离键盘!)思考一下您要在这里实现的目标。

首先,地理本体会变得相当复杂,并且在这一领域已经做了很多工作。显而易见的起点可能是GeoNames ontology,它为地理特征命名,包括德里等城市和印度等国家。至少您应该为应用程序中的位置重新使用这些名称,因为这将最大限度地提高您的数据与其他可用链接数据源成功连接的机会。

但是,您可能不希望应用程序中包含整个 GeoNames(我猜),因此您还需要清楚为什么您需要一个本体。解决这个问题的一个好方法是从应用程序的外部:与其担心使用哪种 Jena 模型,不如先考虑使用本体完成句子 “的方法,我的应用程序的用户将能够……”。这应该会引导您为您的本体建立一些能力问题(例如,参见section 3 of this guide)。一旦你知道你想要表示什么样的信息,以及你需要对其应用什么样的查询,你的技术选择就会更加清晰。我意识到这些应用程序通常是迭代开发的,你会想尽早尝试一些代码,但我仍然主张在开始编码之旅之前更清楚地记住你的目标。

您暗示您想使用 Jena 来驱动一个网站。这里有很多选择。不要被术语 语义网 误导 - 这实际上意味着将类似网络的特性带入内联数据集,而不是将语义放入人类可读的网页本身。虽然您可以这样做,而且很多人都这样做,但您的架构中需要一些额外的层。我们通常使用以下两种方法之一:在 servlets 容器中使用带有模板引擎的 Jena,例如 Velocity,或者使用 Ruby Web 框架并通过 JRuby 驱动 Jena。还有许多其他方法可以解决这个特殊问题:Jena 不直接解决网络发布问题,但它可以在任何基于 Java 的网络框架中使用。

最后,关于命名空间,您应该尽可能地重用现有的词汇表,从而重用命名空间。不要为已经在某处数据网络上具有表示的事物编造新名称。使用 GeoNames 或 DbPedia 或任何其他适合的已发布词汇表。如果它们不适合,那么您应该创建一个新名称,而不是以不兼容的方式使用现有名称。在这种情况下,您应该使用应用程序的 Web 域(例如您的公司或大学)作为命名空间的基础。理想情况下,您应该在命名空间的基本 URL 上发布您的本体,但这有时可能很难根据本地网络政策进行安排。

【讨论】:

    【解决方案2】:

    我建议来自曼彻斯特大学的OWL API。通过这种方式,您可以开始在 Java 中“即时”创建您的本体,如果需要,您可以通过单个方法调用将其序列化为您喜欢的格式(RDF、曼彻斯特语法等),或者直接处理 in-内存表示。通过这种方式,您可以在程序的上下文中快速制作原型并试验您的本体。

    关于库及其主要组件的概述,我建议使用库创建者提供的教程 (code tutorial),它涵盖了 90% 的基本需求。

    PS:Protégé 是基于 OWL Api 的,你也可以按照建议尝试一下,但特别是一开始我更喜欢快速玩本体,并在头脑足够清晰的情况下切换到 Protege 之类的工程环境。此外,对于外部本体,您需要学习如何导航它,恕我直言,一开始它真的不值得。

    【讨论】:

    • 我没有注意到已经有一个被接受的答案,我希望我的答案对其他人有用:)
    【解决方案3】:

    看看斯坦福的Protege。这是一个本体编辑器。

    【讨论】:

      【解决方案4】:

      您只需声明一个由主语、宾语和谓词组成的三元组类。 "has-a" 是一个谓词,所以你的本体元素看起来像:

      "Dehli", "is-in", "India"
      "India", "is-in", "Asia"
      "India", "is-a", "country"
      

      当然,这并不能解决查询问题,但如果有一个不错的数据存储(即使是数据库也可以),您可以开始构建一个具有不错查询机制的灵活本体。

      当然,JENA 的能力远远超过它所创造的能力;它确实提供了语义查询的东西,以及更好的资源定义和解析。但是,它比简单的三元组结构要复杂得多。这一切都取决于你需要什么。

      【讨论】:

      • 我只是想基于它创建一个本体文件,我正在尝试使用 ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM) 但我在定义自己的语句等方面遇到了问题。我也没有不知道使用什么命名空间?有什么例子吗?
      • 我无法为我的问题编写精确的代码。我只想以猫头鹰本体的形式显示我的数据。存在三种类型的关系,is-a、has 和related-to。我有三元组,比如“印度”、“is-a”、“国家”和“相机”、“相关”、“摄影”
      • 只需要根据这些信息创建OWL文件,再加上如果一个三重是多次,我还需要添加它的频率作为属性!
      【解决方案5】:
      /**  
        - This is maven dependencies for owl-api
          <dependency>
              <groupId>net.sourceforge.owlapi</groupId>
              <artifactId>owlapi-api</artifactId>
          </dependency>
          <dependency>
              <groupId>net.sourceforge.owlapi</groupId>
              <artifactId>owlapi-apibinding</artifactId>
          </dependency>
      
          * First of all you need to initialize ontology:
      
       **/   
                          private OWLDataFactory factory;
      
                          private PrefixManager pm;
      
                          private OWLOntology ontology;
      
                          private String pmString = "#";
      
                          private OWLOntologyManager manager;
      
                          private OWLReasoner reasoner;
      
                          private ShortFormEntityChecker entityChecker;
      
                          private BidirectionalShortFormProviderAdapter bidirectionalShortFormProviderAdapter;
      
                   private void initializeOntology(String fileContent)
                                  throws OWLOntologyCreationException {
                              InputStream bstream = new ByteArrayInputStream(fileContent.getBytes());
                              this.manager = OWLManager.createOWLOntologyManager();
                              this.ontology = this.manager.loadOntologyFromOntologyDocument(bstream);
                              IRI ontologyIRI = this.ontology.getOntologyID().getOntologyIRI();
                              this.pm = new DefaultPrefixManager(ontologyIRI.toString()
                                      + this.pmString);
                              this.factory = this.manager.getOWLDataFactory();
      
                              ReasonerFactory factory = new ReasonerFactory();
                              this.reasoner = factory.createReasoner(this.ontology);
      
                              Set<OWLOntology> onts = new HashSet<>();
                              onts.add(this.ontology);
      
                              DefaultPrefixManager defaultPrefixManager = new DefaultPrefixManager(
                                      this.pm);
                              ShortFormProvider shortFormProvider = new ManchesterOWLSyntaxPrefixNameShortFormProvider(
                                      defaultPrefixManager);
                              this.bidirectionalShortFormProviderAdapter = new BidirectionalShortFormProviderAdapter(
                                      this.manager, onts, shortFormProvider);
                              this.entityChecker = new ShortFormEntityChecker(
                                      this.bidirectionalShortFormProviderAdapter);
      
                          }
      
      /*
          After that you need to define your classes and the relations of the classes. These relations calls as object properties in ontology. Instance of each ontology class calls as individual and the attributies of the classes (for person name, age , adress) calls as data-property.
      */
      //    To create a new individual of an ontology class : 
      
      
      
               public OWLClass getClass(String className) {
                       return this.factory.getOWLClass(":" + className, this.pm);
                  }
      
      
      
      
                  public OWLNamedIndividual createInvidual(String cls, String invname) {
                                              OWLNamedIndividual res = this.factory.getOWLNamedIndividual(":"
                                                      + invname, this.pm);
                                              this.manager.addAxiom(this.ontology,
                                                      this.factory.getOWLDeclarationAxiom(res));
                                              OWLClassAssertionAxiom axiom = this.factory.getOWLClassAssertionAxiom(
                                                      getClass(cls), res);
                                              this.manager.addAxiom(this.ontology, axiom);
                                              return res;
                  }
      
       //   To create an object property :
      
       //   This method will create an object property named prop if it is not exist.
      
      
      
               public OWLObjectProperty getObjectProperty(String prop) {
                          return this.factory.getOWLObjectProperty(":" + prop, this.pm);
                      }
      
                  public void addObjectProperty(String propname, OWLNamedIndividual prop,
                              OWLNamedIndividual obj) {
                          OWLObjectPropertyAssertionAxiom axiom = this.factory
                                  .getOWLObjectPropertyAssertionAxiom(
                                          getObjectProperty(propname), obj, prop);
                          this.manager.addAxiom(this.ontology, axiom);
                      }
      
        //  And finally , to add a data-property to individuals :
      
              public OWLDataProperty getDataProperty(String prop) {
                              return this.factory.getOWLDataProperty(":" + prop, this.pm);
                          }
      
              public void addDataProperty(String propname, boolean propvalue,
                              OWLNamedIndividual inv) {
                          OWLAxiom axiom = this.factory.getOWLDataPropertyAssertionAxiom(
                                  getDataProperty(propname), inv, propvalue);
                          this.manager.addAxiom(this.ontology, axiom);
              }
      

      【讨论】:

        猜你喜欢
        • 2011-03-25
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2012-03-08
        相关资源
        最近更新 更多