Определение класса Protege с выражением числовых данных

Я строю онтологию умного дома. Теперь у меня есть такая иерархия классов:

Я хочу дать определения подклассу RoomStatus. Например, я хочу определить, что если комнатная температура находится в диапазоне 18-22 ° С, а влажность находится в диапазоне 40-50%, то комната имеет мягкий статус. Я пытался использовать редактор выражений классов в Protege, но он не работает.

Как я могу понять это определение? Заранее спасибо!

3 ответа

Решение

Ответ Хатима может сработать для вас, но я думаю, что было бы лучше не использовать аксиомы эквивалентного класса, когда вам это не нужно, и избегать привязки Mild Status к определенным температурам и влажностям. В конце концов, что означает, что Комната имеет мягкий статус, очень отличается от того, что значит для Сауны иметь мягкий статус.

Я бы порекомендовал использовать аксиому общего класса, чтобы сказать, что:

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

Как аксиома класса, это:

Комната и (имеет целое значение температуры [≥18,≤22]) и (имеет целое число влажности [≥40, ≤50]) subClassOf (значение hasStatus Mild_Status)

Это почти точно, что вы можете написать в Protege:

аксиома в протеже

Вот онтология (в RDF/XML и в TTL) с этой аксиомой:

@prefix :      <https://stackru.com/q/29228328/1281433/> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:       a       owl:Ontology .

:Room   a       owl:Class .
:Status  a      owl:Class .
:Mild_Status  a  owl:NamedIndividual , :Status .

:hasStatus  a   owl:ObjectProperty .

:hasTemperature  a  owl:DatatypeProperty .
:hasHumidity  a  owl:DatatypeProperty .

[ a                   owl:Class ;
  rdfs:subClassOf     [ a               owl:Restriction ;
                        owl:hasValue    :Mild_Status ;
                        owl:onProperty  :hasStatus
                      ] ;
  owl:intersectionOf  ( :Room _:b2 _:b3 )
] .

_:b3    a                   owl:Restriction ;
        owl:onProperty      :hasTemperature ;
        owl:someValuesFrom  [ a                     rdfs:Datatype ;
                              owl:onDatatype        xsd:integer ;
                              owl:withRestrictions  ( _:b0 _:b4 )
                            ] .
_:b0    xsd:minInclusive  18 .
_:b4    xsd:maxInclusive  22 .

_:b2    a                   owl:Restriction ;
        owl:onProperty      :hasHumidity ;
        owl:someValuesFrom  [ a                     rdfs:Datatype ;
                              owl:onDatatype        xsd:integer ;
                              owl:withRestrictions  ( _:b5 _:b1 )
                            ] .
