Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МУ ПЗ

.pdf
Скачиваний:
17
Добавлен:
09.02.2015
Размер:
1.02 Mб
Скачать

</rdfs:comment>

<rdfs:label>

Онтология ЛКС

</rdfs:label>

</owl:Ontology>

<owl:Class rdf:ID="Gates"> <rdfs:label>Логические элементы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="TTLs">

<rdfs:label>Логические элементы ТТЛ</rdfs:label> </owl:Class>

<owl:Class rdf:ID="TTLCHs"> <rdfs:label>Логические элементы ТТЛШ</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="MOPs">

<rdfs:label>Логические элементы МОП</rdfs:label> </owl:Class>

<owl:Class rdf:ID="CMOPs">

<rdfs:label>Логические элементы КМОП</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="ELLs">

<rdfs:label>Логические элементы ЭСЛ</rdfs:label> </owl:Class>

<owl:Class rdf:ID="Levels"> <rdfs:label>Ярусы схемы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Links"> <rdfs:label>Связи в схеме</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Plugs"> <rdfs:label>Клеммы в схемме</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Wires"> <rdfs:label>Провода схемы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Scheme_Gates"> <rdfs:label>Схемные логические элементы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Basises">

41

<rdfs:label>Схемные логические элементы</rdfs:label> </owl:Class>

<owl:Class rdf:ID="Schemes"> <rdfs:label>Схемы</rdfs:label>

</owl:Class>

</rdf:RDF>

Таким образом, мы создали по представителю класса объектов owl:Class для каждой сущности, работать с которой хотим в нашей онтологии. Определение для каждой из них rdf:ID дает возможность легко обращаться к ним изнутри онтологии.

Создание подклассов OWL:

Теперь, можем начать создавать связи между классами:

...

<owl:Ontology rdf:about=""> <rdfs:comment>

Пример онтологии для предметной области логических комбинационных схем.

</rdfs:comment>

<rdfs:label>

Онтология ЛКС

</rdfs:label>

</owl:Ontology>

<owl:Class rdf:ID="Gates"> <rdfs:label>Логические элементы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="TTLs">

<rdfs:label>Логические элементы ТТЛ</rdfs:label>

<rdfs:subClassOf rdf:resource="#Gates" />

</owl:Class>

<owl:Class rdf:ID="TTLCHs"> <rdfs:label>Логические элементы ТТЛШ</rdfs:label>

<rdfs:subClassOf rdf:resource="#Gates" />

</owl:Class>

<owl:Class rdf:ID="MOPs">

<rdfs:label>Логические элементы МОП</rdfs:label>

<rdfs:subClassOf rdf:resource="#Gates" />

</owl:Class>

<owl:Class rdf:ID="CMOPs">

<rdfs:label>Логические элементы КМОП</rdfs:label>

<rdfs:subClassOf rdf:resource="#Gates" />

</owl:Class>

<owl:Class rdf:ID="ELLs">

<rdfs:label>Логические элементы ЭСЛ</rdfs:label>

<rdfs:subClassOf rdf:resource="#Gates" />

</owl:Class>

42

<owl:Class rdf:ID="Levels"> <rdfs:label>Ярусы схемы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Links"> <rdfs:label>Связи в схеме</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Plugs"> <rdfs:label>Клеммы в схемме</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Wires"> <rdfs:label>Провода схемы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Scheme_Gates"> <rdfs:label>Схемные логические элементы</rdfs:label>

</owl:Class>

<owl:Class rdf:ID="Basises">

<rdfs:label>Схемные логические элементы</rdfs:label> </owl:Class>

<owl:Class rdf:ID="Schemes"> <rdfs:label>Схемы</rdfs:label>

</owl:Class>

</rdf:RDF>

Таким образом, мы просто используем то же свойство rdfs:subClassOf для установления связей между создаваемыми классами.

Добавление свойств в OWL:

После создания классов необходимо наделить их свойствами. В OWL, в отличие от RDF и RDFs, есть лишь два типа свойств: DatatypeProperty и ObjectProperty. Свойство DatatypeProperty объявляет свойство, принимающее в качестве значения простой тип. А свойство ObjectProperty, с другой стороны, имеет объекты в качестве своего значения.

