2017-11-23 12 views
0

아래의 쿼리는 필터에 CONTAINS를 사용하지만 LCASE 값이 "donald trump"와 같은지 확인하는 경우 실패합니다).WikiData SPARQL 쿼리가 실패하고 CONTAINS가 작동해야합니다.

사용이 줄을, 그리고 그것을 작동합니다

필터 (? (LCASE (idLabel)를 포함, "도널드 트럼프")).

사용이 줄을, 그리고 실패

필터 (LCASE (idLabel) = "도널드 트럼프?").

가 작동하는 쿼리의 출력 idLabel = "도널드 트럼프"

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

두 번째 옵션이 작동하지 않습니다 왜 내 질문은?

(그리고 그래, 나는 외과 의사 도널드 트럼프가 아닌 다른 사람을 찾고 있어요)

답변

1

위키 데이터의 레이블을 언어 태그, 따라서 문자 레이블이

"부동산 재벌 도널드 트럼프"입니다 있습니다 @

와 엉 LCASE 후 문자열은 실제로

CONTAINS 법과 @en

"도널드 트럼프"입니다 여기에 ks.

당신은 어휘 양식을 얻을 수 STR 기능을 사용할 필요가

, 즉 단지

"부동산 재벌 도널드 트럼프"

솔루션 :

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

+0

당신은 내 프리 킹의 영웅! – Andy