首页 > 解决方案 > Wikidata SPARQL 按语言过滤字段值

问题描述

所以我有这个获取美元信息的 SparQL 查询

SELECT 
?currency ?page_title ?currencyLabel ?currencyIso4217 
(GROUP_CONCAT(distinct ?shortName; separator = ', ') as ?shortNames)  
    {  
        ?currency wdt:P498 ?currencyIso4217 .  
        OPTIONAL {?currency wdt:P1813 ?shortName} .    
        ?article schema:about ?currency ; schema:isPartOf <https://en.wikipedia.org/>; schema:name ?page_title    
            SERVICE wikibase:label { bd:serviceParam wikibase:language 'nl' }  
            {
                BIND(wd:Q4917 AS ?currency).  
                OPTIONAL { 
                     SERVICE wikibase:label 
                             { 
                               ?shortName rdfs:label ?shortNameLabel . 
                               bd:serviceParam wikibase:language 'nl'  
                             }  
                         } 
             } 
      }  
group by ?currency ?currencyLabel ?currencyIso4217 ?page_title

在这里试试

这输出: 在此处输入图像描述

现在,当我查看美元的 WikiData 页面,然后查看“短名称”部分时,我看到:

维基数据图像

它们都在括号之间具有语言属性。现在我的问题是:我想要在查询中只包含短名称的“英文”版本并过滤掉所有其他语言。我怎样才能做到这一点?

标签: sparqlwikidata

解决方案


您的查询奇怪地令人费解,我相信由于 GROUP_CONCAT 在这种情况下长期存在的错误(至少我似乎记得类似的事情——现在无法完全查找),您已经走上了这条路。

无论如何,至少在理论上,我认为这对您有用。实际上,没有足够的“短名称”来影响它。

SELECT DISTINCT ?currency ?page_title ?currencyLabel ?currencyIso4217 ?shortName WHERE 
  {  
    ?currency wdt:P498 ?currencyIso4217 .  
    ?article schema:about ?currency ; schema:isPartOf <https://en.wikipedia.org/>; schema:name ?page_title .          
    
    OPTIONAL {
      ?currency wdt:P1813 ?shortName .
      FILTER(LANG(?shortName) = "en") .
    }    
    SERVICE wikibase:label { bd:serviceParam wikibase:language 'en' }  
  }

查询链接

你会注意到我剪掉了一大堆东西。但我认为您一直在掌握的一个想法就是FILTER。也许那个 LANG(?string) 能让你掌握语言。


推荐阅读