Мне действительно нужны рассуждения о СОВ?

Недавно я задал вопрос о возможности загрузки около 10 миллионов операторов в триплет с включенным рассуждением OWL.

Это привело к некоторым комментариям Stackru, а также к обсуждению в моей исследовательской группе вопроса о том, действительно ли нам нужны рассуждения о OWL.


Я начну с реального запроса, который, кажется, не требует рассуждений OWL.

"41167-4120-0" - это код NDC, который идентифицирует коммерческий лекарственный препарат "Фексофенадин гидрохлорид 180 мг для перорального применения [Аллегра]" в США.

Слегка измененная версия NDC появляется в виде метки в онтологии лекарств (в частности, файл dron-ndc.owl):

http://purl.obolibrary.org/obo/DRON_00604430 rdfs:label "41167412000"

DrON делает следующие утверждения OWL:

http://purl.obolibrary.org/obo/DRON_00604430 is a packaged drug product 
    and is rdfs:subClass of 
    ( has_proper_part some http://purl.obolibrary.org/obo/DRON_00083688 )

http://purl.obolibrary.org/obo/DRON_00083688 
    rdfs:subClassOf http://purl.obolibrary.org/obo/DRON_00062350

http://purl.obolibrary.org/obo/DRON_00062350 has_proper_part some 
    (scattered molecular aggregate  
    and (is bearer of some active ingredient) 
    and (is bearer of some (mass and 
    (has measurement unit label value milligram) 
    and (has specified value <value> ))) 
    and (has granular part some fexofenadine))

И Чеби говорит:

http://purl.obolibrary.org/obo/CHEBI_5050 rdfs:label "fexofenadine"
    subClassOf (has role some anti-allergic agent)

а также

http://purl.obolibrary.org/obo/CHEBI_50857 rdfs:label "anti-allergic agent"

Таким образом, чтобы связать код NDC и терапевтическую роль, я могу написать запрос, подобный следующему

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
select distinct 
?ndcval ?packdrugprod ?drugbrand ?brandlab ?drugform  ?api ?apilab ?drugrole
where {
    values ?ndcval {
        "41167412000" 
    }
    ?packdrugprod rdfs:subClassOf ?hasproppart ;
                  rdfs:label ?ndcval .
    ?hasproppart a owl:Restriction ;
                 owl:onProperty <http://www.obofoundry.org/ro/ro.owl#has_proper_part> ;
                 owl:someValuesFrom ?drugbrand .
    ?drugbrand rdfs:subClassOf ?drugform ;
               rdfs:label ?brandlab .
    ?drugform rdfs:subClassOf ?proppart .
    ?proppart a owl:Restriction ;
              owl:onProperty <http://www.obofoundry.org/ro/ro.owl#has_proper_part> ;
              owl:someValuesFrom ?valSource1 .
    ?valSource1 owl:intersectionOf ?intsect1 .
    # scat mol agg
    ?intsect1 rdf:first obo:OBI_0000576 .
    ?intsect1 rdf:rest ?scatmolag .
    ?scatmolag rdf:first ?bearacting .
    ?scatmolag rdf:rest ?intsect3 .
    # bearer of active ingredient
    ?bearacting a owl:Restriction ;
                owl:onProperty obo:BFO_0000053 ;
                owl:someValuesFrom obo:DRON_00000028 .
    ?intsect3 rdf:first ?granpart .
    ?intsect3 rdf:rest ?r .
    # has granular part fexofenadine
    ?granpart a owl:Restriction ;
              owl:onProperty obo:BFO_0000071 ;
              owl:someValuesFrom ?api .
    ?api rdfs:subClassOf ?rolerestr ;
         rdfs:label ?apilab .
    # has anti allergic role
    ?rolerestr a owl:Restriction ;
               owl:onProperty obo:RO_0000087 ;
               owl:someValuesFrom ?drugrole  .
    ?drugrole rdfs:label ?drlab .
    values ?drugrole {
        obo:CHEBI_50857 
    }
}

проблемы:

Как насчет доступа к вложенным отношениям подкласса без объяснения причин?

Вышеприведенный пример был легким, потому что прямо утверждалось, что фексофенадин играет "антиаллергическую" роль

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

?s rdfs:subClassOf* <http://purl.obolibrary.org/obo/CHEBI_51080> .

Как насчет вывода классов, к которым принадлежат люди?

Что делать, если моя онтология говорит что-то вроде

:ViagraPill owl:equivalentClass ( :pill 
    and (:hasColor some :blue ) 
    and (:hasShape some :diamond))
:steelBlue rdfs:subClassOf :blue

И у меня есть данные троек, которые говорят что-то вроде

:patient1 :consumed :pill1 .
:pill1 :hasColor :steelBlue1 ;
    :hasShape :diamond1 .
:steelBlue1 a :steelBlue .
:diamond1 a :diamond.

И я хочу написать запрос для пациентов, которые употребляли таблетки Виагры:

?patient a :patient ;
    :consumed ?pill .
?pill a :ViagraPill .

Мне понадобится какая-то форма рассуждений о сове, верно?

0 ответов

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

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

Лучше приложить эти утверждения непосредственно к определению препарата: как простые утверждения, а не как ограничения. Вы можете сделать это двумя способами:

  1. По-прежнему относитесь к Allegra как к классу, но прикрепляйте реквизиты непосредственно к нему, используя каламбур
  2. Рассматривайте Аллегру как пример, и если вам когда-нибудь понадобится описать отдельные таблетки, используйте такие утверждения, как pill dct:type Allegra

Затем вы можете получить доступ к свойствам таблетки просто через ее препарат (класс или не класс):

?pill rdf:type ?drug. # or in Variant2: dct:type
?drug obo:RO_0000087 obo:CHEBI_50857. # has anti allergic role

Он будет похож на ваш запрос, но будет проще и быстрее, так как он позволит избежать ограничений.

(Что касается необходимости разбирать rdf:Lists, что должно быть тяжелым бременем для сознания создателей онтологий):

    ?intsect1 rdf:first obo:OBI_0000576 .
    ?intsect1 rdf:rest ?scatmolag .
    ?scatmolag rdf:first ?bearacting .
    ?scatmolag rdf:rest ?intsect3 .
    # bearer of active ingredient

Вот ваш пример Виаграммы в упрощенном виде. Я повернул номенклатурные значения :blue и :diamond на лиц (skos:Concept), потому что я не вижу причин, чтобы они были классами (:steelBlue1 не имеет смысла для меня).

:ViagraPill a DrugForm;
  :hasColor :blue;
  :hasShape :diamond.
:steelBlue a skos:Concept;
  skos:broader :blue.

:patient1 :consumed :pill1.
:pill1 :hasColor :steelBlue; :hasShape :diamond.

Цвет и форма - необходимое, но недостаточное условие для идентификации препарата, поэтому ?drugFormНиже приведено возможное лекарственное средство этой таблетки, но не определенно:

select ?patient ?drugForm {
  ?patient a :patient; :consumed ?pill.
  ?pill :hasColor ?color; :hasShape ?shape.
  ?drugForm :hasColor ?color1; :hasShape ?shape.
  ?color skos:broaderTransitive? ?color1
}

Здесь я использовал переходные рассуждения: путь skos:broaderTransitive? быстрее пути skos:broader*.

Рассуждения - это не вопрос по принципу "все или ничего": вы можете выбирать правила, которые вам нужны, из встроенных наборов правил. Например, если вы включите аргументацию RDFS, вы можете упростить:

?x a ?s. ?s rdfs:subClassOf* :CHEBI_51080

чтобы просто

?x a :CHEBI_51080

Встроенный набор правил по умолчанию, оптимизированный для RDFS-Plus, включает RDFS, обратные и транзитивные. См. http://graphdb.ontotext.com/documentation/enterprise/rules-optimisations.html для получения дополнительных советов.

Вы можете возразить: "Разве вы не говорили, что прикрепите реквизит непосредственно к наркотикам (классам)? Почему вы также прикрепляете их к :pill1 выше?".

Я думаю, это нормально: мы могли бы объявить, что у этих реквизитов есть домен :DrugIndividual or :DrugForm or :Drug, и интерпретировать их как "наблюдаемые" для :DrugIndividual но "номинальный" или "обязательный" для :DrugForm and :Drug. Кстати, мне нравится объявлять полиморфные домены, используя schema:domainIncludes ... вместо rdfs:range [a owl:Class; owl:unionOf (...)].

Если вы не хотите прикреплять реквизиты к лицам (экземплярам), употребляющим наркотики, тогда вам придется использовать "неизвестный класс" для таблетки, например, вот так:

:patient1 :consumed :pill1.
:pill1 a [:hasColor :steelBlue; :hasShape :diamond].

С соответствующим небольшим усложнением запросов:

select ?patient ?drugForm {
  ?patient a :patient; :consumed ?pill.
  ?pill a [:hasColor ?color; :hasShape ?shape].
  ?drugForm :hasColor ?color1; :hasShape ?shape.
  ?color skos:broaderTransitive? ?color1
}

Подвести итоги:

  • GraphDB не поддерживает OWL DL, он поддерживает QL и RL.
  • Онтологии в стиле OBO используют миллионы классов, что предписывает вывод целого набора свойств от ограничений класса к отдельным лицам; что я считаю расточительным.
Другие вопросы по тегам