...

<owl:DatatypeProperty rdf:ID="name"> <rdfs:domain rdf:resource="#Gates" /> <rdfs:range rdf:resource="&xsd;string" />

</owl:DatatypeProperty>

<owl:DatatypeProperty rdf:ID="price"> <rdfs:domain rdf:resource="#Gates" /> <rdfs:range rdf:resource="&xsd;float" />

</owl:DatatypeProperty>

...

<owl:ObjectProperty rdf:ID="s_gates"> <rdfs:domain rdf:resource="#Schemes" /> <rdfs:range rdf:resource="#Gates" />

</owl:ObjectProperty>

43

<owl:ObjectProperty rdf:ID="s_plugs"> <rdfs:domain rdf:resource="#Schemes" /> <rdfs:range rdf:resource="#Plugs" />

</owl:ObjectProperty>

</rdf:RDF>

Мы создали два простых свойства, каждое из которых связано с одним из наших классов и описано как имеющее конкретный, определенный XML-схемой, тип. Мы также создали два свойства объекта.

Создание объектов:

Создание объектов класса не сложное. Нужно просто присвоить значения свойствам класса. С помощью rdf:ID указывается имя объекта:

...

<Wires rdf:ID = "wire_Instance">

<delay rdf:datatype = "http://www.w3.org/2001/XMLSchema#int">1</delay> <name rdf:datatype = "http://www.w3.org/2001/XMLSchema#string">W8</name> <number rdf:datatype = "http://www.w3.org/2001/XMLSchema#int">8</number> <length rdf:datatype = "http://www.w3.org/2001/XMLSchema#float">5.0</length>

</Wires>

...

Таким образом, мы создали объект класса Wires под названием wire_Instance.

Задание ограничений:

Ограничение по значению свойства. Одним из способов более полного определения конкретного значения является наложение ограничений на класс:

...

<owl:Class rdf:ID="SMD_Gates"> <rdfs:subClassOf>

<owl:Restriction>

<owl:onProperty rdf:resource="#kind" /> <owl:hasValue rdf:resource="#SMD" /> </owl:Restriction>

</rdfs:subClassOf>

</owl:Class>

...

Мы создали класс SMD_Gates (логические элементы в SMD корпусах), являющийся подклассом некоторого безымянного класса. Мы определяем этот класс как класс, имеющий ограничение по свойству kind (тип корпуса). Это ограничение говорит о том, что свойство kind должно иметь в качестве значения объект SMD (корпус SMD). Тем самым, мы говорим, что для того чтобы быть членом класса SMD_Gates, объект должен иметь свойство kind со значением #SMD. Обратите внимание, что при этом мы не утверждаем, что всякий объект, имеющий свойство kind со значением #SMD, автоматически принадлежит классу SMD_Gates. Т.е. согласно даннному определению, из наличия у объекта kind значения #SMD не следует его принадлежность классу SMD_Gates.

Задание минимального набора значений. Несколько менее строгим ограничением является указание набора значений, которые должен принимать объект. Например, мы можем указать, что у TTLs (логического элемента) должно быть, по меньшей мере, два выхода.

...

<owl:Class rdf:ID="TTLs"> <rdfs:subClassOf rdf:resource="# Gates" />

44

<rdfs:label>Элемент ТТЛ</rdfs:label>

<rdfs:subClassOf>

<owl:Restriction>

<owl:onProperty rdf:resource="#pins" />

<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger"> 2

</owl:minCardinality>

</owl:Restriction>

</rdfs:subClassOf>

</owl:Class>

...

Мы также можем использовать свойство maxCardinality (Максимальное количество элементов) для задания максимального количества значений, которые может принимать свойство.

Добавление способности к логическим рассуждениям:

Существуют вещи, исходя из которых, человек может сделать логическое заключение, а компьютер нет. Например, если один провод соединен со вторым, а второй с третим, то, следовательно, первый и третий связаны. Но ничто в онтологии пока еще не позволяет сделать такой вывод. Рассмотрим некоторые из способов, позволяющие OWL выполнять подобные логические суждения.

