2016-12-29 2 views
2

죄송합니다. 영어가 좋지 않지만, 모국어로이 질문을 할 수있는 곳이 없습니다. 를 들어,Wikidata 쿼리 중복

SELECT DISTINCT ?item ?itemLabel ?author ?name ?creation ?picture 
WHERE 
{ 
    ?item wdt:P136 wd:Q193606 . # book 
    ?item wdt:P50 ?author . # author 
    ?item wdt:P577 ?creation . 
    ?item wdt:P577 ?end . 
    ?author rdfs:label ?name .  
    OPTIONAL{ ?item wdt:P18 ?picture } 
    FILTER (?creation >= "1925-01-01T00:00:00Z"^^xsd:dateTime) . 
    FILTER (?end <= "1950-12-31T23:59:59Z"^^xsd:dateTime) . 

SERVICE wikibase:label 
{ 
bd:serviceParam wikibase:language "en" . 
} 
} 

그러나 : 가능한 경우 나는 사진, 1,925-1,950년에서 만든 모든 공포 소설, 저자의 이름 목록을 작성해야 위키 데이터에 대한 SPARQL 쿼리를 만들려고하고 있었어요 어떤 이유로이 쿼리가 목록에 중복을 배치합니다. DISTINCT는별로하지 않습니다. 잠시 후 그 이유는 "? item rdfs : label? name."입니다. 이 줄이 제거되면 중복 된 항목이 나열되지 않습니다. 하지만 목록에 저자명을 표시하려면이 줄이 필요합니다! 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

답변

1

이미 SERVICE wikibase:label에 감사 표시된 ?itemLabel으로 품목 레이블을 얻으 셨으므로 ?item rdfs:label ?name .을 사용할 필요가 없습니다.

그렇다면, 당신은 아마도 여러 값을 가진 SELECT 에드 속성이 모든 항목에 대한 중복 결과를 얻을 것이다 : 여기, 당신은 여러 저자와 함께 모든 항목에 대한 중복을 생성합니다 SELECT 보내고 저자 (P50)이다.

+0

어 - 오, 내 실수. 이 줄은'? author rdfs : label? name .'이어야합니다. 저자의 이름이 없어도 그냥 링크 만 있습니다. 제대로 작동하려면 어떻게해야합니까? – Dusk

+0

그러면 'SELECT? authorLabel'도 필요합니다. – maxlath

+0

이 작동했습니다. 너무 단순하지만 아직 혼자 생각하지 못했을 것입니다. 고마워요! – Dusk

1

쿼리는 실제로 별개의 항목을 제공합니다. 문제는 일부 항목에 여러 개의 rdfs : 레이블이 있다는 것입니다. 여러 RDFS 있기 때문에

SELECT * 
WHERE 
{ 
    wd:Q2882840 rdfs:label ?label 

SERVICE wikibase:label 
{ 
bd:serviceParam wikibase:language "en" . 
} 
} 

그리고

이 : 일부 항목에 대한 레이블 술어를, 그들은 별도의 행에 표시되어 당신은 예를 들어 항목을 볼 수 있습니다.

+0

그래서이 쿼리를 제대로 작동시키는 방법은 없습니다. – Dusk

+0

여러 개의 레이블이있는 경우 여러 행이 반환됩니다. SPARQL의 의미가 정의되는 방식입니다. i) 레이블 수를 제한하거나 ii) 모든 레이블을 단일 값으로 결합하는 데 'GROUP_CONCAT'을 사용할 수 있습니다. – AKSW

+0

'? author rdfs : label? name' 줄 대신'{select * rdfs : label? name.} LIMIT 1}'을 시도했지만 작동하지 않는 것 같습니다 (아무런 결과도 반환하지 않습니다); 왜 그런지 모르겠다. –

0

당신은

키워드로

그룹을 사용하여 책 제목 (항목의 레이블)에 따라 결과를 집계 할 수 있습니다. 따라서 모든 결과는 한 번 표시되는 그룹이되고 다른 값을 가진 다른 필드는 구분 기호 (이 경우 쉼표)를 사용하여 집계됩니다.

고정 쿼리

SELECT DISTINCT ?item ?itemLabel 
(group_concat(distinct ?author;separator=",") as ?author) 
(group_concat(distinct ?name;separator=",") as ?name) 
(group_concat(distinct ?creation;separator=",") as ?creation) 
(group_concat(distinct ?picture;separator=",") as ?picture) 
WHERE 
{ 
    ?item wdt:P136 wd:Q193606 . # book 
    ?item wdt:P50 ?author . # author 
    ?item wdt:P577 ?creation . 
    ?item wdt:P577 ?end . 
    ?author rdfs:label ?name .  
    OPTIONAL{ ?item wdt:P18 ?picture } 
    FILTER (?creation >= "1925-01-01T00:00:00Z"^^xsd:dateTime) . 
    FILTER (?end <= "1950-12-31T23:59:59Z"^^xsd:dateTime) . 

SERVICE wikibase:label 
{ 
bd:serviceParam wikibase:language "en" . 
} 
} 
group by ?item ?itemLabel