我想链接dbpedia与此代码,他返回我错误的原因…我将代码修改为:
public class linked2{
public static void main(String[] args) {
// TODO Auto-generated method stub
String service = "http://dbpedia.org/snorql";
String queryString =
"SELECT DISTINCT ?concept ?label"+
"WHERE{ "+
"?concept rdf:type skos:Concept."+
"?concept rdfs:label ?label."+
"?label bif:contains 'samsung'."+
"} ORDER BY DESC(?label) LIMIT 20";
Query query = QueryFactory.create(queryString);
// QueryEngineHTTP qexec = QueryExecutionFactory.sparqlservice(service, query);
QueryEngineHTTP qexec = QueryExecutionFactory.createServiceRequest(service, query);
ResultSet results = qexec.execSelect();
for ( ; results.hasNext() ; ) {
QuerySolution soln = results.nextSolution() ;
System.out.println(soln);
// System.out.println(soln.getLiteral("label"));
}
}
at com.hp.hpl.jena.sparql.lang.ParserBase.throwParseException(ParserBase.java:661)
at com.hp.hpl.jena.sparql.lang.ParserBase.resolvePName(ParserBase.java:274)
at com.hp.hpl.jena.sparql.lang.sparql_11.SPARQLParser11.PrefixedName(SPARQLParser11.java:4888)
at com.hp.hpl.jena.sparql.lang.sparql_11.SPARQLParser11.iri(SPARQLParser11.java:4872)
at com.hp.hpl.jena.sparql.lang.sparql_11.SPARQLParser11.PathPrimary(SPARQLParser11.java:2922)
at com.hp.hpl.jena.sparql.lang.sparql_11.SPARQLParser11.PathElt(SPARQLParser11.java:2852)
at com.hp.hpl.jena.sparql.lang.sparql_11.SPARQLParser11.PathEltOrInverse(SPARQLParser11.java:2877)
at com.hp.hpl.jena.sparql.lang.sparql_11.SPARQLParser11.PathSequence(SPARQLParser11.java:2830)
声明前缀
你的查询应该是
SELECT DISTINCT ?concept ?label WHERE {
?concept rdf:type skos:Concept.
?concept rdfs:label ?label.
?label bif:contains 'samsung'.
}
ORDER BY DESC(?label)
LIMIT 20
如果将其放入sparql.org的查询验证器中,您将立即看到:
语法错误:
第2行,第12列:未解析的前缀名称:rdf:type
您可能已经猜到这是一个基于堆栈跟踪中的resolvePName
的前缀名称的问题。无论如何,您需要添加
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
和您使用的其他前缀(rdf:
和bif:
)类似。
更多问题
在您整理了前缀之后,您将在查询中发现另一个令人讨厌的错误,这个错误已经在DBpedia Jena query返回null中描述过。你真的应该在查询代码中使用换行符,例如
"select * where {n" +
" ...n"
因为现在,你有
"SELECT DISTINCT ?concept ?label"+
"WHERE{ "+
变成
SELECT DISTINCT ?concept ?labelWHERE {
因为SPARQL查询中的where
是可选的,所以您不会得到语法错误,但是您的查询中没有一个名为?labelWHERE
的变量,因此您总是会得到误导性的结果(解决方案不包含变量?label
,只有?labelWHERE
)。