2016-09-28 1 views
3

병렬 스레드 (400 스레드)에서 수천 번 실행되는 다소 복잡한 SPARQL 쿼리가 있습니다. 가독성을 위해 여기서는 쿼리가 네임 스페이스, 속성 및 변수가 다소 단순화되었지만 복잡성은 그대로 유지됩니다 (노동 조합, 그래프 수 등). 쿼리는 4 개의 그래프에 대해 실행되며 그 중 가장 큰 그래프는 5,561,181 개의 트리플을 포함합니다.복잡한 SPARQL 쿼리 - 성능상의 힌트가 있습니까?

PREFIX graphA: <GraphABaseURI:> 

ASK 
FROM NAMED <GraphBURI> 
FROM NAMED <GraphCURI> 
FROM NAMED <GraphABaseURI> 
FROM NAMED <GraphDBaseURI> 
WHERE{ 
    { 
     GRAPH <GraphABaseURI>{ 
     ?variableA a graphA:ClassA . 
     ?variableA graphA:propertyA ?variableB . 
     ?variableB dcterms:title ?variableC . 
     ?variableA graphA:propertyB ?variableD . 
     ?variableL<GraphABaseURI:propertyB> ?variableD . 
     ?variableD <propertyBURI> ?variableE 
     } 
     . 
     GRAPH <GraphBURI>{ 
     ?variableF <propertyCURI>/<propertyDURI> ?variableG . 
     ?variableF <propertyEURI> ?variableH 
     } 
     . 
     GRAPH <GraphCURI>{ 
     ?variableI <http://www.w3.org/2004/02/skos/core#notation> ?variableJ . 
     ?variableI <http://www.w3.org/2004/02/skos/core#prefLabel> ?variableK . 
     FILTER (isLiteral(?variableK) && REGEX(?variableK, "literalA", "i")) 
     } 
     . 
     FILTER (isLiteral(?variableJ) && ?variableG = ?variableJ) . 
     FILTER (?variableE = ?variableH) 
    } 
    UNION 
    { 
     GRAPH <GraphABaseURI>{ 
      ?variableA a graphA:ClassA . 
      ?variableA graphA:propertyA ?variableB . 
      ?variableB dcterms:title ?variableC . 
      ?variableA graphA:propertyB ?variableD . 
      ?variableL<propertyBURI> ?variableE . 
      ?variableL <propertyFURI> ?variableD . 
     } 
     . 
     GRAPH <GraphDBaseURI>{ 
      ?variableM <propertyGURI> ?variableN . 
      ?variableM <propertyHURI> ?variableO . 
      FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) 
     } 
     . 
     FILTER (?variableE = ?variableN) . 

    } 
    UNION 
    { 
     GRAPH <GraphABaseURI>{ 
      ?variableA a graphA:ClassA . 
      ?variableA graphA:propertyA ?variableB . 
      ?variableB dcterms:title ?variableC . 
      ?variableA graphA:propertyB ?variableD . 
      ?variableL<propertyBURI> ?variableE . 
      ?variableL <propertyIURI> ?variableD . 
     } 
     . 
     GRAPH <GraphDBaseURI>{ 
      ?variableM <propertyGURI> ?variableN . 
      ?variableM <propertyHURI> ?variableO . 
      FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) 
     } 
     . 
     FILTER (?variableE = ?variableN) . 
    } 
    . FILTER (isLiteral(?variableC) && REGEX(?variableC, "literalB", "i")) . 
} 

저는 위의 쿼리를 변형시키는 사람은 없을 것이라고 생각합니다. 전 단지 복잡성과 사용 된 모든 SPARQL 구조를 보여주기 위해 쿼리를 게시하고 있습니다.

