2016-12-29 68 views
2

對不起,如果我的英語不好,但我真的沒有任何地方可以用我的母語問這個問題。 我一直在試圖創建SPARQL查詢維基數據應該創建於1925至1950年幾年創建的所有恐怖小說,作者姓名列表,如果可用,圖片:維基數據查詢重複

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" . 
} 
} 

然而,這個查詢將重複項放置在列表中的某些原因。 DISTINCT並沒有太大的作用。過了一段時間,我發現原因是「?rdfs:label?name。」。如果刪除此行,則不會列出重複項。但我需要這一行來顯示列表中的作者姓名! 關於如何解決這個問題的任何想法?

回答

1

您不需要使用?item rdfs:label ?name .,因爲您已將物品標籤作爲?itemLabel感謝SERVICE wikibase:label

然後,您將得到具有可能具有多個值的SELECT ed屬性的每個項目的重複結果:在這裏,您是SELECT ing作者(P50),它將爲包含多個作者的每個項目創建重複項。

+0

嗯,哦,我的錯誤。這行應該是'?rdfs:label?name'。如果沒有,我不會得到作者的名字,我只能得到一個鏈接。 我該怎麼做才能使它正常工作? – Dusk

+0

那麼你應該只需要'SELECT?authorLabel',我想 – maxlath

+0

它工作!這麼簡單,但我不認爲我會自己想出來。非常感謝你! – Dusk

1

查詢實際上給你不同的項目。問題是有些項目有多個rdfs:標籤。你可以看到這個項目的例子:

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

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

而且由於有一些項目有多個rdfs:標籤謂詞,它們出現在單獨的行中。

+0

所以,我想,有沒有辦法讓這個查詢正常工作? – Dusk

+0

如果有多個標籤,則會返回多行 - 這就是SPARQL的語義定義方式。你可以i)限制標籤的數量或ii)使用'GROUP_CONCAT'將所有標籤合併成一個值。 – AKSW

+0

我試過'{select * where {?author rdfs:label?name。} LIMIT 1}'而不是行'?rdfs:label?name',但它似乎不起作用(返回沒有結果);不知道爲什麼。 –

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