【问题标题】:SPARQL filter regex and unionSPARQL 过滤器正则表达式和联合
【发布时间】:2016-05-14 13:08:14
【问题描述】:

我的本​​体有 2 个类:foodfoodSource。 我想使用 SPARQL 查询获取具有 2 种 foodSource 的类 food 的数据:

SELECT ?food ?foodSource ?foodSource2
WHERE {
  {
    ?foodSource mpasi:data_memerlukanBahan ?memerlukanBahan.
    ?food ?memerlukanBahan ?value.
    FILTER  regex(str(?foodSource),"carrot")
  }
  UNION
  {
    ?foodSource2 mpasi:data_memerlukanBahan ?memerlukanBahan.
    ?food ?memerlukanBahan ?value.
    FILTER  regex(str(?foodSource2),"tomato")
  }
} 
order by ?food

我得到了正确的结果。但后来我想避免一些食物来源。那么,我怎样才能得到没有食物来源的食物呢?例如,我有 3 种食物:

  • 克得来粥
  • 苹果碎
  • 番茄汤

然后我想要里面没有苹果的食物。所以,很自然地,我只得到了可得来粥和番茄汤。 我可以使用 !regex 获取它吗?

FILTER  (!regex(str(?foodSource),"apple")).

【问题讨论】:

  • Regex 支持 union 和 negation,这可能比通过 SPARQL union 和 MINUS 编写更有效。

标签: sparql ontology


【解决方案1】:

也许第一步是重构您的UNION 语句。 UNION 图形语句的前两个三元组模式相同,因此将它们移到 UNION 语句之外。然后你只剩下两个FILTER 语句,可以用|| 表达式重写:

SELECT ?food ?foodSource ?foodSource2
WHERE {
  ?foodSource mpasi:data_memerlukanBahan ?memerlukanBahan.
  ?food ?memerlukanBahan ?value.
  FILTER (regex(str(?foodSource),"carrot") || regex(str(?foodSource2),"apple"))
}

正如@AKSW 建议的那样,也许更好的是在正则表达式本身中执行or

FILTER regex(str(?foodSource),"carrot|apple")

由于 SPARQL 中的 FILTER 是一个正向过滤器 - 它说明允许通过的内容 - 那么“胡萝卜”和“苹果”是唯一可能的解决方案。 “土豆”无法通过过滤器。

但是,如果您想找到除“potato”之外的所有内容,那么您有两个否定选择:

FILTER (!regex(str(?foodSource),"potato"))

或通过正则表达式否定:

FILTER regex(str(?foodSource),"[^potato]")

【讨论】:

  • "[^potato"] 有一些不平衡的括号/引号。但即便如此,我认为这并不能满足您的要求;我认为[^potato] 只匹配一个不是 p、o、t 或 a 的字符。
  • 修正了错字。正则表达式是正确的。在字符类中 ^ 否定字符串。
  • 我知道否定,但 [abc] 匹配 a b 和 c 中的一个字符; [^abc] 不匹配一个不是 b 或 c 的字符吗?
  • 经过更多检查,[^...] 的行为与您描述的不同。例如,values ?food { "potato" "potatoes" "oat" "pot" } filter regex(?food, "[^potato]") 只产生 potatoes,因为它在 {p,o,t,a} 中只有一个字符 not。 SPARQL regex 基于 XPath matches;一些链接指向negative character group[^potato] 等价于 [^pota] 并匹配不在集合 {p,o,t,a} 中的字符。
  • 它实际上导致了一种偷偷摸摸的错误,因为[^word] 总是无法匹配word(当word是整个字符串时),所以它最初看起来它有效。但它也将无法匹配wooddoorordoow 等,因为它们也缺少集合中没有的字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多