2017-12-20 20 views
1

나는 "더 동등한"조건을 가진 값을 필터링하려고 노력 해왔다. 즉 발음 구별을 무시합니다. 이 순간 SPARQL을 사용하여 값을 비교하는 방법, 분필 부호를 무시하는 방법

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 

, 나는 fn:containsfn:comparefn:translatefn:starts-with,하지만 그들 중 누구도 제대로 동작하지 XPath 기능을 시도했습니다.

이러한 기능에 데이터 정렬을 추가하거나 동일한 목표를 달성하는 다른 방법이 있습니까? replace을 연결하는 것 외에는 다른 방법이 있습니까?

답변

0

언급 한 XPath 함수는 실제로 SPARQL 표준의 일부가 아니므로, 알아 낸 것처럼 상자에서 지원되는 것으로 의존 할 수는 없습니다 (일부 공급 업체가 추가 기능을 제공 할 수도 있음) .

그러나 GraphDB (RDF4J를 기반으로 함)는 create your own custom functions in SPARQL을 허용합니다. org.eclipse.rdf4j.query.algebra.evaluation.function.Function 인터페이스를 구현하는 Java 클래스를 작성하고 이것을 Java 서비스 공급자 인터페이스 (SPI) 구현으로 패키징하여 RDF4J 엔진에 등록하는 문제입니다.

0

SPARQL 및 REGEX는 문자표를 효율적으로 음역 변환하는 것을 지원하지 않습니다. 효율적인 구현을 원할 경우 Jeen이 설명한대로 사용자 정의 RDF4J 사용자 정의가 필요합니다.

당신은 신속하고 더러운 솔루션이 코드 샘플을 사용하려면 다음

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) . 
} 
+0

감사합니다,하지만 늘 미래에 단지 분음 부호 수로 내가하는 대체 체인에 의존 할 수 없다. 나는 대조적 인 비교를 암시하는 "cleaner"솔루션을 찾고 있었다. – jbob