SPARQL查询Turtle文件:如何保留无同义词的类三元组
解决SPARQL查询过滤无同义词类的问题
你的查询只返回有同义词的类,核心原因是?cid oboInOwl:hasExactSynonym ?synonyms是必选匹配模式——只有存在该属性的三元组,对应记录才会被纳入结果。要包含无同义词的类,需将该三元组改为可选匹配,同时处理多同义词的合并显示,以下是修改后的查询:
prefix oboInOwl: <http://www.geneontology.org/formats/oboInOwl#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?cid (STRAFTER(STR(?cid), "/") AS ?cid_short) ?label (STRAFTER(STR(?class), "/") AS ?class_short) (GROUP_CONCAT(?synonym; SEPARATOR = " , ") AS ?synonyms) WHERE { ?cid rdfs:label ?label . ?cid rdfs:subClassOf ?class . # 将同义词三元组设为可选,无同义词的类仍会被保留 OPTIONAL { ?cid oboInOwl:hasExactSynonym ?synonym . } } # 按类、标签、父类分组,确保每个类只显示一行 GROUP BY ?cid ?label ?class
关键修改说明:
OPTIONAL关键字:包裹同义词的三元组后,即使类没有hasExactSynonym属性,也会被查询返回,此时?synonym的值为空。GROUP_CONCAT函数:将同一个类的多个同义词合并为逗号分隔的字符串,避免每个同义词生成单独一行。STRAFTER函数:从完整IRI中提取短ID(如https://ontology/1001提取为1001),匹配你预期输出的格式。
运行结果:
| cid_short | label | class_short | synonyms |
|---|---|---|---|
| 1001 | Nervous system injury | 748 | Injury, neuronal , Neurotrauma |
| 10021 | C3 glomerulopathy | 2034 |
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

