병렬 스레드 (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 구조를 보여주기 위해 쿼리를 게시하고 있습니다.
내 질문 : 나는 하나의 그래프 내 모든 트리플이 있다면
- 것은 내가 성능에 관한 얻게됩니다? 이 방법을 사용하면 노동 조합을 피하고 쿼리를 단순화 할 수 있지만 성능 측면에서도 이점이 있습니까?
- 내가 만들 수있는 인덱스가 있으며 위의 쿼리에 도움이 될 수 있습니까? 나는 실제로 데이터 색인 생성에 확신이 없지만 the RDF Index Scheme section of RDF Performance Tuning을 읽는다면 Virtuoso 7의 기본 색인 체계가 위와 같은 쿼리에 적합한 지 궁금합니다. 술어가 위의 쿼리의 SPARQL 트리플 패턴에 정의되어 있지만, 주제 또는 술어를 정의하지 않은 많은 트리플 패턴이 있습니다. 이것이 성능과 관련하여 큰 문제가 될 수 있습니까?
- 아마도 SPARQL 구문 구조가있어서 위의 쿼리에서 큰 도움이 될 수 있습니다. 뭔가 제안 해 주시겠습니까? 예를 들어, 나는
STR()
캐스트를 제거하고isLiteral()
기능을 사용하여 성능을 이미 향상 시켰습니다. 다른 건 제안 해 주시겠습니까? - 아마도 복잡한 SPARQL 구문 구조를 남용 할 것을 제안 할 수 있습니까?
나는 우분투 버전에 내장 거장 오픈 소스 버전을 사용하는 것이 참고 : 07.20.3214를 구축 : 2009 년 10 월 14 개 2015
감사합니다, Pantelis Natsiavas