【发布时间】:2013-08-14 08:12:20
【问题描述】:
我正在尝试使用 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
【问题讨论】:
-
你的代码是什么?问什么?这里还不足以诊断任何东西。你是什么意思“我在该存储库的命名空间选项卡下有前缀“viagem”?这是针对基于 Web 的 SPARQL 界面的吗?可能没有为您在代码中执行的查询定义可用的命名空间。
-
为了它的价值,定义你使用的所有前缀通常是一个好主意,而不是依赖服务器做一些事情来添加它们。定义 aa 应该不难定义一堆前缀的字符串,并在发送之前将其添加到您的查询中。
-
这张票可能是相关的:openvest.com/trac/ticket/34(但我不确定)。有人指出,如果服务器上的预定义命名空间发生更改,则有可能破坏任何进行查询的人的代码,这似乎是一件坏事™,并且应该明确定义查询的前缀。
-
@JoshuaTaylor 感谢您的回复。我添加了更多信息。因此,如果正确理解这是正常行为,对吗?我需要在所有查询中明确添加前缀吗?
-
好吧,我不是 Sesame 用户,所以我不确定 Sesame 不会尝试为您提供一些使用预定义命名空间或类似的方法,但我认为类似于源代码的查询:当然,您可以制作一个编译器,在其中您可以预定义一些自动导入/包含,但是在复制您的环境之前,没有其他人能够编译您的代码,这并不是特别有用。我的建议(这不是对这个问题的明确答案)是始终明确定义您的前缀,以便您的查询绝对没有歧义。
标签: sparql ontology prefix sesame