gpt4 book ai didi

sparql - 使用 SPARQL/Sesame 查询 RDF

转载 作者:行者123 更新时间:2023-12-04 20:10:25 24 4
gpt4 key购买 nike

我正在尝试使用 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 上该存储库的 Namespaces 选项卡下有前缀“viagem”,当我使用 getNamespaces() 方法时,它也会显示...

我让查询运行的唯一方法是在每个查询上手动添加前缀,但这听起来不对......

关于如何正确使用它,我有什么遗漏吗?

--- 编辑了更多信息

代码不起作用:
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 在解析/执行查询时不会从您的存储库中读取 namespace 定义,但它确实允许您对有限数量的标准词汇表使用前缀名称,而无需明确声明它们。它们是“rdf”、“rdfs”、“owl”、“xsd”、“fn”和“芝麻”前缀。如果您在 SPARQL 查询中使用它们而不声明它们,Sesame 的 SPARQL 引擎会自动将它们替换为这些前缀映射到的标准 namespace (请注意,它不会为此使用存储库中的 namespace ,它使用预定义的常量)。

然而,话虽如此,作为 SPARQL 查询的编写者,确保您的查询是完整的仍然是一个很好的做法。前缀声明是 SPARQL 查询的组成部分,没有它们,您的查询在语法上根本无效,因此不可移植。

关于sparql - 使用 SPARQL/Sesame 查询 RDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18196771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com