Транзитивность. Одним из простейших для изучения концептов является транзитивность (переходность). Другими словами, если один провод соединен со вторым, а второй с третим, то, следовательно, первый и третий связаны. Совершенно верно, но придется явным образом создать эту связь в онтологии:

...

<owl:Class rdf:ID="Links" />

<owl:TransitiveProperty rdf:ID="isConnectedTo"> <rdfs:domain rdf:resource="#Links" /> <rdfs:range rdf:resource="#Links" />

</owl:TransitiveProperty>

<Links rdf:ID="L1" /> <Links rdf:ID="L2">

<isConnectedTo rdf:resource="#L1" /> </Links>

<Links rdf:ID="L3">

< isConnectedTo rdf:resource="#L2" /> </Links>

...

Во-первых, мы создали класс Links (связи) и задали ему свойство isConnectedTo. Данное Свойство (Property) имеет тип TransitiveProperty (переходное). Таким образом, мы взяли цепочку рассуждений, очевидных для почти любого (здравомыслящего) человека, и превратили ее в кусочек программы, понятной компьютеру.

С OWL мы сможем проделать эту операцию и для остальных человеческих понятий. Симметричность. Другое понятие, очевидное для человека, но не обязательно

являющееся таковым для компьютера, это понятие симметричности (symmetric). Например, если один провод связан со вторым, то и второй связан с первым:

...

<owl:Class rdf:ID="Links" />

45

<owl: SymmetricProperty rdf:ID="isConnectedTo"> <rdfs:domain rdf:resource="#Links" /> <rdfs:range rdf:resource="#Links" />

</owl: SymmetricProperty>

<Links rdf:ID="L1" /> <Links rdf:ID="L2">

<isConnectedTo rdf:resource="#L1" /> </Links>

...

Другое свойство, которым легко оперируют люди и которое не столь просто для компьютера, это инверсия.

Инверсия. Инверсивные свойства – это свойства, имеющие парные им обратные свойства. Про такие свойства физики бы сказали: «каждому действию всегда соответствует равное ему противодействие». Например, если данный логический элемент является частью (isPartOf) схемы, то и схема имеет часть (hasPart) – этот элемент. Но для компьютера это вовсе не очевидно, и должно быть задано соответствующим образом посредством инверсивного свойства.

...

<owl:ObjectProperty rdf:ID="hasPart"> <rdfs:domain rdf:resource="#Schemes" /> <rdfs:range rdf:resource="#Gates" />

</owl:ObjectProperty>

<owl:ObjectProperty rdf:ID="isPartOf">

<owl:inverseOf rdf:resource="#hasPart" />

</owl:ObjectProperty>

...

Как обычно, мы создали свойство hasPartOf (имеет часть). Но, добавив ему, инверсивное свойство inverseOf, мы можем связать вместе свойства isPartOf (является частью) и hasPart. Обратите внимание на использование здесь встроенной логики. Достаточно указать отношение только для одного направления.

Инверсивные Функциональные Свойства (InverseFunctionalProperties). Одно из понятий, с которыми мы сталкиваемся постоянно, это понятие первичного ключа того или иного рода. Первичный ключ – это значение, уникальным образом идентифицирующее объект. Например, при нормальных обстоятельствах логический элемент, как правило, имеет только одно название. На языке OWL это делает название элемента функциональным свойством. Но OWL также дает еще чуть более мощное свойство – инверсивное функциональное свойство. Инверсивное функциональное свойство может использоваться для идентификации объектов. Например, если мы имеем два набора данных, маркированных одним названием, то можем сделать вывод о том, что они относятся к одному и тому же элементу.

Инверсивное функциональное свойство InverseFunctionalProperty действительно обеспечивает простой сбор данных. Возвращаясь к нашей онтологии, мы можем указать название логического элемента как инверсивное функциональное свойство

InverseFunctionalProperty:

...

