【问题标题】:WikiData SPARQL Query Fails, requires CONTAINS to workWikiData SPARQL 查询失败,需要 CONTAINS 才能工作
【发布时间】:2017-11-23 08:13:30
【问题描述】:

当我包含使用 CONTAINS 作为过滤器的行时,下面的查询有效,但如果我只是检查值 (LCASE) 是否等于“唐纳德·特朗普”(它是),则会失败。

使用这条线,它可以工作:

过滤器(包含(LCASE(?idLabel),“唐纳德特朗普”))。

使用这一行,它失败了:

过滤器(LCASE(?idLabel)=“唐纳德特朗普”)。

WORKS 具有 idLabel = "Donald Trump" 的查询的输出

SPARQL 查询:

SELECT DISTINCT ?id ?idLabel ?PV WHERE {

  ?id wdt:P106 ?V0. VALUES ?V0 { wd:Q39631  } . 

  OPTIONAL {
        ?id rdfs:label ?idLabel .
        FILTER(LANG(?idLabel) = 'en') .
  } .

    # Filter on Label

    # WORKS:
    FILTER(CONTAINS(LCASE(?idLabel), "donald trump") ).

    # DOES NOT WORK
    #FILTER(LCASE(?idLabel) = "donald trump") .

    # subselect on instance type
    {
       SELECT ?id WHERE {
         ?id wdt:P31/wdt:P279* ?PV . VALUES(?PV) {(wd:Q5) } .
       }
    }  .
}

Try it here

我的问题是为什么第二个选项不起作用?

(是的,我正在寻找外科医生唐纳德·特朗普,而不是其他人)

【问题讨论】:

    标签: sparql wikidata


    【解决方案1】:

    维基数据中的标签有语言标签,因此标签文字是

    “唐纳德·特朗普”@zh

    LCASE 之后的字符串将是

    “唐纳德·特朗普”@zh

    确实CONTAINS 在这里工作。

    你必须使用STR函数来获取词法形式,即只是

    “唐纳德·特朗普”

    解决方案:

    FILTER(LCASE(STR(?idLabel)) = "donald trump") .

    【讨论】:

    • 你是我的盗版英雄!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多