首页 文章

如何在Jena上使用bif:regexp_match进行SPARQL查询

提问于
浏览
1

我在Virtuoso上有以下SPARQL查询:

PREFIX wd: <http://www.wikidata.org/entity/>
SELECT DISTINCT ?p, ?title WHERE {
   ?p a ?c.
   ?c rdfs:subClassOf* wd:Q2431196.
   ?p rdfs:label ?title .
   FILTER (bif:regexp_match("^Vamp( [(].*[)])?$", ?title))
}

this SPARQL endpoint,它工作正常 . 它按预期返回电视节目Vamp和Vamp(telenovela) .

现在我正在尝试使用Jena API在Java上做同样的事情,它失败如下 .

线程“main”中的异常com.hp.hpl.jena.query.QueryParseException:第10行,第204列:未解析的前缀名称:bif:regexp_match

我找到了一个摆脱Jena异常的解决方案,正如 bif:contains 所建议的那样 . 查询将如下:

PREFIX wd: <http://www.wikidata.org/entity/>
SELECT DISTINCT ?p, ?title WHERE {
   ?p a ?c.
   ?c rdfs:subClassOf* wd:Q2431196.
   ?p rdfs:label ?title .
   ?title <bif:regexp_match> "^Vamp( [(].*[)])?$"
}

但是,该查询不会像先前的查询那样返回任何元素 . 它不会返回SPARQL endpoints Web界面上的任何元素(如前面的查询所做的那样)

难道我做错了什么?我怎样才能正确地进行正则表达?

ps:使用 FILTER REGEX( ?title, "^Vamp( [(].*[)])?$") 在Web SPARQL endpoints 上工作,但在Java / Jena上时抛出以下错误:

2015年9月16日下午3:16:32 org.apache.jena.riot.system.ErrorHandlerFactory $ ErrorLogger logError SEVERE:3字节UTF-8序列的字节2无效 .

think 此错误与 ( ) 字符有关..

4 回答

  • 2

    用这个 PREFIX bif:<bif:>
    而不是 PREFIX bif:<> 为jena .

  • 0

    你是正确的正则表达式模式,只需要一点点编辑java .

    要使它在java中工作,只需在$之前放左括号(在^之后并放右括号) .

    你的正则表达式应该是这样的:

    “^(Vamp([(] . * [)])?)$”;

    希望这可以帮助

  • 1

    Jena将无法解析您的SPARQL,因为它无效 . 主要问题是bif:是Virtuoso的内置前缀 . 要允许Jena解析它,您需要添加

    PREFIX bif:<>
    

    对你的查询 .

  • 0

    正如AndyS在_1140849中回答的那样,问题是 bif 是一个特定于艺术家的功能,所以你应该使用 QueryEngineHTTP 而不是 QueryExecutionFactory.sparqlService . 这会将您的查询直接提交给 endpoints ,并且不会通过Jena解析器传递它 .

    QueryEngineHTTP query_engine = new QueryEngineHTTP(endpoint, query);
    

相关问题