serge_gorshkov


Сергей Горшков - о бизнесе в сфере ИТ

о семантической интеграции, программировании, управлении...


Previous Entry Share Next Entry
Классификация и типизация в OWL
serge_gorshkov
Благодаря совместной работе в проекте с maxstroy, окончательно осознал разницу и границы применения классификации и типизации в RDF/OWL. Пожалуй, Америки не открою, но расставить акценты необходимо.


С учетом развернувшейся ниже дискуссии, прежде всего поясню, что понимаю здесь под термином "типизация". Для RDF/OWL "родным" способом группировки сущностей является классификация, то есть создание набора классов, и отнесение к ним индивидуальных объектов (конечно, любой объект может одновременно входить в любое число классов). Принадлежность к классу выражается при помощи предиката rdf:type, но под типизацией я имею в виду не это.
Понятие "тип" хочется противопоставить понятию "класс", и выразить им другой способ группировки. Этот способ заключается в том, что у объекта создается значение атрибута, которое указывает на другой объект (тип), являющийся членом специального класса - перечисления типов. Поясню на примере.

При моделировании в RDF/OWL часто возникает ситуация, когда одну и ту же информацию можно выразить как классификацией, так и типизацией. Например, имеем объект, относящийся к I категории опасности. Можно создать класс "Опасные объекты", в нем подкласс - "Объекты I категории опасности", и классифицировать по нему наш объект. А можно создать класс "Категории опасных объектов", отнести к нему объект - "I категория опасности", затем у класса, к которому относится наш объект, создать атрибут "Категория опасности", и присвоить ему значение "I категория опасности" для нашего объекта. Первый подход является классификацией, второй - типизацией. Проиллюстрирую оба решения картинкой:



Когда следует выбирать первое, а когда - второе?
Мы пришли к выводу, что целесообразность первого варианта доказуема в том случае, если:

  • от того, что объект классифицирован данным классом, зависит набор его атрибутов;

  • есть причина сделать рассматриваемую категорию именно классом, не связанная с данным объектом (атрибуты должны появиться у каких-то других объектов, которые будут ею классифицированы).

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

  • 1
«Когда следует выбирать первое, а когда - второе?»
Сам вопрос говорит об ущербности схемы, в которой надо выбирать в какой класс (множество) входит объект: либо в класс опасных, либо в класс, скажем, химических моющих средств. В жизни у нас такой проблемы не возникает: мы прекрасно (без проблем) понимаем, что один объект может без лишних вопросов входить во множество классов.

Прежде чем говорить об ущербности, стоило бы разобраться в вопросе.

Любой объект прекрасно может входить в любое количество классов, иначе говорить было бы не о чем. Вопрос не в этом, а в том, что в каждом конкретном случае, когда нужно выразить отнесение объекта к какой-либо группе, для этого можно использовать два механизма.
Между ними есть существенная разница, и у каждого есть свои преимушества.
Следовательно, нужны критерии выбора того или иного способа.


« Вопрос не в этом, а в том, что в каждом конкретном случае, когда нужно выразить отнесение объекта к какой-либо группе, для этого можно использовать два механизма.»
Так я именно об этой проблеме выбора между двумя механизмами и пишу, именно о самой постановке вопроса выбора между ними: выберем одно будет правильно в такой ситуации, выберем другой - то второй. Разве такая проблема в реальных ситуациях у нас стоит? Разве вы в быту или производстве решаете к кому классу отнести объект: к опасным или моющим средствам? Подумайте, ведь сама постановка проблемы в рамках моделирования о выборе между двумя вариантами, говорит о проблемах в самой схеме моделирования (RDF/OWL). Я именно о проблеме RDF/OWL, которую вы наглядно описали в свое примере.

Это почему второй подход называется "типизацией"? Он называется "атрибутным подходом", и ничего общего с типизацией не имеет. В формировании содержательного утверждения про "Наш объект" предикат type не задействован.

Если очень хочется вести именно такие термины, то можно сделать это так:

Типизация - это когда "Наш объект" объявляется принадлежащим классу "Объекты I категории опасности". Это действительно типизация, так как содержательное утверждение формулируется через предикат type.

Классификация - это когда "Класс нашего объекта" объявляется подклассом класса "Объекты I категории опасности". Это действительно классификация, так как содержательное утверждение формулируется через предикат subClassOf.

При такой терминологии выбор очевиден.

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

"Наш объект" всегда классифицируется (типизируется) классом "Объекты 1 категории опасности".

А вот для класса "Объекты 1 категории опасности" есть два варианта.

1. Класс "Объекты 1 категории опасности" является подклассом (subClassOf) класса "Опасные объекты".

2. Класс "Объекты 1 категории опасности" является членом (type) класса "Категории опасных объектов".

При втором варианте класс "Категории опасных объектов" оказывается классом классов, что в OWL не рекомендуется (хотя в OWL 2 допустимо). Но пытаться для обхода этого объявить отношение "Нашего объекта" каким-то атрибутом "категория опасности" вместо type - абсолютно несемантическое по духу решение.


