我正在努力使这个非常有趣的查询指向DBpedia.org 我是Java新手,这个SPARQL是我朝这个方向迈出的第一步。
我已经想出了类似这样的代码。它从我可以找到googleing的内容进行了修改; 从源代码我可以从单个查询中获取摘要。现在,我希望获得您在查询字符串中可以看到的所有属性,以及更多内容。
有人可以帮我解决这个问题吗?我被卡住了。谢谢!
String service = "PREFIX rdfs: http://dbpedia.org/page/Texas_Longhorn";
String query = "SELECT * WHERE {"
+ " rdfs:name ?name ;"
+ " rdfs:label ?label ;"
+ " rdfs:abstract ?abstract ."
+ "}";
QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);
try {
ResultSet results = qe.execSelect();
for (; results.hasNext();) {
QuerySolution sol = (QuerySolution) results.next();
System.out.println(sol.get("?name"));
System.out.println(sol.get("?label"));
System.out.println(sol.get("?abstract"));
}
}catch(Exception e){
e.printStackTrace();
}
finally {
qe.close();
}
答案 0 :(得分:3)
您的SPARQL查询完全错误。当你有SPARQL时,你会寻找三元组,如果你看第一行,你只能看到两个元素。然后,在dbpedia中没有rdfs:name
和rdfs:abstract
这样的东西。 rdfs
是预定义的命名空间,您最好保留它以帮助您处理标签。您有dbpedia-owl:abstract
和foaf:name
。所以你的查询必须是:
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE {
?x foaf:name ?name ;
rdfs:label ?label ;
dbpedia-owl:abstract ?abstract .
}
但是,在这种情况下,?name
和?label
会产生相同的变量。所以我会将您的查询编辑为:
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE {
?x rdfs:label ?label ;
dbpedia-owl:abstract ?abstract .
}
答案 1 :(得分:3)
除了进行@Artemis建议的更改外,您还需要将Theta(n^2)
字符串更改为dbpedia的端点:
service
QueryExecutionFactory.sparqlService
接受表示SPARQL端点(服务)的String参数,以及定义为Jena Query或String的查询。