Тема: Получение OWL из внутреннего представления

Помогите определиться с выбором инструментов.
Задача: есть семантическая сеть на 50+ тысяч терминов, надо перегнать ее из "сделанного на коленке" представления в OWL(это начальная задача).

То, чем я хочу пользоваться сейчас:
Основное: Java Play Framework(для веб интерфейса и работы с БД), Jena
Ну, и IDE: NetBeans(или Eclipse - пока не решил)
Писать буду под Windows.

Подскажите, такого джентльменского набора хватит, или что-то еще посоветуете.

Thumbs up Thumbs down

2

Re: Получение OWL из внутреннего представления

Но главное то и не указано, где будут храниться триплеты?
От этого будет зависеть все остальное..

3

Re: Получение OWL из внутреннего представления

А можете посоветовать, потому что по данной теме ничего толкового скорее всего предложить не смогу.

Пока накопал только вот это: http://sp.cmc.msu.ru/datalog/levshin-swps.pdf

Отредактировано nizsheanez (2011-03-17 19:48:46)

Thumbs up Thumbs down

4

Re: Получение OWL из внутреннего представления

например в триплесторе virtuoso или в mysql/postgress можно организовать хранение

5

Re: Получение OWL из внутреннего представления

Фух. Разобрался немного в Jena. Получилось перевести из внутреннего представления в RDF (OWL сделаю чуть позже). Возник вопрос: какое пространство имен использовать для описания тезауруса(термин, определение, категория к которой принадлежит термин, синонимы на русском, перевод термина на английский, с какими терминами связан)?  Просто не думаю, что использования своего пространства для такой задачи, вроде бы стандартной, есть хороший тон.  Получаются строчки вида: <j.0:ontologyAssociateWith rdf:resource=

Thumbs up Thumbs down

6

Re: Получение OWL из внутреннего представления

Покажите фрагмент тезауруса, пока непонятно в чем проблема в собственном пространстве имен. Для чего-то можно использовать стандартные элементы, например, rdfs:label, rdfs:comment и т.д. Есть еще стандартные словари, вроде Dublin Core или Open Source Metadata Framework.

7

Re: Получение OWL из внутреннего представления

Конечно, пожалуйста:

:П:
:Ч: Карстовая коррозия
:T: Контактная коррозия
    Подпочвенная коррозия
:E: Subsoil corrosion
:П:
:Ч: Карстовая коррозия
:T: Криптокарстовая коррозия
:E: Crypto-corrosion

Обозначения:
1. Каждая вершина сети есть последовательная группа строк, обязательно начинающихся меткой :П: Все остальные метки, вообще говоря, являются необязательными.
Строка с меткой :П: является началом описания очередной вершины.
В некоторых случаях (примеры 1 и 4) строка с меткой :П: содержит уникальное наименование понятия (родовое понятие). При этом соответствующая вершина сети является понятийной (образующей) вершиной.
2. В строке с меткой :T: размещается термин на русском языке. Синоним помещается в следующей строке (строке без метки).
3. В строке с меткой :E: размещается термин на английском языке. Синоним помещается в следующей строке (строке без метки).
4. Строка с меткой :Ч: задает родо-видовую связь (связь "это-есть") между вершинами. Связь задается уникальным именем понятия, к которому относится данная вершина.
5. Строка с меткой :О: задает ассоциативную связь (связь "относится-к") между вершинами. Связь задается уникальным именем понятия, к которому относится данная вершина.


Вот как-то так, а про Open Source Metadata Framework, если честно я раньше не слышал, пойду погуглю, может это и есть то, что я искал.

Отредактировано nizsheanez (2011-04-01 20:38:18)

Thumbs up +1 Thumbs down

8

Re: Получение OWL из внутреннего представления

Посоветуйте, что почитать, что бы разобраться с Jena. Уже 8-й час сижу читаю оффициальный сайт, но так с места и не сдвинулся. С RDF(ModelFactory.createDefaultModel()) еще вроде бы разобрался, а вот когда Owl-модель создаю(ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM)) все становится совсем плохо, вообще не понимаю по каким правилам он создает онтологию. Как добавить симметрические свойства тоже не нашел. В общем либо я каких-то основ не понимаю, либо... это магия :-).

Thumbs up −1 Thumbs down

9

Re: Получение OWL из внутреннего представления

