【问题标题】:Query RDF using SPARQL / Sesame使用 SPARQL / Sesame 查询 RDF
【发布时间】: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


【解决方案1】:

尽管 Sesame 将命名空间声明存储在存储库中,但没有适当的机制将这些命名空间自动添加到 SPARQL 查询中。作为用户,您有责任确保 SPARQL 查询正确且完整。

不过,Workbench 应用程序有一个高级 SPARQL 编辑器,它支持自动完成功能,当您使用前缀时,它会自动添加命名空间声明。因此,您在使用 Workbench 时不必手动输入它们。请注意,这只是客户端应用程序的便利,不是实际的 SPARQL 查询引擎。

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

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

【讨论】:

  • 你说它不会自动执行。有没有办法让它取代它们?如果不能直接使用命名空间有什么用?
  • @FreakyDan 在 Java 中很好,您只需从存储中读取命名空间,迭代它们并在执行之前将它们添加到您的查询字符串中。但是拥有命名空间的目的不是让您编写不完整的查询。在将存储内容写入文件时(例如,在海龟语法中),它们主要是为了允许它们在序列化中使用——当然也可以作为开发人员查询和重用。 FWIW:最新版本的 Workbench 工具具有高级 SPARQL 编辑器,具有自动完成功能,可自动为您添加命名空间声明。
  • 另外,我关于 Sesame 没有做任何事情来自动添加命名空间的说法并不是 100% 正确的。我会更新我的答案。
  • 在您的更新中,您提到了一些预定义的前缀。这就是全部吗?如果不是,我在哪里可以找到完整的列表?
  • @FreakyDan 这是完整列表。这是一个未记录的功能,您可以看到列表的唯一位置是代码库本身(嗯,现在我猜是这个 SO 答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多