我正处于 SPARQL 的学习阶段。我正在使用 Turtle 文件提取一些信息。条件是:如果确切的同义词有一个子字符串 'stroke' 或 'Stroke',查询应该返回所有的同义词和 rdfs:label
。
我正在使用以下查询但没有得到输出:
prefix oboInOwl: <http://www.geneontology.org/formats/oboInOwl#>
prefix obo: <http://purl.obolibrary.org/obo/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
Select * where {
?s ?p ?o .
rdfs:label <http://www.geneontology.org/formats/oboInOwl#hasExactSynonym> "stroke"^^xsd:string
}
下面是示例 Turtle 文件:
### https://ontology.aaaa.com/aaaa/meddra_10008196
:meddra_10008196
rdf:type owl:Class ;
<http://www.geneontology.org/formats/oboInOwl#hasDbXref> "DOID:6713" , "EFO:0000712" , "EFO:0003763" , "HE:A10008190" ;
<http://www.geneontology.org/formats/oboInOwl#hasExactSynonym>
"(cva) cerebrovascular accident" ,
"Acute Cerebrovascular Accident" ,
"Acute Cerebrovascular Accidents" ,
"Acute Stroke" ,
"Acute Strokes" ;
rdfs:label "Cerebrovascular disorder"@en ;
:hasSocs "Nervous system disorders [meddra:10029205]" , "Vascular disorders [meddra:10047065]" ;
:uid "6e46da69b727e4e924c31027cdf47b8a" .
我期待这样的输出:
(cva) cerebrovascular accident
Acute Cerebrovascular Accident
Acute Cerebrovascular Accidents
Acute Stroke
Acute Strokes
Cerebrovascular disorder
最佳答案
使用这个三重模式,您正在查询 rdfs:label
作为主语,而不是作为谓语:
rdfs:label <http://www.geneontology.org/formats/oboInOwl#hasExactSynonym> "stroke"^^xsd:string
您要问的是:“资源 rdfs:label
是否具有字符串值为 'stroke' 的属性 oboInOwl:hasExactSynonym
?”
但是你想问这个关于类的问题(例如,:meddra_10008196
),而不是 rdfs:label
:
?class oboInOwl:hasExactSynonym "stroke" .
寻找匹配项
因为你不想只找到完全匹配的字符串,你可以使用 CONTAINS
:
?class oboInOwl:hasExactSynonym ?matchingSynonym .
FILTER( CONTAINS(?matchingSynonym, "stroke") ) .
因为要忽略大小写,可以用LCASE
查询小写同义词:
?class oboInOwl:hasExactSynonym ?matchingSynonym .
FILTER( CONTAINS(LCASE(?matchingSynonym), "stroke") ) .
显示结果
要在同一列中显示标签和所有同义词,您可以使用带有 |
( AlternativePath ) 的属性路径:
?class rdfs:label|oboInOwl:hasExactSynonym ?labelOrSynonym .
完整查询
# [prefixes]
SELECT ?class ?labelOrSynonym
WHERE {
?class rdfs:label|oboInOwl:hasExactSynonym ?labelOrSynonym .
FILTER EXISTS {
?class oboInOwl:hasExactSynonym ?matchingSynonym .
FILTER( CONTAINS(LCASE(?matchingSynonym), "stroke") ) .
}
}
关于sparql - 使用 SPARQL 从 Turtle 文件中提取同义词和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74118096/