Как создать онтологию в Java? - PullRequest
9 голосов
/ 30 апреля 2011

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

Delhi is part of India 

или

India is an Asian country

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

Ответы [ 5 ]

9 голосов
/ 30 апреля 2011

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

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

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

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

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

3 голосов
/ 29 декабря 2012

Я предлагаю OWL API от Манчестерского университета.Таким образом, вы можете начать создавать свою онтологию «на лету» в Java, и с помощью одного вызова метода вы можете сериализовать ее в предпочитаемом формате (RDF, синтаксис Манчестера и т. Д.), Если вам нужно, или напрямую работать спредставление памяти.Таким образом, вы можете быстро создать прототип и экспериментировать со своей онтологией в контексте вашей программы.

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

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

1 голос
/ 27 января 2014
/**  
  - 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);
        }
1 голос
/ 30 апреля 2011

Взгляните на Стэнфорда Протеже .Это редактор онтологий.

0 голосов
/ 30 апреля 2011

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

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

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

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

...