我最近问了关于在启用 OWL 推理的情况下将大约 1000 万个语句加载到三元库中的可行性。

这导致了一些 StackOverflow 评论以及我的研究小组内部关于我们是否真的需要 OWL 推理的讨论。


我将从一个似乎不需要 OWL 推理的 real-world 查询开始。

“41167-4120-0”是标识商业药品“盐酸非索非那定 180MG 口服片[Allegra]”在美国的 NDC 代码。

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))

而 ChEBI 说:

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 
    }
}

关注:

如何在没有推理的情况下访问嵌套的子类关系?

上面的例子很容易,因为 fexofenadine 被直接断言具有“anti-allergic”的作用

如果我对服用硝酸酯的人感兴趣怎么办?硝酸甘油是硝酸甘油,而硝酸甘油又是硝酸酯。如果我使用的存储库没有启用任何推理,我将必须明确使用属性路径来查找正在服用任何硝酸酯的患者,并使用这样的片段(对吗?)

?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 .

我需要某种形式的 OWL 推理,对吧?