使用SPARQL/Sesame查询RDF



我试图使用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工作台上该存储库的Namespaces选项卡下有前缀"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}";

我不确定是否应该为我将要执行的每个查询添加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查询引擎的。

Update尽管如上所述,Sesame在解析/执行查询时不会从存储库中读取命名空间定义,但它确实允许您在不显式声明的情况下为有限数量的标准词汇表使用前缀名称。这些是"rdf"、"rdfs"、"owl"、"xsd"、"fn"one_answers"芝麻"前缀。如果您在SPARQL查询中使用这些前缀而不声明它们,Sesame的SPARQL引擎会自动将它们替换为这些前缀映射到的标准命名空间(请注意,它不会使用存储库中的命名空间,而是使用预定义的常量)。

尽管如此,作为SPARQL查询的编写者,确保查询完整仍然是一种很好的做法。前缀声明是SPARQL查询不可分割的一部分,没有前缀声明,您的查询在语法上是无效的,因此不可移植。

最新更新