| Natalya Keberle | |
| Наталья Геннадьевна Кеберле | |
| Род деятельности: |
исследователь, преподаватель |
|---|---|
| Роль участника: | |
| Основной раздел: | |
| Круг интересов: |
Semantic Web, онтологии, логики, OWL, время |
| Место рождения: | |
| Гражданство: | |
| Сайт: | |
| Nickname | |
| Уровень публикуемого материала | |
| Рекомендуемый уровень знаний читателя в предметной области : | |
|---|---|
| Список конкретных знаний: |
OWL |
| Обсуждение: | |
Содержание |
Многим из нас приходила в голову мысль сесть и нарисовать своё генеалогическое дерево, в котором аккуратно записать всех родственников "до десятого колена", чтобы потом на досуге показывать своим правнукам историю семьи.
"Специальные" названия разнообразных семейных связей, такие как "кузина", "троюродный брат" или "внучатые племянники" всегда приводили меня в затруднение, и заставляли мысленно "вычислять" соответствующую цепочку.
В этом затруднении мне могут помочь онтологии, а вот как - об этом и будет рассказано ниже.
Наши семьи подчас обладают уникальными историями, не похожими ни на какие другие. Виды родственных связей в семье, напротив, достаточно стандартны, и смысл каждой такой связи, будь-то «тётя» или «внук», не вызывает споров у людей с разных континентов. Такие знания называют ещё «то, что знают все» или «здравый смысл» (common-sense knowledge). Чтобы их использовать, придется определить эти связи строго.
Прежде всего, будем рассматривать генеалогическое дерево как граф, вершинами которого являются люди – члены семьи, а именованные дуги – связи между членами семьи. Имена дуг будут соответствовать конкретной связи, например, «быть матерью». Начнем со словаря: определим два базовых объекта
«Мужчина» и «Женщина»,
составим список родственных связей в виде:
«быть матерью», «быть отцом», «быть дедом», «быть дядей» и т.п.,
и сопоставим каждому виду связи её словесное описание.
Мы получили словарь терминов, которые используются в нашей предметной области – «История семьи». Такой словарь уже может считаться онтологией. Однако смысл каждого вида родственной связи по-прежнему заключён в описании, т.е. использовать его для разметки генеалогического дерева можно, а для «вычисления» сложных семейных связей всё еще нельзя.
Значит, нам нужны такие формальные определения семейных связей, чтобы обеспечить «вычисление» на генеалогическом дереве, в дополнение к его разметке.
Воспользуемся [1] базой знаний Family History Knowledge Base (FHKB), разработанной доктором Робертом Стивенсом для сохранения генеалогического дерева семьи Стивенсов (в настоящее время в онтологию занесены факты о 450 членах семьи, начиная от 1726 года). Факты для этой базы знаний собирались по церковным книгам и данным регистрационных бюро, и во многом благодаря Маргарет Стивенс, матери доктора Стивенса, эта база знаний имеет такой объём.
Итак, в FHKB мы имеем саму онтологию семейных связей и множество фактов о конкретных членах семьи.
Рассмотрим вначале упрощенную онтологию (файл family-small.owl из пакета FHKB).
Объявляются два взаимоисключающих класса Person и Sex (здесь и далее применяем манчестерский синтаксис как самый короткий. См. также примеры):
Class: Person SubClassOf: DomainEntity DisjointWith: Sex
Затем – объявим также взаимоисключающие классы Male и Female:
Class: Male SubClassOf: Sex DisjointWith: Female
Class: Female SubClassOf: Sex DisjointWith: Male
Далее определяются классы Man и Woman:
Class: Woman EquivalentTo: Person and (hasSex some Female)
Class: Man EquivalentTo: Person and (hasSex some Male)
Класс Person уточняется --- для каждого человека, упомянутого в генеалогическом дереве, нужно указать его родителей и его пол:
Class: Person
SubClassOf: DomainEntity and (hasFather some Man) and (hasMother some Woman) and (hasSex some Sex)
DisjointWith: Sex
Безусловно, для полноты описания человека в онтологии присутствуют свойства для дат рождения и смерти, даты свадьбы, имени:
DataProperty: deathYear Domain: Person Range: integer
DataProperty: birthYear Domain: Person Range: integer
DataProperty: hasFamilyName Domain: Person Range: string
DataProperty: marriageYear Range: integer
DataProperty: formerlyKnownAs Domain: Person Range: string
Теперь рассмотрим определения родственных связей между членами одной семьи.
Наиболее очевидные связи – между родителями и детьми – определяются несколькими свойствами, в зависимости от направления связи – от родителя к ребенку – parentOf, и от ребенка к родителю – hasParent. Например, определение связи hasMother выглядит так:
ObjectProperty: hasMother Characteristics: Functional
Domain: Person Range: Woman InverseOf: motherOf
SubPropertyOf: hasForeMother, hasParent
где объектное свойство hasForeMother (родственник по материнской линии) определяется как транзитивное (я доопределила исходную онтологию по аналогии с hasForeFather):
ObjectProperty: hasForeMother Characteristics: Transitive
Domain: Person Range: Woman InverseOf: foremotherOf SubPropertyOf: has Ancestor
Cвязь в обратном направлении, от матери к ребенку, задаётся так:
ObjectProperty: motherOf InverseOf: hasMother DisjointWith: fatherOf
ObjectProperty: fatherOf InverseOf: hasFather DisjointWith: motherOf
В качестве примера экземпляра такой онтологии возьмём жившего в 19 веке James Alexander Archer (james_alexander_archer_1882):
Individual: james_alexander_archer_1882
Types: Man
Facts:
fatherOf alec_john_archer_1927,
fatherOf ethel_archer_1912,
fatherOf iris_ellen_archer_1906,
fatherOf joyce_archer_1921,
fatherOf norman_james_archer_1909,
birthYear 1882
Запустив машину логического вывода (в Protégé это - Reasoner/Classify), для james_alexander_archer_1882 получим список выведенных связей, среди которых:
Facts:
parentOf alec_john_archer_1927,
greatGrandfatherOf janet_bright_1962,
grandParentOf john_bright_1930,
forefatherOf joyce_archer_1931
Обладая набором объектных свойств для определения связей между родителями и детьми, мы уже можем построить классическое генеалогическое дерево, какое, например, построено для Рюриковичей: в нём представлены только связи «дети-родители» или «родители-дети».
Определение сложных связей, тех самых троюродных братьев и кузин, которое относится уже к смешанным генеалогическим деревьям (например, таким) требует понимания семантики каждого вида связи.
Разберёмся, как задаются такие сложные связи в FHKB.
Базовый тип связи – hasRelation – является корнем иерархии родственных связей.
ObjectProperty: hasRelation Characteristics: Symmetric, Transitive
Domain: Person Range: Person
Связи между братьями и сёстрами определяются на основании общего свойства directSiblingOf (дети одних родителей, или единокровные братья и сёстры)
ObjectProperty: brotherOf
Domain: Man Range: Person InverseOf: hasBrother SubPropertyOf: directSiblingOf
DisjointWith: sisterOf
Имея такие базовые типы связей, можно «вычислить» и остальные связи, при этом не задавая (или не задавая полностью) явно абсолютно все отношения между людьми в семье.
Например, если я заинтересована в получении списка всех моих предков, то можно представить, сколько времени придётся потратить на задание связей между каждым моим предком и мной. Чтобы этого избежать, и применяется механизм логического вывода.
Воспроизводить все эксперименты по рассуждениям на онтологии можно с помощью Protégé с плагином DL Queries.
Получение списка всех предков человека начинается с определения транзитивного объектного свойства hasAncestor («имеет предка»):
ObjectProperty: hasAncestor Characteristics: Transitive
Domain: Person Range: Person InverseOf: ancestorOf SubPropertyOf: hasRelation
Чтобы автоматически зачислять всех родителей, их родителей и т.д. в «предки» для конкретного человека, видоизменяем свойство hasParent, указав явно факт что hasParent частный случай свойства hasAncestor так:
ObjectProperty: hasParent Domain: Person Range: Person
InverseOf: parentOf SubPropertyOf: hasAncestor
Более короткий список «предков до второго колена», «предков до третьего колена» можно заполучить, определив свойства «быть бабушкой»/ «быть дедушкой», «быть прабабушкой»/ «быть прадедушкой» и т.д. и их инверсные свойства. Например, можно задать свойство hasGrandfather как подсвойство цепочки свойств (property chain):
ObjectProperty: hasGrandfather Domain: Person Range: Man
SubPropertyChain: hasParent o hasFather
Тогда наличие прадедушек задаётся как подсвойство ещё одной цепочки свойств:
ObjectProperty: hasGreatGrandFather Domain: Person Range: Man
InverseOf: greatGrandfatherOf SubPropertyOf: hasGreatGrandParent
SubPropertyChain: hasParent o hasGrandfather
Свойство hasGreatGrandParent, определённое как свойство, обобщающее hasGreatGrandFather и hasGreatGrandMother, позволяет «вычислить» или задать явно (как мы уже обсудили выше, не совсем эффективный способ) «предков 3-го поколения относительно текущего».
Связи между дядюшками/тётушками и племянниками также задаются как частный случай свойства hasRelation:
ObjectProperty: uncleOf Domain: Man Range: Person
InverseOf: hasUncle SubPropertyOf: hasRelation
SubPropertyChain: brotherOf o parentOf
SubPropertyChain: husbandOf o sisterOf o parentOf
Соответственно, все братья родителей конкретного человека(brotherOf o parentOf) и все мужья сестёр его родителей (husbandOf o sisterOf o parentOf) будут его дядюшками.
И, наконец, самые сложные по структуре типы связей – связи между детьми представителей разных поколений - двоюродные братья и сёстры (кузены и кузины), троюродные братья и сёстры – также определяются как подсвойства цепочек свойств.
Например, связь firstCousinOf (двоюродный брат или сестра) определяется как симметричное объектное свойство:
ObjectProperty: firstCousinOf Characteristics: Symmetric
Domain: Person Range: Person
SubPropertyOf: hasRelation
SubPropertyChain: hasParent o siblingOf o parentOf
В вольном переводе этой цепочки на обычный язык получим «формулу»: двоюродные братья/сёстры – это те, кто имеет родителями (hasParent) единокровных братьев или сестёр (siblingOf) родителей (parentOf) человека, относительно которого вычисляется степень родства.
В качестве тренировки «на беглое чтение» OWL определений типов родственных связей, приведу
ObjectProperty: secondCousinOf Characteristics: Symmetric
Domain: Person Range: Person
SubPropertyOf: hasRelation
SubPropertyChain: hasGrandParent o siblingOf o grandParentOf
Да-да, это те самые троюродные братья и сёстры – внуки единокровных братьев/сестёр дедушек/бабушек человека.
Таким образом, чтобы вывести всех троюродных братьев конкретного человека, можно задать лишь прямые связи между родителями и детьми (т.е. parentOf) и между единокровными братьями и сёстрами (brotherOf и sisterOf).
И теперь – связь без названия – тоже для тренировки:
ObjectProperty: ??? Characteristics: Symmetric
Domain: Person Range: Person
SubPropertyOf: hasRelation
SubPropertyChain: firstCousinOf o parentOf
Пользуясь только OWL 2 для описания онтологии FHKB, не все нужные факты можно вывести. К числу «невыводимых в стандартных машинах вывода для OWL 2» фактов относится, например, такой: для человека, у которого определены с помощью связи siblingOf единокровные родственники мужского пола, эти родственники являются его братьями. В чём здесь особенность? Предпринимается попытка объявить значение подсвойства brotherOf через уточнение области значений его суперсвойства siblingOf, что приводит к утверждению, которое может быть определено в OWL как
hasBrother some Person,
subClassOf hasSibling some Man
однако, даже если явно указать:
Individual: john
Types: Man
Facts:
hasSibling peter
Individual: peter
Types: Man
то заключение о том, что
Individual: john
Facts:
hasBrother peter
не будет выведено, в силу так называемого «допущения об открытом мире» (open world assumption, OWA). Детали этой ситуации рассмотрены в [2]
Похоже, что созданием историй семей озаботились не только я и авторы "Семейной истории", но и многие другие люди. На "Первом канале" (сезон 2009-2010) уже есть передача Моя родословная, один из стартап-проектов на Neva Camp 2009 - Moederevo.com, в дополнение к другим, уже известным сайтам – ВГД, Родовод.
Конечно, Вы спросите, а используют ли они эту или какую-нибудь другую онтологию, или какую-нибудь другую базу знаний (хотя бы в Прологе) для составления полного генеалогического дерева, так чтобы вывести и знания о родителях/детях, и знания о других видах связей. Пока ответ мне неизвестен. Легко можно представить некие преобразования уже существующих форматов хранения баз фактов генеалогических деревьев (а там хранятся факты о рождении, смерти, детях и родителях) в формат FHKB, легко представить, КАК увеличатся базы фактов генеалогических деревьев и НАСКОЛЬКО более обширные и, главное, точные, сведения о семье можно получить…
Поиск и отбор такой информации - интересная архивная работа, а с помощью онтологии семейных связей можно "достроить" недостающие отношения и, наконец, узнать, кто же из моих родственников приходится мне внучатым племянником, а кому я буду троюродной бабушкой.
Всем хорошего настроения, комментировать по тексту - здесь, тема на форуме (особо приглашаются авторы упомянутых и других порталов и программ на тему составления генеалогических деревьев!) - здесь.