2017-05-16 5 views
0

검색하는 두 개의 쿼리를 결합하는 방법 :SPARQL 위키 데이터 - 내가 예에서 설명하는 문제 다음 한 객체 정보

내가 삼중Germany - capital - object에서 객체Berlin를 검색 할를. 사람들은 내 프로그램에 입력이 때문에

나는 , 라벨를 사용해야합니다.

prefix wdt: <http://www.wikidata.org/prop/direct/> 
prefix wikibase: <http://wikiba.se/ontology#> 
prefix bd: <http://www.bigdata.com/rdf#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT DISTINCT ?objectLabel WHERE { 
    ?subject wdt:P36 ?object . 
    ?subject rdfs:label "Germany"@en . 
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
} 

:GermanyURIP36 (capital)가 원하는 정보 Berlin 나를 다시주는 레이블 쿼리에 따라

prefix wdt: <http://www.wikidata.org/prop/direct/> 
prefix wikibase: <http://wikiba.se/ontology#> 
prefix bd: <http://www.bigdata.com/rdf#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT DISTINCT ?propertyLabel WHERE { 
    ?property a wikibase:Property . 
    ?property rdfs:label "capital"@en 
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
} 

:

다음 쿼리는 propertyLabelcapital 날 다시 제공 하지만을 사용하고 싶습니다.은 레이블입니다. 나는 두 가지 선택 또는 연합으로 다양한 방법을 시도했지만 수천 개의 결과를 얻었거나 전혀 얻지 못했습니다. (이 작동하지 않지만) 쿼리는 다음과 같아야합니다

prefix wdt: <http://www.wikidata.org/prop/direct/> 
prefix wikibase: <http://wikiba.se/ontology#> 
prefix bd: <http://www.bigdata.com/rdf#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT DISTINCT ?objectLabel WHERE { 
    ?subject ?property ?object . 
    ?subject rdfs:label "Germany"@en . 
    ?property a wikibase:Property . 
    ?property rdfs:label "capital"@en 
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
} 

이미 위에서 언급 한 쿼리는 다른 Berlin 아무것도 돌아 오지 있습니다. 미리 감사드립니다.

+0

"capital"레이블에 대한 속성 검색은'wd : P36'을 반환하지만 인스턴스 데이터는'wdt : P36'을 사용합니다. – AKSW

답변

0

문제는 "자본"레이블에 대한 속성 조회가 http://www.wikidata.org/entity/P36을 반환하지만 인스턴스 데이터는 http://www.wikidata.org/prop/direct/P36을 사용한다는 것입니다. 문제 해결 방법은 다음과 같습니다 :

PREFIX wdt: <http://www.wikidata.org/prop/direct/> 
PREFIX wikibase: <http://wikiba.se/ontology#> 
PREFIX wd: <http://www.wikidata.org/entity/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT DISTINCT ?objectLabel WHERE { 
    ?subject ?property ?object ; 
      rdfs:label "Germany"@en . 
    ?p a wikibase:Property ; 
    rdfs:label "capital"@en 
    BIND(STRAFTER(STR(?p), STR(wd:)) as ?p_localname) 
    BIND(IRI(CONCAT(STR(wdt:), ?p_localname)) as ?property) 
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
} 
+0

부적절한 해결 방법이지만 작동하는 한 ... 문자열을 쉽게 조작 할 수 있는지 몰랐습니다. 빠른 답변 주셔서 감사합니다. 편집 : Apache Jena에서 SPARQL의 구문 규칙이보다 엄격하므로 BIND 문을 쿼리에 추가로 배치해야합니다. 오류 메시지는 더 이상 기본 그래프 패턴을 통해 변수를 바인드 한 다음 BIND에서 사용할 수 없다고 설명합니다. – becorn