1

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

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:contains, fn:compare, fn:translate, fn:starts-with,但它们似乎都不起作用。

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

4

2 回答 2

0

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

但是,GraphDB(基于 RDF4J)允许您在 SPARQL 中创建自己的自定义函数。只需编写一个实现该org.eclipse.rdf4j.query.algebra.evaluation.function.Function接口的 Java 类,然后通过将其打包为 Java 服务提供者接口 (SPI) 实现来将其注册到 RDF4J 引擎中。

于 2017-12-21T02:30:45.853 回答
0

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) .
}
于 2017-12-21T04:57:26.247 回答