о! нашел большую заначку по jena:
http://www.semantictools.ru/component/s … phrase=all

Thumbs up Thumbs down

10

Re: Получение OWL из внутреннего представления

все равно легче не стало. с owl в Jena так и не могу разобраться.

Thumbs up Thumbs down

11

Re: Получение OWL из внутреннего представления

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

Thumbs up Thumbs down

12

Re: Получение OWL из внутреннего представления

Лучше отдельно разбираться с языком, инструментальными средствами и мэппингом.

Сначала вручную описать в Protege несколько сущностей из вашей семантической сети. Убедиться, что информация отображена именно так, как хотелось. Затем, на базе этого опыта, составить общий документ по мэппингу (из чего берётся rdfs:label, как генерируются уникальные идентификаторы, как строится иерархия rdfs:subClassOf, etc).

После этого можно, например, нарезать полученную в Protege заготовку как шаблон для генерации OWL XML. И скриптом на Python (Perl, Ruby, whatever) получить MyOntology.owl, пригодную для залития в любой триплстор.

А далее выбирать используемые продукты/фреймворки уже в зависимости от требований к использованию данной отнологии (проверки, выводы, диаграммки порисовать, etc).

13

Re: Получение OWL из внутреннего представления

в интернете множество статей по переходу от тезауруса к онтологиям. Поэтому имеет смысл просто смотреть на тезаурус как промежуточное звено на пути к онтологии.

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

Jena уже достаточно зрелый продукт, проблем не должно быть.

14

Re: Получение OWL из внутреннего представления

Да, нет, особо проблем нет при компиляции или выполнении. Я просто пока не могу философию Jena понять, а точнее наверное философию OWL. Хотя в последнее время вроде бы получаться начало кое-что.

Вопросы как из ветки Jade появятся еще, когда буду более сложный функционал делать.

Но поиск нормальной информации по Jena с примерами кода, для меня почему-то действительно составляет проблему, одной документации катострафически не хватает.

Thumbs up Thumbs down

15

Re: Получение OWL из внутреннего представления

nizsheanez пишет:

пока не могу философию Jena понять

(Очень вкратце и очень неполно...)

Во-первых, Jena парсит входные данные, цепочка:
Model(URI)->ModelReader.

Во-вторых, по наборам правил, хранящихся в каталогах com\hp\hpl\jena\reasoner\rulesys, выполняет логический вывод. Выберем OWLMicro - получим какой-то минимальный набор действий, связанных с подклассами, и.т.д.
SymmetricPropertyImpl из пакета com.hp.hpl.jena.ontology.impl поборет симметричные свойства из OWL.

В-третьих, Jena предоставляет интерфейс для графа, созданного из ModelReader, цепочка:
ModelReader->InfGraph, com.hp.hpl.jena.reasoner.InfGraph.
Можно проимплементить этот граф по-своему, либо, смотря по задаче (насколько стандартна), использовать готовую имплементацию (Пеллет)

Thumbs up +1 Thumbs down

16

Re: Получение OWL из внутреннего представления

А почему все вещи называются вещами: Resource - com.hp.hpl.jena.rdf.model.Resource, OntClass - com.hp.hpl.jena.ontology.OntClass, Property - com.hp.hpl.jena.rdf.model.Property.

А симметричное свойство это имплиминтэйшн?

Отредактировано nizsheanez (2011-04-23 14:27:33)

Thumbs up Thumbs down

17

Re: Получение OWL из внутреннего представления

Фух :-) спасибо всем. Теперь вопросы будут более  конкретными.

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

Я создал класс для родового понятия. И теперь добавляю термины:

OntClass c = mdl.createClass(param("NS") + className);
        
        //create base individual
        Individual baseIndividual = mdl.createIndividual(param("NS") + terms.elementAt(0), c); 
        for(int i = 1; i < terms.size(); i++) {
            
            baseIndividual.isSameAs(mdl.createResource(param("NS") + terms.elementAt(i), c));
        }
        /*
        Resource baseRes = mdl.createResource(param("NS") + terms.elementAt(0)); 
        Property as = mdl.createProperty(param("NS")+"associateWidth");
        for(int i = 1; i < terms.size(); i++) {
            Resource tmp = mdl.createResource(param("NS") + terms.elementAt(i));
            tmp.addProperty(as, baseRes);
        }
        */

