를 작성하는 방법 SPARQL 는 쿼리를 효율적으로 일치 문자열을 무시하고한 경우

StackOverflow https://stackoverflow.com//questions/10660030

  •  11-12-2019
  •  | 
  •  

문제

내가 사용하고 예나 ARQ 를 작성하 SPARQL 에 대한 쿼리를 대형 온톨로지에서 읽 예나 TDB 을 찾기 위해서 형식과 관련된 개념에 따라 폐기물 재생 연료 레이블:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "aspirin" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

이 꽤 잘 작동하고 실제로 매우 신속(<1 초)입니다.불행하게도,어떤 용어를 수행해야 하는 이 쿼리에는 대소문자를 구분하는 방법입니다.예를 들어,기 때문에 라벨 "Tylenol" 에서 온톨로지,지 "tylenol", 다음 쿼리라크:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "tylenol" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

내가 쓸 수 있는 대소문자를 구분하는 버전이 쿼리를 필터를 사용하여 다음과 같은 구문을 그렇:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER ( regex (str(?term), "tylenol", "i") )
}

하지만 지금은 쿼리는데 시간이 너무 걸립을 완료!방법은 없을 쓰는 대소문자를 구분하는 쿼리에서 더 효율적인 방식으로?

도움이 되었습니까?

해결책

이유는 쿼리를 필터 쿼리가 실행되 느리기 때문입?기적인은 약속 안함이 필요합 검사 PSO 또는 POS 인덱스가 찾는 모든 문와 함께 폐기물 재생 연료:레이블 조건자 및 그들을 필터링에 대해 regex.되었을 때에 바인딩하여 구체적인 리소스(에서 당신의 첫번째 예에서),이를 사용할 수 OPS 또는 POS 인덱스 스캔을 통해서만 계산서와 함께 폐기물 재생 연료:레이블 조건자 및 지정된 개체는 자원하는 것이 훨씬 낮은 카디널리티.

일반적인 솔루션을 이 유형의 텍스트 문제를 검색을 사용하여 외부에 텍스트 인덱스입니다.이 경우,예나 제공한 무료 텍스트라는 인덱스 LARQ, 을 사용하는 루씬서 검색을 수행하고 결과의 나머지 부분은 쿼리가 있습니다.

다른 팁

에서 모든 가능한 문자열에 사업자에 사용할 수 있는 SPARQL, regex 은 아마도 가장 비싸다.쿼리도 빠르게 실행하는 경우 피 regex 당신은 사용 UCASELCASE 의 양쪽에는 시험 대신 합니다.다음과 같습니다.

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER (lcase(str(?term)) = "tylenol")
}

이 빠를 수 있지만 일반적으로 기대하지 않는 훌륭한 성능 텍스트 검색으로 모든 트리플 저장소입니다.트리플 저장소에 아주 좋 그래프를 매치하고 너무 좋지 않아서 문자열이 일치합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top