Wikidata SPARQL 按语言过滤字段值

Wikidata SPARQL filter field values by language

所以我有这个获取美元信息的 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

Try it here

这输出:

现在,当我查看 USD 的 WikiData 页面,然后转到“简称”部分时,我看到了这个:

他们都有一个语言 属性 在括号之间。现在我的问题是:我在查询中想要的是仅包含短名称的“英文”版本并过滤掉所有其他语言。我该怎么做?

您的查询出奇地复杂,我相信您是由于 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' }  
  }

Link to query

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