2016-09-28 6 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つのグラフにすべての私のトリプルを持っていた場合

  1. が、私はパフォーマンスに関する得るだろうか?このようにして、私は組合を避け、クエリを簡素化しますが、これもパフォーマンス面でメリットがありますか?
  2. 私は構築できた索引はありますか?上記のクエリにはどんなヘルプがありますか?私は実際にはデータのインデックス作成には自信がありませんが、the RDF Index Scheme section of RDF Performance Tuningで読んでいますが、Virtuoso 7のデフォルトの索引付けスキームが上記のような問合せに適しているのだろうかと思います。述語は上記のクエリのSPARQLトリプルパターンで定義されていますが、サブジェクトまたは述語を定義していないトリプルパターンが多数あります。これはパフォーマンスに関して大きな問題になるでしょうか?
  3. おそらく私が気付いていないSPARQL構文構造があり、上記のクエリで大きな助けになるかもしれません。あなたは何かを提案できますか?たとえば、STR()キャストを削除し、isLiteral()機能を使用してパフォーマンスを改善しました。他に何か提案できますか?
  4. おそらく、複雑なSPARQL構文構造を過度に使うことを示唆することができますか?

Ubuntuのバージョン上に構築された、私はヴィルトゥオーゾオープンソース版を使用することに注意してください:07.20.3214、ビルドします。10月14日、2015年

よろしく、 Pantelis Natsiavas

答えて

4

最初のもの - あなたのVirtuosoのビルドは古くなっています。 7.20.3217 as of April 2016(またはそれ以降)に更新することを強くお勧めします。

最適化の提案はRDF Index Scheme以下の単純化クエリを見たとき。当然限られているが、ここではいくつか考えている、順不同で...

  • Index Scheme Selection、RDFパフォーマンスチューニングのドキュメントセクション、A提供していますあなたのクエリとデータに意味をなされる代替インデックスと追加インデックスの組み合わせです。パターンの中には、グラフやオブジェクト、定義されていない件名や述語が定義されていると言えますが、その他の要因によってはのような他のインデックスも意味があります(例えば、GOPSGOSP)。

  • 元の負荷からデータがどのくらい変更されたかによって、このSQLコマンド(iSQL、ODBC、JDBCなどのSQLインターフェイス経由で発行される可能性があります)を使用してフリーテキストインデックスを再構築する価値があります。 。) -

    VT_INC_INDEX_DB_DBA_RDF_OBJ() 
    
  • Using the bif:contains predicateは、インスタンスが交換のために、regex()フィルタよりも実質的に優れた性能につながることができます -

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

    を - と -

    ?variableO bif:contains "'literalA'" . 
    FILTER (isLiteral(?variableO)) . 
    
  • Explain() and profile()クエリの最適化に役立ちます尽力。この出力の多くは開発による分析のためのものですので、あまり意味がないかもしれませんが、other Virtuoso usersに提供すると、引き続き役立つ提案が得られます。

  • 多くの理由から、rdf:type述語(しばしばaと表示されます(SPARQL/Turtle意味論砂糖のおかげで)は、パフォーマンスキラーになる可能性があります。これらの述語をグラフパターンから削除すると、パフォーマンスが大幅に向上する可能性があります。必要に応じて、そのような悪影響の影響を受けない、ソリューションセットを制限する他の方法があります(たとえば、希望するエンティティが所有する属性のみをテストするなど)。

(ObDisclaimer:OpenLink SoftwareVirtuosoを生成し、私を採用)

関連する問題