<owl:InverseFunctionalProperty rdf:ID="name"> <rdfs:domain rdf:resource="#Gates" /> <rdfs:range rdf:resource="&xsd;string" />

</owl:InverseFunctionalProperty>

46

...

Пример(ы)

Предметная область: семья.

Онтология в формате OWL/RDF:

<?xml version="1.0"?> <rdf:RDF

xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns="http://www.owl-ontologies.com/family.owl#" xmlns:xsp="http://www.owl-ontologies.com/2005/08/07/xsp.owl#" xmlns:protege="http://protege.stanford.edu/plugins/owl/protege#"

xml:base="http://www.owl-ontologies.com/family.owl"> <owl:Ontology rdf:about="">

</owl:Ontology>

<owl:Class rdf:ID="Person" /> <owl:Class rdf:ID="Man">

<rdfs:subClassOf rdf:resource="#Person"/> </owl:Class>

<owl:Class rdf:ID="Woman">

<rdfs:subClassOf rdf:resource="#Person"/> </owl:Class>

<owl:FunctionalProperty rdf:ID="fullname">

<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/> <rdfs:domain rdf:resource="#Person"/>

<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> </owl:FunctionalProperty>

<owl:FunctionalProperty rdf:ID="sex"> <rdfs:range>

<owl:DataRange>

<owl:oneOf rdf:parseType="Resource"> <rdf:rest rdf:parseType="Resource">

<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >female</rdf:first>

<rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-

ns#nil"/>

</rdf:rest>

<rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >male</rdf:first>

</owl:oneOf>

</owl:DataRange>

</rdfs:range>

<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/> <rdfs:domain rdf:resource="#Person"/>

</owl:FunctionalProperty> <owl:FunctionalProperty rdf:ID="age">

<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#int"/> <rdfs:domain rdf:resource="#Person"/>

</owl:FunctionalProperty> <owl:FunctionalProperty rdf:ID="husband">

<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/> <rdfs:domain rdf:resource="#Man"/>

<rdfs:range rdf:resource="#Woman"/> </owl:FunctionalProperty> <owl:ObjectProperty rdf:ID="parent">

<rdfs:domain rdf:resource="#Person"/> <rdfs:range rdf:resource="#Person"/>

47

</owl:ObjectProperty> <owl:ObjectProperty rdf:ID="father">

<rdfs:domain rdf:resource="#Man"/> <rdfs:range rdf:resource="#Person"/>

</owl:ObjectProperty> <owl:ObjectProperty rdf:ID="brother">

<rdfs:domain rdf:resource="#Man"/> <rdfs:range rdf:resource="#Person"/>

</owl:ObjectProperty> <Woman rdf:ID="Mary">

<age rdf:datatype="http://www.w3.org/2001/XMLSchema#int">57</age> <parent>

<Man rdf:ID="Ben">

<sex rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >male</sex>

<husband>

<Woman rdf:ID="Lena">

<sex rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >female</sex>

<fullname rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >Lena</fullname>

<age rdf:datatype="http://www.w3.org/2001/XMLSchema#int" >29</age>

</Woman>

</husband>

<parent>

<Woman rdf:ID="Jane">

<age rdf:datatype="http://www.w3.org/2001/XMLSchema#int" >6</age>

<fullname rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >Jane</fullname>

<sex rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >female</sex>

</Woman>

</parent>

<parent>

<Man rdf:ID="Tom">

<sex rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >male</sex>

<fullname rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >Tom</fullname>

<age rdf:datatype="http://www.w3.org/2001/XMLSchema#int" >7</age>

</Man>

</parent>

<age rdf:datatype="http://www.w3.org/2001/XMLSchema#int" >31</age>

<fullname rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >Ben</fullname>

</Man>

</parent>

<sex rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >female</sex>

<fullname rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >Mary</fullname>

</Woman>

</rdf:RDF>

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

48

7. Составление SPARQL-запросов для извлечения явных знаний из онтологии

Цель работы: Получение практических навыков составления запросов для извлечения явных знаний из онтологии на языке SPARQL.

Исходные положения

Основные шаблоны (basic patterns) Простейший SPARQL-запрос:

SELECT ?x

