2013-12-25 4 views
3

다른 키워드를 제외하고 동시에 특정 키워드에 대한 SPARQL 쿼리를 필터링하고 싶습니다. 나는 이것이 FILTER (regex(str(?var),"includedKeyword","i") && !regex(str(?var),"excludedKeyword","i"))으로 쉽게 달성 될 수 있다고 생각했다. "!"없이 작동합니다. 조건, 그러나 아닙니다. 또한 FILTER 문을 분리했지만 사용하지는 않습니다. SPARQL : 정규식 필터 결합 및 제외

나는 http://europeana.ontotext.com/에이 쿼리를 사용 :

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX edm: <http://www.europeana.eu/schemas/edm/> 
PREFIX ore: <http://www.openarchives.org/ore/terms/> 

     SELECT DISTINCT ?CHO 
     WHERE { 
      ?proxy dc:subject ?subject . 
      FILTER (regex(str(?subject),"gemälde","i") && !regex(str(?subject),"Fotografie","i")) 
      ?proxy edm:type "IMAGE" . 
      ?proxy ore:proxyFor ?CHO. 
      ?agg edm:aggregatedCHO ?CHO; edm:country "germany". 
     } 

그러나 나는 항상 직류이있는 제목 "Gemäldegalerie"와 첫 번째 행에 결과를 얻을 : "Fotografie"의 주제를 (내가 원하는 일을 제외됨). 문제는 Europeana 데이터베이스의 한 객체가 둘 이상의 dc : subject 속성을 가질 수 있다는 사실에 있다고 생각합니다. 다른 속성을 무시하면서 이러한 속성 중 하나만 찾습니다.

아이디어가 있으십니까? 매우 감사 할 것입니다!

답변

3

결합 필터가 ?subject의 동일한 바인딩을 검사하는지 문제가 있습니다. 따라서 적어도 하나의 값 ?subject이 두 조건을 모두 만족하면 성공합니다 ("Gemäldegalerie"문자열이 첫 번째 정규 표현식과 일치하고 두 번째 정규 표현식과 일치하지 않기 때문에 거의 항상 참입니다).

음수 조건의 경우 특정 값이 아닌 가능한 모든 값을 확인하는 무언가를 공식화해야합니다. 여담으로

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
    PREFIX edm: <http://www.europeana.eu/schemas/edm/> 
    PREFIX ore: <http://www.openarchives.org/ore/terms/> 

    SELECT DISTINCT ?CHO 
    WHERE { 
     ?proxy edm:type "IMAGE" . 
     ?proxy ore:proxyFor ?CHO. 
     ?agg edm:aggregatedCHO ?CHO; edm:country "germany". 
     ?proxy dc:subject ?subject . 
     FILTER(regex(str(?subject),"gemälde","i")) 
     FILTER NOT EXISTS { 
      ?proxy dc:subject ?otherSubject. 
      FILTER(regex(str(?otherSubject),"Fotografie","i")) 
     } 
    } 

: :이 같은 예를 들어, SPARQL의 NOT EXISTS 기능을 사용하여이 작업을 수행 할 수 있습니다 당신은 NOT EXISTS 연산자로 결합 이제 정규 표현식 검사를 수행하고 있기 때문에, 이것은 매우 비싼 될 가능성이 높다 쿼리 프로세서가 아주 빨리. 예를 들어 정확한 제목 문자열을 사용하여 정규식을 제거하거나 제외 시키거나 SPARQL 끝 점이 제공 할 수있는 비표준 확장을 볼 수있는 대체 방법을 생각할 수도 있습니다 (OWLIM 예를 들어 Europeana 엔드 포인트가 실행되는 상점은 다양한 full-text-search extensions을 지원하지만 유럽 나 엔드 포인트에서 사용 가능하지는 않습니다.

+0

감사합니다. 지금이 상황이 나에게 분명해 보입니다.이 내용에 더 익숙해 져야합니다. 나는 또한 정규식없이 정확한 문자열을 사용하는 것에 대해 생각했지만 문제는 Europeana가 자신의 dc : subject 이름을 사용하는 많은 다른 공급자의 메타 데이터를 집계하는 것이므로 "사진"뿐만 아니라 "사진" "또는"사진 ". 이것은 regex가 편리하게 사용되는 곳입니다. 아니면 SPARQL에서 비 특이 리터럴을 찾는 방법이 있을까요? –

+2

전체 텍스트 검색 확장에 대한 제안을 통해 Lucene 쿼리가 그 일을 잘 수행한다는 것을 알게되었습니다. 나는 다음과 같은 것을 사용할 수 있습니다 : luceneQuery "foto *"(처음에는 PREFIX를 정의하면서 : ), 이것은 제가 원했던 것입니다. 위대한 답변을 주셔서 다시 한 번 감사드립니다. –