我正在尝试使用 SPARQL 和 Sesame 2.7 查询存储库,但是当我运行代码时出现以下错误
org.openrdf.http.client.SesameHTTPClient - Server reports problem: org.openrdf.query.parser.sparql.ast.VisitorException: QName 'viagem:nome' uses an undefined prefix
问题是,我在 openrdf-workbench 上的该存储库的命名空间选项卡下有前缀“viagem”,当我使用getNamespaces()方法时,它也会显示...
我让查询运行的唯一方法是在每个查询上手动添加 PREFIX,但这听起来是错误的......
关于如何正确使用它,我有什么遗漏吗?
--- 编辑了更多信息
代码不起作用:
String queryString = "SELECT ?name \n" +
"WHERE {?Aeroporto viagem:nome ?name.\n" +
"?Aeroporto rdf:type viagem:Aeroporto}";
TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
List<String> bindingNames = result.getBindingNames();
while (result.hasNext()) {
BindingSet bindingSet = result.next();
Value firstValue = bindingSet.getValue(bindingNames.get(0));
System.out.println(firstValue);
}
} finally {
result.close();
}
...
如果我将 queryString 更改为
String queryString = "PREFIX viagem:<http://teste.com.br/tut/Viagem.owl#> SELECT ?name \n" +
"WHERE {?Aeroporto viagem:nome ?name.\n" +
"?Aeroporto rdf:type viagem:Aeroporto}";
我不确定是否应该为要执行的每个查询添加前缀(如果这是正常行为,那没关系...)
此外,如果我运行以下代码,我会正确获得前缀和名称
RepositoryResult<Namespace> listaNamespace = meuRepositorio.getConnection().getNamespaces();
while(listaNamespace.hasNext()){
Namespace atual = listaNamespace.next();
System.out.println("Name " + atual.getName() + " Prefix " + atual.getPrefix());
}
输出是:
Name http://www.w3.org/2000/01/rdf-schema# Prefix rdfs
Name http://www.w3.org/2003/11/swrl# Prefix swrl
...
Name http://www.w3.org/1999/02/22-rdf-syntax-ns# Prefix rdf
Name http://teste.com.br/tut/Viagem.owl# Prefix viagem