WHERE { ?x <http://www.eltech.ru/semweb/tutorial.owl#имя> "Василий"}

Результатом выполнения этого запроса является список URI всех объектов, для которых свойство «имя» равно «Василий».

При выполнении запроса производится поиск частей RDF-графа, удовлетворяющих заданному в секции WHERE шаблону. Шаблон задается в виде набора RDF-троек субъект – предикат - объект.

В приведенном примере в качестве шаблона использована одна RDF-тройка, где для предиката и объекта указаны конкретные значения (предикат - это URI

<http://www.eltech.ru/semweb/tutorial.owl#имя>, а объект - литерал "Василий"), а в

качестве субъекта использована переменная ?x. URI записываются в угловых скобках (<>), литералы - в кавычках (""), а перед именем переменных ставится вопросительный знак (?).

После ключевого слова SELECT записывается список искомых переменных.

Запрос списка фамилий тех людей, которые имеют имя «Василий»:

SELECT ?surname WHERE {

?x <http://www.eltech.ru/semweb/tutorial.owl#имя> "Василий". ?x <http://www.eltech.ru/semweb/tutorial.owl#фамилия> ?surname.

}

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

На уровне RDF отношение между классами и их экземплярами, а также между классами и подклассами записывается в виде троек.

Отношение между экземпляром и классом: rdf:type Отношение между подклассом и классом: rdfs:subClassOf.

Таким образом, если нужно найти фамилии студентов с именем «Василий», используется следующий запрос:

SELECT ?surname WHERE {

?x rdf:type <http://www.eltech.ru/semweb/tutorial.owl#Студент>. ?x <http://www.eltech.ru/semweb/tutorial.owl#имя> "Василий".

?x <http://www.eltech.ru/semweb/tutorial.owl#фамилия> ?surname.

}

Так как отношение rdf:type используется очень часто, в SPARQL введена упрощенная форма его записи: вместо rdf:type записывается просто a. Тогда предыдущий пример будет выглядеть следующим образом:

SELECT ?surname

49

WHERE {

?x a <http://www.eltech.ru/semweb/tutorial.owl#Студент>.

?x <http://www.eltech.ru/semweb/tutorial.owl#имя> "Василий". ?x <http://www.eltech.ru/semweb/tutorial.owl#фамилия> ?surname.

}

Пространства имен

Существует сокращенный способ записи URI в запросе с помощью ключевого слова PREFIX. Вот как будет выглядеть в данном случае предыдущий запрос:

PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?surname

WHERE {

?x a tutorial:Студент.

?x tutorial:имя "Василий".

?x tutorial:фамилия ?surname.

}

Фильтры

Использование шаблонов в виде набора RDF-троек является основой механизма поиска информации в RDF-графе. Для более точного (строгого) описания требований к результатам запроса используются дополнительные фильтры.

Например, для поиска фамилий студентов с именем «Петр» и возрастом старше 20 лет можно использовать такой запрос:

PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?surname

WHERE {

?x a tutorial:Студент. ?x tutorial:имя "Петр".

?x tutorial:фамилия ?surname. ?x tutorial:возраст ?age. FILTER (?age > 20)

}

Как видно, фильтры определяются в специальной секции, начинающейся с ключевого слова FILTER. Существует несколько типов фильтров, наиболее часто употребляемыми из которых являются операции сравнения: = (равно), != (не равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно) а также вычисление регулярных выражений для строк: regex(?x, "pattern" [, "flags"]).

С помощью логических операций && (И), || (ИЛИ) можно строить сложные фильтры. Например, запрос на поиск фамилий студентов с именем «Петр», старше 20 лет и с фамилией, оканчивающейся на «ов»:

PREFIX tutorial: <http://www.eltech.ru/semweb/tutorial.owl#> SELECT ?surname

WHERE {

?x a tutorial:Студент. ?x tutorial:имя "Петр".

?x tutorial:фамилия ?surname. ?x tutorial:возраст ?age.

FILTER ((?age > 20) && (regex(?surname, “ов$”)))

}

Необязательная информация (optionals)

50