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))
}

这个 SPARQL 端点上,它工作正常。它按预期返回电视节目 Vamp 和 Vamp (telenovela)。

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

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

正如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 端点 Web 界面上返回任何元素(就像之前的查询一样)

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

ps: usingFILTER 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

5 回答 5

2

用这个 PREFIX bif:<bif:>
代替PREFIX bif:<>在耶拿。

于 2016-08-29T12:36:42.993 回答
1

您的正则表达式模式是正确的,只是在涉及 java 时进行了一些编辑。

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

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

"^(鞋面([(].*[)])?)$";

希望这可以帮助

于 2015-09-16T14:27:06.090 回答
0

正如 AndyS 在这里回答的那样,问题是这bif是一个特定于大师的功能,所以你应该使用QueryEngineHTTP而不是QueryExecutionFactory.sparqlService. 这会将您的查询直接提交到端点,并且不会通过 Jena 解析器传递。

QueryEngineHTTP query_engine = new QueryEngineHTTP(endpoint, query);
于 2015-09-22T13:33:33.967 回答
0

您可以使用以下前缀声明作为解决方法。

PREFIX bif: <bif:>

Live Link演示了实际的解决方法。

Live Virtuoso SPARQL 查询编辑器链接展示了解决方法。

最终,前缀声明的 URI 应该是:

PREFIX bif: <http://www.openlinksw.com/schemas/bif#> 

我在Twitter 线程中解释了相同的问题,即,我们正在努力纠正与上述标准前缀声明相关的回归。

于 2021-10-13T15:13:30.913 回答
0

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

PREFIX bif:<>

到您的查询。

于 2015-09-17T10:58:23.613 回答