如何使用 SPARQL 比较值,忽略变音符号
How to compare values, ignoring diacritics, with SPARQL
我一直在尝试(到目前为止没有成功)用 "broader equals" 条件过滤值。即忽略变音符号。
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
,但是 none他们似乎在工作。
是否有任何其他方法(除了链接 replace
s)将排序规则添加到这些函数中或实现相同的目标?
你提到的 XPath 函数实际上并不是 SPARQL 标准的一部分,所以你发现,你不能依赖它们开箱即用的支持(尽管一些供应商可能将它们作为附加组件提供) ).
但是,GraphDB(基于 RDF4J)允许您create your own custom functions in SPARQL。就是写一个实现了org.eclipse.rdf4j.query.algebra.evaluation.function.Function
接口的Javaclass,然后通过打包成Java服务提供者接口(SPI)的方式注册到RDF4J引擎中执行。
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) .
}
我一直在尝试(到目前为止没有成功)用 "broader equals" 条件过滤值。即忽略变音符号。
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
,但是 none他们似乎在工作。
是否有任何其他方法(除了链接 replace
s)将排序规则添加到这些函数中或实现相同的目标?
你提到的 XPath 函数实际上并不是 SPARQL 标准的一部分,所以你发现,你不能依赖它们开箱即用的支持(尽管一些供应商可能将它们作为附加组件提供) ).
但是,GraphDB(基于 RDF4J)允许您create your own custom functions in SPARQL。就是写一个实现了org.eclipse.rdf4j.query.algebra.evaluation.function.Function
接口的Javaclass,然后通过打包成Java服务提供者接口(SPI)的方式注册到RDF4J引擎中执行。
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) .
}