_:b1    xsd:minInclusive  40 .
_:b5    xsd:maxInclusive  50 .
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns="https://stackru.com/q/29228328/1281433/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Ontology rdf:about="https://stackru.com/q/29228328/1281433/"/>
  <owl:Class rdf:about="https://stackru.com/q/29228328/1281433/Room"/>
  <owl:Class rdf:about="https://stackru.com/q/29228328/1281433/Status"/>
  <owl:Class>
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onProperty>
          <owl:ObjectProperty rdf:about="https://stackru.com/q/29228328/1281433/hasStatus"/>
        </owl:onProperty>
        <owl:hasValue>
          <owl:NamedIndividual rdf:about="https://stackru.com/q/29228328/1281433/Mild_Status">
            <rdf:type rdf:resource="https://stackru.com/q/29228328/1281433/Status"/>
          </owl:NamedIndividual>
        </owl:hasValue>
      </owl:Restriction>
    </rdfs:subClassOf>
    <owl:intersectionOf rdf:parseType="Collection">
      <owl:Class rdf:about="https://stackru.com/q/29228328/1281433/Room"/>
      <owl:Restriction>
        <owl:onProperty>
          <owl:DatatypeProperty rdf:about="https://stackru.com/q/29228328/1281433/hasHumidity"/>
        </owl:onProperty>
        <owl:someValuesFrom>
          <rdfs:Datatype>
            <owl:onDatatype rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/>
            <owl:withRestrictions rdf:parseType="Collection">
              <rdf:Description>
                <xsd:maxInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
                >50</xsd:maxInclusive>
              </rdf:Description>
              <rdf:Description>
                <xsd:minInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
                >40</xsd:minInclusive>
              </rdf:Description>
            </owl:withRestrictions>
          </rdfs:Datatype>
        </owl:someValuesFrom>
      </owl:Restriction>
      <owl:Restriction>
        <owl:onProperty>
          <owl:DatatypeProperty rdf:about="https://stackru.com/q/29228328/1281433/hasTemperature"/>
        </owl:onProperty>
        <owl:someValuesFrom>
          <rdfs:Datatype>
            <owl:onDatatype rdf:resource="http://www.w3.org/2001/XMLSchema#integer"/>
            <owl:withRestrictions rdf:parseType="Collection">
              <rdf:Description>
                <xsd:minInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
                >18</xsd:minInclusive>
              </rdf:Description>
              <rdf:Description>
                <xsd:maxInclusive rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
                >22</xsd:maxInclusive>
              </rdf:Description>
            </owl:withRestrictions>
          </rdfs:Datatype>
        </owl:someValuesFrom>
      </owl:Restriction>
    </owl:intersectionOf>
  </owl:Class>
</rdf:RDF>

Вы можете сделать это с помощью редактора выражений классов Protege, но есть несколько шагов:

  1. Вы создаете #Mild_status и делаете его подклассом #RoomStatus (вы сделали это, как я вижу в вашем редакторе)

  2. Вы должны определить домен и диапазон двух ваших свойств данных (#centigrade и #humidity), например, имея в качестве домена класс #RoomStatus и в качестве диапазона целое число типа данных xml. Все это можно сделать с помощью Protege.

Наконец, используя редактор выражений классов: вы должны утверждать, что #Mild_status эквивалентен:

RoomStatus
 and (centigrade some integer[> 18])
 and (centigrade some integer[< 22])
 and (humidity some integer[> 40])
 and (humidity some integer[<50])

Если вы хотите использовать это выражение для аргументации извлечения экземпляра: вы должны знать, что не все аргументы поддерживают аргументацию диапазонов данных. Гранулы поддерживают такого рода выражения, но я думаю, что Fact++ нет.

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

Давайте посмотрим на Измерение. Я полагаю, что вы имеете в виду не измерение (действие), а аспект, который необходимо измерить, например, состояние пожарной сигнализации. Я бы переименовал Measurement в MeasurementType, а затем представил подклассы Measurement как экземпляры MeasurementType.

      :_MeasurementType_FireAlarmReading a :MeasurementType, owl:NamedIndividual .
:_MeasurementType_GasReading a :MeasurementType, owl:NamedIndividual .

и т. д.

MeasurementType — это класс категории, и его экземпляры определяют конкретные категории, в которые помещаются измерения.

Фактическое измерение представляет собой событие с временем начала и окончания. Каждый экземпляр связывается с типом измерения через свойство isCategorizedBy.

      :_Measurement_gas_reading_2023-04-30T13-18-33 a :Measurement ;
:startDateTime '2023-04-30T13:18:33'^^xsd:dateTime ;
:endDateTime '2023-04-30T13:18:39'^^xsd:dateTime ;
:isCategorizedBy :_MeasurementType_GasReading ;
:hasMagnitude [ reference to a magnitude object that handles the numeric value and an appropriate unit of measure]
.

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

      :_MeasurementType_Radon_Level a :MeasurementType, owl:NamedIndividual .

Наконец, я предлагаю вам рассмотреть возможность создания вашей модели на основе верхней онтологии «суть», которая предоставляет множество полезных базовых классов и свойств, которые вы можете расширить для моделирования своей предметной области. https://www.semanticarts.com/gist/

Другие вопросы по тегам