我正在使用Jena编写SPARQL
查询以从作为方法参数接收的URI中获取rdfs:label
属性。该方法仅接收以下URI:http://pt.dbpedia.org/..
它应该返回rdfs:label
,但它不会返回任何内容。我检查了它并没有输入while block
应该迭代结果。我甚至使用URI <http://pt.dbpedia.org/resource/Brasil>
进行了测试,但它没有用。
可能是什么问题?
public String getLabel(String uri, String label) {
Model model = ModelFactory.createDefaultModel().read( uri );
RDFNode node;
String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " +
"PREFIX owl: <http://www.w3.org/2002/07/owl#>" +
"SELECT distinct ?label WHERE { " +
"?resource owl:sameAs <" + uri + "> ;" +
"rdfs:label ?label ." +
"filter( langMatches(lang(?label),'pt')) }";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet r = qe.execSelect();
while( r.hasNext() ) {
QuerySolution querySolution = r.next();
node = querySolution.get("label");
label = node.toString();
}
return label;
}
SPARQL
查询就是这样:
SELECT distinct ?label WHERE {
?brasil owl:sameAs <http://pt.dbpedia.org/resource/Brasil> ;
rdfs:label ?label .
filter( langMatches(lang(?label),"pt") )
}
谢谢!
答案 0 :(得分:1)
我知道这是您之前提问Should queries with URIs like http://pt.dbpedia.org/resource/.. be different from the ones with URIs like http://dbpedia.org/resource/..?的延续。如果你收到了查询:
SELECT distinct ?label WHERE {
?brasil owl:sameAs <http://pt.dbpedia.org/resource/Brasil> ;
rdfs:label ?label .
filter( langMatches(lang(?label),"pt") )
}
然后您的uri
必须是http://pt.dbpedia.org/resource/Brasil
,因此您可能(尝试)使用
Model model = ModelFactory.createDefaultModel().read( uri );
然后您尝试针对已下载的本地数据运行SPARQL查询。正如我在上一个(链接)问题中提到的那样,我提供的查询意味着跨越SPARQL端点运行;它们不是基于下载数据和本地查询。
尝试在本地下载数据不起作用,因为以下程序及其输出显示:
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
public class BrasilExample {
public static void main(String[] args) {
final Model model = ModelFactory.createDefaultModel().read( "http://pt.dbpedia.org/resource/Brasil" );
model.write( System.out );
}
}
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" >
</rdf:RDF>
如果您想下载一些数据并对其进行查询,请注意
后一页的底部有链接以下载数据,例如
如果您要下载该文件,那么您的查询可能会有效(但当然uri
将不再相同)。
您在我之前的回答中使用的查询是为主DBpedia端点设计的,而不是葡萄牙端点。您可以通过转到http://dbpedia.org/resource/Brazil并按照上述相同的重定向和下载链接从主DBpedia下载Brasil的数据,但更好的选择是对主DBpedia端点实际运行查询,http://dbpedia.org/sparql,如下面的代码及其结果所示。
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
public class BrasilExample {
public static void main(String[] args) {
final String QUERY =
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
"PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" +
"\n" +
"SELECT distinct ?label WHERE {\n" +
" ?brasil owl:sameAs <http://pt.dbpedia.org/resource/Brasil> ;\n" +
" rdfs:label ?label .\n" +
" filter( langMatches(lang(?label),\"pt\") )\n" +
"}";
final String ENDPOINT = "http://dbpedia.org/sparql";
final ResultSet rs = QueryExecutionFactory.sparqlService( ENDPOINT, QUERY ).execSelect();
ResultSetFormatter.out( rs );
}
}
---------------
| label |
===============
| "Brasil"@pt |
| "Brazil"@pt |
---------------