2015-10-18 108 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非常有效:正确的关键字通常会突出显示,字符串和数字会按照您的预期进行处理。 –