Как создать онтологию на Java?

у меня есть триплеты данных, которые я хочу написать в какой-то базовой онтологии OWL. У меня тройняшки такие:

Delhi is part of India 

или

India is an Asian country

обратите внимание, что у меня есть отношения, такие как "is-a", "part-of" или "related-to". Каков самый простой способ построения онтологии? Любой рабочий пример или ссылка на пример веб-сайта будет большой помощью!

5 ответов


в вашем вопросе много разных вещей, я настоятельно рекомендую вам занять немного времени (вдали от клавиатуры!) обдумать то, чего вы пытаетесь достичь здесь.

во-первых, географические онтологии могут стать довольно сложными, и в этой области уже проделана большая работа. Вероятно, очевидной отправной точкой является онтология GeoNames, который дает названия географическим объектам, включая такие города, как Дехли и такие страны, как Индия. На по крайней мере, вы должны повторно использовать эти имена для мест в вашем приложении, так как это максимизирует шансы на то, что ваши данные могут быть успешно объединены с другими доступными источниками связанных данных.

однако вы, вероятно, не хотите, чтобы все GeoNames в вашем приложении (я предполагаю), поэтому вам также нужно быть ясным почему вам вообще нужна онтология. Хороший способ подойти к этому-извне вашего приложения: вместо того, чтобы беспокоиться о том, какая Йена модель для использования, начните с обдумывания способов завершения предложения " используя онтологию, пользователь моего приложения сможет ...". Это должно привести вас к установлению некоторых вопросы компетенции (см., например, раздел 3 этого руководства) для вашей онтологии. Как только вы узнаете, какую информацию вы хотите представить и какие запросы вам нужно применить к ней, ваш выбор технологии станет намного яснее. Я понимаю, что эти приложения обычно разрабатываются итеративно, и вы захотите попробовать какой-то код довольно рано, но я по-прежнему выступаю за более четкое представление о месте назначения, прежде чем вы начнете свое путешествие по кодированию.

вы подразумеваете, что хотите использовать Jena для управления веб-сайтом. Здесь много вариантов. Не вводите в заблуждение термином семантический web - это фактически означает приведение веб-подобных качеств к взаимосвязанным наборам данных, а не ввод семантики в человека читаемые веб-страницы как таковые. Хотя вы можете это сделать, и многие люди это делают, вам понадобятся дополнительные слои в вашей архитектуре. Обычно мы используем один из двух подходов: использование Jena с шаблоном, таким как скорость, в контейнере сервлетов или с помощью веб-фреймворка Ruby и вождения Jena через JRuby. Есть много других способов решить эту конкретную проблему: Jena не обращается непосредственно к веб-публикации, но ее можно использовать в любом Java-веб рамки.

наконец, что касается пространств имен, вы должны действительно повторно использовать существующие словари и, следовательно, пространства имен, где это возможно. Не придумывайте новых имен для вещей, которые уже имеют представления в сети данных где-то. Используйте GeoNames или DB-педия, или любой из многих других опубликованных словарей, где они подходят. Если они не подходят, вы должны создать новое имя, а не использовать существующее имя несовместимым образом. В этом случае, вы должны использовать веб-домена приложения (например, вашей компании или университета) в качестве основы для пространства имен. В идеале следует опубликовать онтологию в базовом URL-адресе пространства имен, но иногда это может быть трудно организовать в зависимости от локальных веб-политик.


предлагаю API-ИНТЕРФЕЙС СОВА из Манчестерского университета. Таким образом, вы можете начать создавать свою онтологию "на лету" на Java, и с помощью одного вызова метода вы можете сериализовать ее в предпочтительном формате (RDF, синтаксис Манчестера и т. д.), Если вам нужно, или непосредственно работать над представлением в памяти. Таким образом, вы можете быстро прототипировать и экспериментировать свою онтологию в контексте вашей программы.

для обзора библиотеки и ее основных компонентов I предложите учебник (учебник код) предоставленный создателем библиотеки, он покрывает 90% основных потребностей.

PS: Protégé основан на OWL Api, вы также можете попробовать его, как было предложено, но в начале я предпочел быстро играть с онтологиями и переключиться на некоторую инженерную среду, такую как Protege, когда мой ум был достаточно ясным. Кроме того, с внешней онтологией вам нужно будет научиться ориентироваться в ней, что ИМХО действительно не стоит в самого начала.


посмотрите на Стэнфорда протеже. Это редактор онтологии.


вы просто объявите класс триплета, состоящий из субъекта, объекта и предиката. "has-a" является предикатом, поэтому ваши элементы онтологии будут выглядеть так:

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

это, конечно, не адресует запросы, но, учитывая приличное хранилище данных (даже база данных), вы можете начать строить гибкую онтологию с приличным механизмом запроса.

JENA намного, намного более способна, чем то, что это создаст, конечно; он также предоставляет материал семантического запроса as далеко лучшее определение и разрешение ресурсов. Однако это намного сложнее, чем простая структура триплета; все зависит от того, что вам нужно.


/**  
  - 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);
        }