내 질문 : 나는 하나의 그래프 내 모든 트리플이 있다면

  1. 것은 내가 성능에 관한 얻게됩니다? 이 방법을 사용하면 노동 조합을 피하고 쿼리를 단순화 할 수 있지만 성능 측면에서도 이점이 있습니까?
  2. 내가 만들 수있는 인덱스가 있으며 위의 쿼리에 도움이 될 수 있습니까? 나는 실제로 데이터 색인 생성에 확신이 없지만 the RDF Index Scheme section of RDF Performance Tuning을 읽는다면 Virtuoso 7의 기본 색인 체계가 위와 같은 쿼리에 적합한 지 궁금합니다. 술어가 위의 쿼리의 SPARQL 트리플 패턴에 정의되어 있지만, 주제 또는 술어를 정의하지 않은 많은 트리플 패턴이 있습니다. 이것이 성능과 관련하여 큰 문제가 될 수 있습니까?
  3. 아마도 SPARQL 구문 구조가있어서 위의 쿼리에서 큰 도움이 될 수 있습니다. 뭔가 제안 해 주시겠습니까? 예를 들어, 나는 STR() 캐스트를 제거하고 isLiteral() 기능을 사용하여 성능을 이미 향상 시켰습니다. 다른 건 제안 해 주시겠습니까?
  4. 아마도 복잡한 SPARQL 구문 구조를 남용 할 것을 제안 할 수 있습니까?

나는 우분투 버전에 내장 거장 오픈 소스 버전을 사용하는 것이 참고 : 07.20.3214를 구축 : 2009 년 10 월 14 개 2015

감사합니다, Pantelis Natsiavas

답변

4

우선을 - 당신의 Virtuoso 빌드는 오래되었습니다. 7.20.3217 as of April 2016 (또는 이상)으로 업데이트하는 것이 좋습니다.

최적화 제안

  • Index Scheme Selection

    RDF Index Scheme을 다음 RDF 성능 튜닝 문서 섹션을하는을 제공합니다 ... 여기에 특별한 순서없이 여러 생각하는 단순화 된 쿼리를 볼 때. 자연적으로 제한되어 있지만, 귀하의 질의와 데이터에 적합한 대체 색인 및/또는 추가 색인의 커플. 일부 패턴에 그래프와 객체, 정의되지 않은 제목과 술어가 정의되어 있다고 말하면서 다른 요소에 따라 어떤 다른 색인 인 도 의미가 있습니다 (예 : GOPS, GOSP).

  • 원본로드 이후 데이터가 변경된 정도에 따라이 SQL 명령 (iSQL, ODBC, JDBC 등 모든 SQL 인터페이스를 통해 발행 될 수 있음)을 사용하여 자유 텍스트 색인을 다시 작성할 가치가 있습니다. .) -

    ?variableO bif:contains "'literalA'" . 
    FILTER (isLiteral(?variableO)) . 
    
  • Explain() and profile() 쿼리 최적화에 도움이 될 수 있습니다 -

    FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) . 
    

    - -와

    VT_INC_INDEX_DB_DBA_RDF_OBJ() 
    
  • Using the bif:contains predicate를 교체 예를 들어 regex() 필터보다 훨씬 더 나은 성능을 발생할 수 있습니다 노력. 이 산출물의 대부분은 개발에 의한 분석을위한 것이므로 많은 것을 의미하지는 않지만 other Virtuoso users에 제공하면 도움이되는 제안을 얻을 수 있습니다.

  • 많은 이유 때문에 rdf:type 술어 (종종 SPARQL/Turtle 의미 론적 설탕 덕분에 a으로 표현됨)가 성능 저하 요인이 될 수 있습니다. 그래프 패턴에서 해당 술어를 제거하면 성능이 크게 향상 될 수 있습니다. 필요한 경우 이러한 부정적인 성능 영향이없는 솔루션 집합 (예 : rdf:type의 엔터티가 소유 한 특성 만 테스트)을 제한하는 다른 방법이 있습니다.

(ObDisclaimer :. OpenLink SoftwareVirtuoso을 생성하고, 저를 채용)