【问题标题】:How to compare values, ignoring diacritics, with SPARQL如何使用 SPARQL 比较值,忽略变音符号
【发布时间】:2017-12-20 17:25:06
【问题描述】:

我一直在尝试(到目前为止没有成功)使用“更广泛的等于”条件过滤值。也就是说,忽略变音符号。

select * where {  
  ?s per:surname1 ?t.
  bind (fn:starts-with(str(?t),'Maria') as ?noAccent1) .
  bind (fn:translate(str(?t),"áéíóú","aeiou") as ?noAccent2) .
} limit 100 

到目前为止,我已经尝试了 XPath 函数 fn:containsfn:comparefn:translatefn:starts-with,但它们似乎都没有工作。

是否有任何其他方式(除了链接replaces)将排序规则添加到这些函数中或实现相同的目标?

【问题讨论】:

    标签: sparql diacritics graphdb


    【解决方案1】:

    您提到的 XPath 函数实际上并不是 SPARQL 标准的一部分,因此正如您所发现的,您不能依赖它们开箱即用的支持(尽管某些供应商可能将它们作为附加组件提供)。

    但是,GraphDB(基于 RDF4J)允许您create your own custom functions in SPARQL。只需编写一个实现org.eclipse.rdf4j.query.algebra.evaluation.function.Function 接口的Java 类,并通过将其打包为Java 服务提供者接口(SPI) 实现将其注册到RDF4J 引擎中。

    【讨论】:

      【解决方案2】:

      SPARQL 和 REGEX 不支持高效音译字符映射。如果您想要一个高效的实现,您将需要一个自定义的 RDF4J 自定义,如 Jeen 所述。

      如果您想要一个快速而肮脏的解决方案,请使用此代码示例:

      PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
      PREFIX spif: <http://spinrdf.org/spif#>
      select * where {
          BIND("Mariana" as ?t) .
          BIND("Márénísótú" as ?t2) .
          BIND (regex(str(?t),'^Maria') as ?noAccent1) .
          BIND (spif:replaceAll(
                  spif:replaceAll(
                      spif:replaceAll(
                          spif:replaceAll(
                              spif:replaceAll(str(?t2),"á","a"),
                              "é","e")
                          ,"í","i"),
                      "ó","o"),
                  "ú","u") as ?noAccent2) .
      }
      

      【讨论】:

      • 谢谢,但我不能依赖替换链,因为将来它不会只是变音符号。我正在寻找一种暗示比较的“更清洁”的解决方案
      猜你喜欢
      • 2010-09-28
      • 2011-01-23
      • 2014-10-10
      • 2011-03-13
      • 2011-12-09
      • 2023-03-24
      • 2018-03-29
      • 1970-01-01
      • 2015-06-11
      相关资源
      最近更新 更多