【问题标题】:Virtuoso Jena provider query alias syntaxVirtuoso Jena 提供程序查询别名语法
【发布时间】:2025-11-24 14:05:01
【问题描述】:

我在 Java 中有以下代码,它使用 Virtuoso Jena 提供程序 API。我想使用别名进行查询。我试着加上括号,但没有任何效果。如果我将相同的查询直接放在端点中,它就可以工作。

    query = "select ?a AS ?count where {?a <uri> ?b.} limit 10";        
    VirtGraph set = new VirtGraph (url, "user", "pass");
    Query sparql = QueryFactory.create(query);
    VirtuosoQueryExecution vqe = VirtuosoQueryExecutionFactory.create(sparql, set);
    vqe.execSelect();

我收到此错误:

  com.hp.hpl.jena.query.QueryParseException:
    Lexical error at line 1, column 13.  Encountered: " " (32), after : "AS"
    at com.hp.hpl.jena.sparql.lang.ParserSPARQL.perform(ParserSPARQL.java:99)

别名的 SPARQL 语法是:(?var AS ?alias)

我应该在查询中使用什么语法才能使其与别名一起使用?

谢谢。

【问题讨论】:

    标签: java alias sparql jena virtuoso


    【解决方案1】:

    SPARQL 语法是 (expr AS ?var),包括 ( )

    query = "select (?a AS ?count) where {?a <a> ?b.} limit 10";      
    

    【讨论】:

    【解决方案2】:

    我看到你也在 OpenLink Software Support Forums 上问过这个问题...(ObDisclaimer:我为 OpenLink Software 工作。)

    我也在那里发布了这个答案。

    您遇到的错误来自 Jena 解析器,而不是来自 Virtuoso 或 Virtuoso Jena Provider。

    首先要更正查询以使用正确的 SPARQL 语法。 Virtuoso 比 Jena 更宽容,但最好符合规范 --

    SELECT  ( ?a AS ?count ) 
     WHERE  { ?a  a  ?b } 
     LIMIT  10
    

    那么你可能想稍微改变一下你的查询,因为我认为你从上面看到的结果不是你想要的——

    SELECT  ( COUNT(?a) AS ?count )
                           ?b 
     WHERE  { ?a  a  ?b } 
     LIMIT  10
    

    如果错误仍然存​​在,我会检查所有相关组件的版本——Jena、Virtuoso Jena Provider、Virtuoso JDBC Driver、Virtuoso。

    然后,假设所有组件都是最新的,并且查询直接针对 Virtuoso,您可能想要 bypass the Jena parser as described in our documentation,并可能报告针对 Jena 的错误。

    【讨论】:

      最近更新 更多