[英]Query RDF using SPARQL / Sesame
我正在尝试使用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
it shows up... 问题是,我在openrdf-workbench上的存储库的Namespaces选项卡下有前缀“viagem”,当我使用方法它显示了...
我运行查询的唯一方法是在每个查询上手动添加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}";
我不确定是否应该为我要执行的每个查询添加PREFIX(如果这是正常的行为就可以了......)
此外,如果我运行以下代码,我会正确获得前缀和名称
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
虽然Sesame在存储库中存储名称空间声明,但是没有机制将这些名称空间自动添加到SPARQL查询中。 作为用户,您需要确保SPARQL查询正确且完整。
但是,Workbench应用程序具有一个带有自动完成支持的高级SPARQL编辑器,当您使用前缀时,它会自动添加命名空间声明。 因此,在使用Workbench时,您不必手动输入它们。 请注意,这只是客户端应用程序的便利, 而不是实际的SPARQL查询引擎。
更新虽然如上所述,在解析/执行查询时,Sesame不会从您的存储库中读取命名空间定义,但它确实允许您为有限数量的标准词汇表使用带前缀的名称而不明确声明它们。 这些是'rdf','rdfs','owl','xsd','fn'和'芝麻'前缀。 如果您使用的这些在SPARQL查询没有声明,芝麻的SPARQL引擎自动标准命名空间代替他们到那些前缀映射(请注意,它不会在你的仓库用于这种用途的命名空间,它使用预定义的常量)。
但是,尽管如此,作为SPARQL查询的编写者仍然可以确保您的查询完整。 前缀声明是SPARQL查询不可或缺的一部分,如果没有它们,您的查询在语法上无效,因此不可移植。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.