SPARQL查询如何统一获取dbo:Cheese的dbp:source属性值
问题原因
你当前的写法会同时拼接所有原始?source值(包含实体URI和纯文本)和动物实体的标签值,所以才会出现URI和对应标签同时出现在结果中的问题。
解决方案
可以用SPARQL内置的COALESCE函数实现值的优先选择:对于每个来源,优先取动物实体的英文标签,没有对应标签的场景下直接使用来源的原始值,调整后的查询语句如下:
SELECT ?cheese (GROUP_CONCAT(DISTINCT ?source_display; SEPARATOR=", ") AS ?sources) WHERE { ?cheese a dbo:Cheese . OPTIONAL { ?cheese dbp:source ?source . OPTIONAL { ?source a dbo:Animal ; rdfs:label ?source_label . FILTER(langMatches(lang(?source_label), "EN")) } BIND(COALESCE(?source_label, ?source) AS ?source_display) } } GROUP BY ?cheese LIMIT 10
关键修改说明
- 新增
BIND语句结合COALESCE生成统一的展示值?source_display,自动适配实体标签和纯文本两种场景 - 增加了
GROUP BY ?cheese声明,符合聚合函数的语法要求,避免部分SPARQL端点报错 - 仅对统一后的
?source_display做去重拼接,不会再出现URI和标签重复的问题
内容的提问来源于stack exchange,提问作者Sevla
相关产品推荐
相关产品推荐