Edited at 2015-09-26 10:14 pm (UTC)

да, вроде бы так

Из-за слова "типизация" вышла путаница.
Под "типизацией" я не имел в виду использование предиката type - то есть, слово выбрал неудачно. Давайте тогда с начала.

Если класс "Объекты 1 категории опасности" является подклассом (rdfs:subClassOf) класса "Опасные объекты", то это, на мой взгляд, называется специализацией.

Если объект "Наш объект" является членом (rdf:type) класса "Объекты 1 категории опасности", то это как раз классификация (объект классифицирован).

Если объект "Наш объект" имеет атрибут-связь, значение которого указывает на какой-то другой объект (не класс!), то для этого случая - который я неудачно назвал "типизацией" - нужно придумать термин. Я-то имел в виду как раз противопоставление классов и классификации, "родного" для RDF/OWL способа, и случая, когда мы вводим отдельный класс, объектами которого являются типы (ну, или категории). Назовем этот случай, допустим, атрибутированием.

Тогда дихотомия выглядит так:

1. Группу ("Опасные объекты I класса") объявляем как класс, включаем в нее наш объект. Это классификация, тут ничего не изменилось.

2. Группу ("Опасные объекты I класса") объявляем как объект стороннего класса ("Категории опасных объектов"), и атрибутируем наш объект путем создания у него атрибута-связи с этим объектом. Тоже ничего не изменилось, кроме термина.

Вы предложили третий вариант, разновидность классификации, когда класс "Объекты 1 категории опасности" является членом (type) класса "Категории опасных объектов". С выводом про класс классов согласен.

Что же до того, что объявлять отношение атрибутом вместо type несемантично - можно поспорить. В комментарии выше я приводил пример с высказыванием "Иван является мужем Марии" - тут как раз естественнее создать атрибут "является мужем", и связать Ивана и Марию, чем создавать класс "мужья Марии" и включать туда Ивана (хотя возможно и это). Так что не стоит совсем отрицать атрибутирование.

Основная разница для меня заключается в удобстве использования. Предположим, у нас есть некий программный код, который строит форму для поиска по этой модели. В ней хочется иметь, например, группу переключателей "Категории опасности", внутри которой расположены переключатели "I категория", "II категория" и др. Если у нас используется только классификация, построить такую форму оказывается чуть сложнее, потому что надо каким-то образом объединить классы "I категория", "II категория", понять, что они классифицируют объекты по одному и тому же основанию. В случае с атрибутом это получается куда проще.


Я не силен в RDF/OWL, но проблему понял. Это же "утиная типизация" - либо мы устанавливаем перечень и значения атрибутов в зависимости от типа/класса, либо относим к тому или иному типу/классу в зависимости от значения атрибута(-ов).

Считаю, что некорректно называть "Категории опасных объектов" классом, а "I категория опасности" - объектом. Скорее, первое - это классификационный признак (основание классификации), а второе - его значение.

Кстати, как во втором варианте будет решаться задача отнесения объекта сразу к двум (и более) категориям опасности? Второе значение того же атрибута, или второй аналогичный атрибут, или же вообще запрещено?

Отнести к двум категориям сразу - можно, благо в RDF/OWL атрибут может иметь любое количество значений (если его специально не ограничить constraint'ом).

Я, собственно, подводил к тому, что стоит обсуждать не "правильно" или "неправильно" с концептуальной точки зрения - потому что сколько методик моделирования, столько будет и доказательств, с различными результатами - а с точки зрения удобства использования.

Даже если отвлечься от удобства программиста, в RDF/OWL есть простые и понятные различия между классом и объектом:
- класс может иметь подклассы;
- объект может иметь атрибуты;
- членство в классе определяет возможный набор атрибутов объекта.

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

Но это же неправда, про костыли. В OWL Full - класс может быть одновременно индивидом, без всяких костылей. В OWL DL просто не может, и всё.

Я пришёл к выводу, что атрибуты в моделировании бывают трёх видов: 1. со значением какого-нибудь типа данных, 2. со значением-ссылкой на какой-нибудь объект, 3. со значением из справочника. Последний - самый коварный. Вы здесь именно его используете, когда говорите 'создать атрибут "Категория опасности", и присвоить ему значение "I категория опасности" для нашего объекта"'.

Да, именно. По сути, вариант "со значением из справочника" ничем не отличается от "значения-ссылки на какой-нибудь объект".

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

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

Вот, это ценная мысль! Класс - больше в голове, чем в данных. То есть отношение, с идеологической точки зрения, всегда одно и то же - классификация. Но выражаться может разными средствами, которые выбираются с прагматической точки зрения.

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

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

Делать ссылку на класс через атрибут или подкласс - практически равнозначно по идеологии, но при росте количества классов по-разному увеличивает сложность. И не понятно, какая сложность менее вредная.

  • 1
?

Log in

No account? Create an account