针对dcterms的针对葡萄牙语dbpedia端点的SPARQL查询:subject不返回任何结果

时间:2014-04-28 18:36:49

标签: java sparql jena dbpedia dublin-core

我测试了那个查询:

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;
      }

有什么不对吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

dcterms:前缀有拼写错误

dcterms:前缀不正确(最后有subject)。它应该是

http://purl.org/dc/terms/

使用ParameterizedSparqlStrings来避免注入问题

此外,将uri参数拼接到查询中的方式有​​点脆弱,并且受到注入攻击。例如,如果uri是以下字符串会发生什么?

> <>* <> . <http://example.org/secretData> ?anyProperty ?comment . #

您泄露了有关http://example.org/secretData的信息,因为<> <>* <>将始终匹配,然后您将?comment绑定到http://example.org/secretData的任何属性的所有值。有一个如何在this answerget latitude and longitude of a place dbpedia中执行此操作的示例。