我测试了那个查询:
SELECT ?comment WHERE {<http://pt.dbpedia.org/resource/Portugal> dcterms:subject ?comment}
在http://pt.dbpedia.org/sparql,我得到了正确的结果:
http://pt.dbpedia.org/resource/Categoria:Portugal
但是我正在使用Jena,当我尝试用Jena进行查询时,我得不到任何结果。 这就是我用Jena进行查询的方式:
private String getComment(String uri) {
RDFNode node;
String comment = "";
final String QUERY =
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
"PREFIX dcterms: <http://purl.org/dc/terms/subject>\n" +
"SELECT ?comment WHERE {" +
"<" + uri + "> dcterms:subject ?comment." +
"}";
final String ENDPOINT = "http://pt.dbpedia.org/sparql";
final ResultSet rs = QueryExecutionFactory.sparqlService( ENDPOINT, QUERY ).execSelect();
while( rs.hasNext() ) {
QuerySolution querySolution = rs.next();
node = querySolution.get("comment");
comment = node.toString();
}
return comment;
}
有什么不对吗? 谢谢!
答案 0 :(得分:2)
dcterms:
前缀有拼写错误 dcterms:
前缀不正确(最后有subject
)。它应该是
http://purl.org/dc/terms/
此外,将uri
参数拼接到查询中的方式有点脆弱,并且受到注入攻击。例如,如果uri
是以下字符串会发生什么?
> <>* <> . <http://example.org/secretData> ?anyProperty ?comment . #
您泄露了有关http://example.org/secretData
的信息,因为<> <>* <>
将始终匹配,然后您将?comment
绑定到http://example.org/secretData
的任何属性的所有值。有一个如何在this answer到get latitude and longitude of a place dbpedia中执行此操作的示例。