2015-10-18 77 views
0

我試圖從dbpedia獲取總數與sparql查詢,但我不能。 我的代碼是如何使用SPARQL從Dbpedia獲取總體

library(SPARQL) 
endpoint <- 'http://live.dbpedia.org/sparql' 
options <- NULL 
prefix <- c("db","http://dbpedia.org/resource/") 

sparql_prefix <- "PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dc: <http://purl.org/dc/terms/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
" 

q <- paste(sparql_prefix, 
      'SELECT ?actor ?movie ?gross 
      WHERE { 
      ?m dc:subject <http://dbpedia.org/resource/Category:American_films> . 
      ?m rdfs:label ?movie . 
      FILTER(LANG(?movie) = "en") 

      ?m dbo:gross ?a . 
      ?a rdfs:label ?gross . 
      FILTER(DATATYPE(?gross) = xsd:double) 

      ?m dbp:starring ?a . 
      ?a rdfs:label ?actor . 
      FILTER(LANG(?actor) = "en") 

      }') 

results <- SPARQL(endpoint,q,ns=prefix,extra=options)$results 

但返回一個空data.frame

你有什麼想法如何讓毛?

+0

http://dbpedia.org/resource/Category:American_films此刻給出了以下消息:「您目前試圖訪問的網站目前正在維護中。 對此造成的任何不便,我們深表歉意。 – HywelMJ

+1

langMatches(lang(?foo),「en」)通常應該比lang(?foo)=「en」更受歡迎。前者將獲得地區性變體,如「en-US」,而後者則不會。雖然這通常不是一個大問題,但電影名稱實際上可能只是一個地方,因爲電影可能會在不同名稱的不同地方發佈。 –

回答

3
  1. dbo:gross的值不是一個節點,對它使用rdfs:label沒有意義。相反,它直接是一種價值。
  2. dbo:gross的類型不是xsd:double,它通常是<http://dbpedia.org/datatype/usDollar>,但某些電影使用其他貨幣。

因此,固定的查詢可能類似於:

SELECT ?actor ?movie ?gross 
WHERE { 
    ?m dc:subject <http://dbpedia.org/resource/Category:American_films> . 
    ?m rdfs:label ?movie . 
    FILTER(LANG(?movie) = "en") 

    ?m dbo:gross ?gross . 

    ?m dbp:starring ?a . 
    ?a rdfs:label ?actor . 
    FILTER(LANG(?actor) = "en") 
} 

請記住,這個查詢只能有一兩個和dbo:gross至少一個dbp:starring列表電影。如果這不是您想要的,請考慮使用OPTIONAL

+1

我注意到你在代碼塊上使用了「language:none」。我發現「語言:sql」實際上對於SPARQL非常有效:正確的關鍵字通常會突出顯示,字符串和數字會按照您的預期進行處理。 –