【问题标题】:How to do SPARQL query using bif:regexp_match on Jena如何在 Jena 上使用 bif:regexp_match 进行 SPARQL 查询
【发布时间】:2015-09-16 14:04:11
【问题描述】:

我在 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 无效。`

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

【问题讨论】:

  • 看起来问题肯定出在正则表达式中,无论是在您的构造中还是在 Virtuoso 的解释中。我无法立即提供解决方案,但我可以并且确实建议您向更专注的受众提出问题 - [Virtuoso 用户邮件列表 (sourceforge.net/p/virtuoso/mailman/virtuoso-users)。

标签: regex sparql jena virtuoso apache-jena


【解决方案1】:

使用这个PREFIX bif:&lt;bif:&gt;
而不是 PREFIX bif:&lt;&gt; 用于耶拿。

【讨论】:

【解决方案2】:

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

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

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

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

希望对你有帮助

【讨论】:

  • 感谢您的意见,但它也不起作用。我认为 virtuoso 不能使用
  • 我编辑了问题以添加详细信息。 方法也不会在 Web 界面的查询中返回任何内容。
  • 在网络界面上 FILTER REGEX(?title,"^(Vamp)(( [(].*[)])?)$") 返回我所期望的,但是 ?title "^(Vamp)(( [(].*[)])?)$" 什么都不返回
  • 能否请您详细说明为什么括号顺序会影响这一点?
  • 括号会影响 java 中的这一点,因为没有它,Vamp 将不会包含在您要查找的模式中;因此使您的模式仅限于某些匹配项。感谢您的回复。希望我能提供一些帮助
【解决方案3】:

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

PREFIX bif:<>

到您的查询。

【讨论】:

  • 那行不通。不在 Jena 中,也不在 Web 界面中。它引发以下异常:线程“main”中的异常 HttpException: 400 Bad Request Virtuoso 37000 Error SP030: SPARQL compiler, line 11: Prefixes 'sql:' and 'bif:' are reserved for SQL names at (...)
【解决方案4】:

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

QueryEngineHTTP query_engine = new QueryEngineHTTP(endpoint, query);

【讨论】:

【解决方案5】:

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

PREFIX bif: <bif:>

Live Link 演示解决方法。

Live Virtuoso SPARQL Query Editor Link 展示解决方法。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多