我在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 回答
用这个
PREFIX bif:<bif:>
而不是
PREFIX bif:<>
为jena .你是正确的正则表达式模式,只需要一点点编辑java .
要使它在java中工作,只需在$之前放左括号(在^之后并放右括号) .
你的正则表达式应该是这样的:
“^(Vamp([(] . * [)])?)$”;
希望这可以帮助
Jena将无法解析您的SPARQL,因为它无效 . 主要问题是bif:是Virtuoso的内置前缀 . 要允许Jena解析它,您需要添加
对你的查询 .
正如AndyS在_1140849中回答的那样,问题是
bif
是一个特定于艺术家的功能,所以你应该使用QueryEngineHTTP
而不是QueryExecutionFactory.sparqlService
. 这会将您的查询直接提交给 endpoints ,并且不会通过Jena解析器传递它 .