私は並列スレッド(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つのグラフにすべての私のトリプルを持っていた場合
- が、私はパフォーマンスに関する得るだろうか?このようにして、私は組合を避け、クエリを簡素化しますが、これもパフォーマンス面でメリットがありますか?
- 私は構築できた索引はありますか?上記のクエリにはどんなヘルプがありますか?私は実際にはデータのインデックス作成には自信がありませんが、the RDF Index Scheme section of RDF Performance Tuningで読んでいますが、Virtuoso 7のデフォルトの索引付けスキームが上記のような問合せに適しているのだろうかと思います。述語は上記のクエリのSPARQLトリプルパターンで定義されていますが、サブジェクトまたは述語を定義していないトリプルパターンが多数あります。これはパフォーマンスに関して大きな問題になるでしょうか?
- おそらく私が気付いていないSPARQL構文構造があり、上記のクエリで大きな助けになるかもしれません。あなたは何かを提案できますか?たとえば、
STR()
キャストを削除し、isLiteral()
機能を使用してパフォーマンスを改善しました。他に何か提案できますか? - おそらく、複雑なSPARQL構文構造を過度に使うことを示唆することができますか?
Ubuntuのバージョン上に構築された、私はヴィルトゥオーゾオープンソース版を使用することに注意してください:07.20.3214、ビルドします。10月14日、2015年
よろしく、 Pantelis Natsiavas