2017-02-21 10 views
3

SPARQL 및 wikidata로 2 일 동안 노력하고 모든 예제를 살펴 보았습니다. 내 요구에 가까운 예제를 찾지 못한 복잡한 쿼리를 찾는 데 도움이 필요합니다.wikidata에서 부분 검색을 통해 모든 스포츠를 가져 오는 방법, 첫 번째 이미지 및 언어 검색

아이디어는 스포츠를 검색하여 첫 번째 이미지 (있는 경우)를 얻는 것입니다. 모든 언어의 레이블을 검색 할 수 있습니다. 아래에서 나는 작은 부분을 달성했지만 여기에 문제가 있습니다. 이 쿼리

  1. , 나는 농구가 아니라 축구를 얻을 수있어, 나는 내가 그것을 제대로 작동했던 생각을 footbal 스포츠의 유형의 서브 클래스로 서브 클래스로 검색을하는 방법을 알아낼 수는 없지만 그것은 축구를 반환하지 않습니다.

  2. 이미지를 가져 오려면 (옵션으로 시도한) 추가 할 때 복싱에 2 개의 이미지가 있기 때문에 "bodybuilding"을 2 행으로 반환합니다. 첫 번째 이미지 만있는 첫 번째 행 만 가져 오는 방법이 있습니까? 나는 뚜렷한 시도를하고 멀리 가지 않았다.

  3. 이 경우 영어로 검색하지만 모든 언어로 된 라벨을 받고 싶습니다.

각 행은 1 개 스포츠는 모든 언어에서 "보", 첫 번째 이미지 및 레이블로 시작하는 것 10 행 것이 중 완벽한 결과는, 나는 키가 큰 순서 어쩌면 언어가 될 수 있음을 이해 다른 쿼리에서 요청해야하며 그렇다면 어떻게해야합니까?

#NOT WORKING AS EXPECTED/Need Help 
SELECT DISTINCT ?item ?label WHERE {   
    ?item wdt:P31/wdt:P279* wd:Q31629.  
    ?item rdfs:label ?label.   
FILTER((LANG(?label)) = "en")   
FILTER(STRSTARTS(lcase(?label), lcase("bo")))  
}   
LIMIT 10 
+0

당신은 스포츠 또는 특정 이벤트의 유형을 찾고 계십니까? 현재 검색어에서 모든 유형의 스포츠 (예 : 스포츠)의 인스턴스를 찾고 있기 때문에 묻습니다. 스포츠 마라톤에서'Boston Marathon'을 반환합니다 – AKSW

+0

스포츠 (농구, 축구 등)를 찾고 있어요. 기본적으로 사용자는 자신이 좋아하는 스포츠를 알려주고 데이터베이스가 완성 될 때까지 wikidata에서 제안을 찾아야합니다. 기본적으로 자동 완성 –

답변

3

SAMPLE을 사용하면 스포츠별로 사진을 하나씩 얻을 수 있습니다. 모든 레이블이 필요하지만 각 언어를 별도로 정의하지 않고 스포츠 당 행이 하나만 있어야하는 경우 GROUP_CONCAT을 사용하여 레이블을 연결할 수 있습니다. 여러 값을 변수에 바인딩하려면 VALUES을 사용할 수 있습니다.

SELECT DISTINCT ?item (SAMPLE(?img) AS ?image) (GROUP_CONCAT(DISTINCT ?lbl; separator=', ') AS ?label) WHERE { 
    # Bind variable ?type to the types you want 
    VALUES ?type { wd:Q31629 wd:Q7128792 } 
    ?item wdt:P31 ?type . 
    # Search only English labels 
    ?item rdfs:label ?search_label . 
    FILTER(LANG(?search_label) = "en") 
    FILTER(STRSTARTS(lcase(?search_label), lcase("bo"))) 
    # Get all labels 
    ?item rdfs:label ?l . 
    # Produces strings like "bodybuilding (en)" 
    BIND(CONCAT(STR(?l), ' (', LANG(?l), ')') AS ?lbl) 
    # Get the images 
    OPTIONAL { 
     ?item wdt:P18 ?img . 
    } 
} 
GROUP BY ?item 
LIMIT 10 

Link to the above query in the Wikidata Query Service

+0

감사합니다 @evsheino, 이것은 내가 시작한 곳보다 훨씬 낫습니다. 2 문제지만, 첫 번째, 권투는이 목록에 다시 오지 않습니다. 또한 모든 언어로 된 레이블을 얻고 싶지만 여전히 하나를 검색하고 싶습니다. 그게 가능하니? –

+0

영어 레이블 만 검색하고 스포츠 유형 만 가져 오도록 쿼리를 업데이트했습니다. 권투는 Wikidata에서 "boxe"라고 불리는 것 같습니다. – evsheino

+0

그건 좋은거야 @evsheino. 이 쿼리가 여러 instanceOfs를 해결하는 방식으로 동작하도록 만들 수 있습니다. 예를 들어 instanceOf sport (Q31629) OR 전투 스포츠 (Q7128792) OR .. 등등을 말할 수 있습니까? 이렇게하면 주요 instanceOf를 나열하여 대다수를 다룰 수 있습니다. –