В комментах написано, как я еще пробовал. Не один из вариантов не рабочий. Чем должны являться термины: индивидами, ресурсами, еще чем-то. Чем должно являться свойство "является синонимом": симметричным свойством или как я написал нужно использовать isSameAs

Thumbs up Thumbs down

18

Re: Получение OWL из внутреннего представления

синонимы в OWL http://forum.semanticfuture.net/viewtopic.php?id=94

19

Re: Получение OWL из внутреннего представления

Вообще все победил, все заработало, спасибо огромное всем! Осталось косметический ремонт провести. Смотрите, есть код вида:

SymmetricProperty prop = mdl.createSymmetricProperty(param("NS")+"associate");
OntResource baseResource = mdl.createOntResource(param("NS") + terms.elementAt(0));
            //same as
            for (int i = 1; i < terms.size(); i++) {
                OntResource r = mdl.createOntResource(param("NS") + (String)terms.elementAt(i));
                baseResource.addSameAs(r);
            }
            
            //symmetric property "associate"
            for (int i = 0; i < associates.size(); i++) {
                OntResource r = mdl.createOntResource(param("NS") + (String)associates.elementAt(i));
                baseResource.addProperty(prop, r);
            }
            
            //is defined by
            for (int i = 0; i < descriptions.size(); i++) {
                OntResource r = mdl.createOntResource(param("NS") + (String)descriptions.elementAt(i));
                baseResource.addIsDefinedBy(r);
            }

Этот код прогоняется столько раз, сколько узлов в моей семантической сети.
Он генерит онтологию вида:

<rdf:Description rdf:about="#Стоковая площадка">
    <rdfs:isDefinedBy rdf:resource="#Гидрологические наблюдательные установки"/>
    <j.0:associate>
      <rdf:Description rdf:about="#Поверхностный сток">
        <rdfs:isDefinedBy>
          <rdf:Description rdf:ID="Сток">
            <rdfs:isDefinedBy rdf:resource="#Водотоки"/>
            <j.0:associate>
              <rdf:Description rdf:about="#Кругооборот воды в природе">
                <rdfs:isDefinedBy rdf:resource="#Круговорот веществ"/>
                <j.0:associate rdf:resource="#Гидросфера"/>
                <owl:sameAs rdf:resource="#Hydrological cycle"/>
                <owl:sameAs rdf:resource="#Water cycle"/>
                <owl:sameAs rdf:resource="#Влагооборот"/>
                <owl:sameAs rdf:resource="#Гидрологический цикл"/>
                <owl:sameAs rdf:resource="#Круговорот воды в природе"/>
              </rdf:Description>
            </j.0:associate>
            <j.0:associate rdf:resource="#Сток"/>
            <owl:sameAs rdf:resource="#Discharge"/>
            <owl:sameAs rdf:resource="#Drain"/>
            <owl:sameAs rdf:resource="#Flowoff"/>
            <owl:sameAs rdf:resource="#Flow"/>
            <owl:sameAs rdf:resource="#Runoff"/>
          </rdf:Description>
        </rdfs:isDefinedBy>
        <owl:sameAs rdf:resource="#Surface runoff"/>
      </rdf:Description>
    </j.0:associate>
  </rdf:Description>

И таких узлов много. Как мне избежать такой вложенности и вообще почему она возникает?
При дальнейшем увеличении вложенности выдает ошибку:

StringIndexOutOfBoundsException occured : String index out of range: 49 

RDFWriter wr = m.getWriter("RDF/XML-ABBREV");
Writer out = new StringWriter();
[b]wr.write(m, out, "http://www.glossary.ru/owl/ontology#");[/b]

Отредактировано nizsheanez (2011-05-16 13:21:13)

Thumbs up Thumbs down

20

Re: Получение OWL из внутреннего представления

Я думал, что ошибка вылетает из-за большой вложенности, оказалось, что это не так. Избавился от вложенности так: объявил сначала все ресурсы, а только после этого начал вешать на них свойства и отношения. Вложенность теперь не превышает 3.
Однако на длине выходного файла более 305.000 строк(с копейками - это 14МБ) опять появляется эта ошибка.
Подскажите, что она значит.

Отредактировано nizsheanez (2011-05-17 07:02:03)

Thumbs up Thumbs down