我最近问了一个问题,关于在启用 OWL 推理的情况下将大约 1000 万条语句加载到三元存储库中的可行性。
这导致了一些 StackOverflow 评论以及我的研究小组内部关于我们是否真的需要 OWL 推理的讨论。
我将从一个似乎不需要OWL 推理的真实世界查询开始。
“41167-4120-0”是识别美国商业药品“盐酸非索非那定 180 MG 口服片剂 [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
}
}
关注点:
如果不进行推理访问嵌套的子类关系呢?
上面的例子很简单,因为非索非那定被直接断言具有“抗过敏”作用
如果我对服用硝酸酯的人感兴趣怎么办?硝酸甘油是一种硝酸甘油,它又是一种硝酸酯。如果我使用没有启用推理的存储库,我将不得不显式使用属性路径来查找正在服用任何硝酸酯的患者,使用这样的片段(对吗?)
?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 推理,对吧?