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

时间:2015-09-16 14:04:12

标签: regex sparql jena virtuoso apache-jena

我在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

根据bif:contains的建议,我找到了摆脱Jena异常的解决方案。然后查询如下:

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端点Web界面上的任何元素(如前一个查询所做的那样)

我做错了吗?我怎样才能正确地进行正则表达式?

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

  

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

认为此错误与( )个字符有关..

4 个答案:

答案 0 :(得分:2)

使用此PREFIX bif:<bif:>
而不是PREFIX bif:<>为jena。

答案 1 :(得分:1)

你的正则表达式是正确的,只需要对java进行一些编辑。

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

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

&#34; ^(Vamp([(]。* [)])?)$&#34 ;;

希望这会有所帮助

答案 2 :(得分:0)

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

PREFIX bif:<>

查询。

答案 3 :(得分:0)

正如AndyS在here中回答的那样,问题是bif是特定于艺术家的功能,因此您应该使用QueryEngineHTTP代替QueryExecutionFactory.sparqlService。这将直接将您的查询提交给端点,并且不会通过Jena解析器传递它。

QueryEngineHTTP query_engine = new QueryEngineHTTP(endpoint, query);
相关问题