2013-01-18 89 views
1

我试图从DBpedia查询城市,州和国家的摘要,并且混合结果。它似乎与城市和国家,但与国家没有关系。查询城市/州/国家/地区英文摘要

SELECT * WHERE { 
    ?x rdfs:label "France"@en. 
    ?x dbpedia-owl:abstract ?abstract. 
    FILTER (LANG(?abstract) = 'en') 
} 

或者

SELECT * WHERE { 
    ?x rdfs:label "Boston"@en. 
    ?x dbpedia-owl:abstract ?abstract. 
    FILTER (LANG(?abstract) = 'en') 
} 

然而,这些查询没有找到任何结果:

SELECT * WHERE { 
    ?x rdfs:label "Sao Paulo"@en. 
    ?x dbpedia-owl:abstract ?abstract. 
    FILTER (LANG(?abstract) = 'en') 
} 

SELECT * WHERE { 
    ?x rdfs:label "Massachusetts"@en. 
    ?x dbpedia-owl:abstract ?abstract. 
    FILTER (LANG(?abstract) = 'en') 
} 

首先,我怎么可以过滤搜索,只城市,州或国家?其次,我如何能在法国找到像马萨诸塞州或罗纳那样的州?

回答

2

SPARQL查询(不包括OPTIONAL)仅返回所有三元模式可以匹配的结果。 ?为了您的查询不返回结果,这意味着关于资源下列语句中的一个或多个X不可用:

  • 有一个rdfs:label“圣保罗”
  • 标签“圣保罗”是语言标记英语
  • 有一个rdfs:abstract
  • 抽象为语言标记的英语

在这个例子中,你可能想找到<http://dbpedia.org/resource/Sao_Paulo> 。此资源的标签不是“圣保罗”,而是“圣保罗”。

第二个查询适用于我(马萨诸塞州),但需要一些时间才能完成。

要将结果限制为特定类型的资源(如城市,州或国家),您需要指定类型。在RDF中,使用rdf:type指定资源类型(或者说“类”)。您可以查询,在以同样的方式:

SELECT * WHERE { 
    ?x rdfs:label "São Paulo"@en. 
    ?x rdf:type dbpedia-owl:Settlement. 
    ?x dbpedia-owl:abstract ?abstract. 
    FILTER (LANGMATCHES(LANG(?abstract), 'en')) 
} 

相反的rdf:type可以使用速记a,你可以读作“?X Y'”。
而且,LANGMATCHES(LANG(?abstract), 'en')可能比LANG(?abstract) = 'en')更有效。

请注意,此资源dbpedia:São_Paulo不是DBpedia中的dbpedia-owl:City,因为它是维基百科上的一个自治市:http://en.wikipedia.org/wiki/S%C3%A3o_Paulo。同样,dbpedia:Massachusetts未被定义为一个状态。不过,两者都是dbpedia-owl:PopulatedPlace