【问题标题】:SPARQL regular expression not matchSPARQL 正则表达式不匹配
【发布时间】:2013-10-07 12:09:39
【问题描述】:

我想获取标题中没有“指环王”字符串的所有电影。我在Linked Movie Database SPARQL endpoint 上试过这个,但它不起作用。怎么了?

PREFIX m: <http://data.linkedmdb.org/resource/movie/>
SELECT DISTINCT *  WHERE {
   ?film dc:title ?titulo_pelicula.
   FILTER NOT EXISTS { 
      FILTER (regex(?titulo_pelicula, "The Lord of the Rings","i")) . 
   }
}

【问题讨论】:

  • 以后,请注意“有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含重现问题的有效代码。”和“要求代码的问题必须表明对正在解决的问题的最低限度的理解。包括尝试的解决方案、为什么它们不起作用以及预期的结果。”在这种情况下,“不起作用”的描述性不够。起初我假设您没有得到预期的结果,但在尝试查询时,我意识到它会产生错误。请更详细地描述什么
  • 发生了(无论您遇到错误,还是工作正常,但结果与您预期的不同等)。

标签: regex rdf sparql linkedmdb


【解决方案1】:

首先,您应该澄清“不起作用”的含义。起初,我假设您的意思是它不会返回任何结果,但是当我在 the endpoint 运行它时,我意识到您实际上收到了一条相当明确的错误消息:

Parse error: 
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX oddlinker: <http://data.linkedmdb.org/resource/oddlinker/>
PREFIX map: <file:/C:/d2r-server-0.4/mapping.n3#>
PREFIX db: <http://data.linkedmdb.org/resource/>
PREFIX dbpedia: <http://dbpedia.org/property/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX m: <http://data.linkedmdb.org/resource/movie/>
SELECT DISTINCT *  WHERE {
   ?film dc:title ?titulo_pelicula.
   FILTER NOT EXISTS { 
      FILTER (regex(?titulo_pelicula, "The Lord of the Rings","i")) . 
   }
}

Lexical error at line 16, column 14.  Encountered: " " (32), after : "NOT"

当您到达NOT 时出现解析错误。端点基于原来的SPARQL Query Language for RDF 而不是SPARQL 1.1 Query Language。原始 SPARQL 没有 NOT EXISTS

这很容易解决。首先,认识到filter 接受一个表达式并只保留表达式计算结果为真的那些结果。当正则表达式匹配标题时,过滤表达式regex(?titulo_pelicula, "The Lord of the Rings","i") 返回true,并且您正在寻找它返回false 的情况,因此您只需用! 否定它。 (! 运算符与 XPath 函数 not 相同。映射在 SPARQL 建议的 11.3 Operator Mapping 部分中定义。)您需要这样的查询:

PREFIX m: <http://data.linkedmdb.org/resource/movie/>
SELECT DISTINCT *  WHERE {
   ?film dc:title ?titulo_pelicula.
   FILTER (!regex(?titulo_pelicula, "The Lord of the Rings","i")) . 
}

SPARQL results

【讨论】:

  • 谢谢,但我需要获取标题中没有“指环王”的电影,这与该查询正好相反。
  • @Ortzi 哦,对不起!我误读了这个问题。在这种情况下,您只需要使用filter(!regex(...))(注意!)。我已经更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多