Моделирование сложных иерархий - PullRequest
1 голос
/ 15 июня 2010

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

-animal
  -bird
    -carnivore
     -hawk
    -herbivore
     -bluejay
  -mammals
   -carnivores
   -herbivores

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

-animal
  -carnivore
    -birds
     -hawk
    -mammals
     -xyz
  -herbivores
   -birds
     -bluejay
   -mammals

Но теперь будет гораздо медленнее запрашивать« дай мне всех птиц ».

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

Ответы [ 3 ]

1 голос
/ 15 июня 2010

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

Подход с использованием реляционной базы данных будет другим (без учета иерархии или наследования), но приведет к тем же концептуальным результатам, что и «множественное наследование»: «класс» (в смысле Линнея тип / класс / отряд / семья / род / вид) - это одно поле записи, а диета (плотоядное, травоядное, всеядное) - отдельная - они не ограничивают друг друга ни в концептуализации, ни вв поиске / поиске.

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

0 голосов
/ 15 июня 2010

Я написал пример ролей пользователей , используя аналогичную проблему с Graph database back-endПервоначально используемый мной пример взят из этого примера на основе SQL.Я бы даже не пытался использовать SQL для решения подобных проблем в наше время, это такая боль.(отказ от ответственности: я в команде Neo4j graphdb)

0 голосов
/ 15 июня 2010

Если вы посмотрите на справочную страницу MongoDB на Использование Multikeys для симуляции большого количества индексов , вы увидите, что MongoDB позволит вам создать один «документ» в своей базе данных для каждого животного, которое содержит все виды информации:

{
  _id: "hawk",
  attribs: [
   {diet: 'carnivore'},
   {kingdom: 'animal'},
   {class: 'Aves'},
   {order: 'Accipitriformes'},
   {locomotion: 'flight'}
  ]
}

Тогда вы можете искать любую комбинацию атрибутов, которую хотите!

...