2016-10-25 8 views
1

GraphDB Free 7.1を使用していて、既定の設定でリポジトリを作成しました。私は270万のトリプレットを持つttlファイルをアップロードしました。私は200kの回答やワークベンチディスプレイを返すべきである(非常に複雑であるが、非常に複雑ではない)だけで1kの答えをクエリを発行しようとしているとGraphDBログは、私が使用しているクエリがあるクエリの評価に時間がかかりすぎた

10:52:19.580 [repositories/PaaSport] INFO c.o.f.sesame.RepositoryController - POST query -1325396809 
10:52:29.594 [repositories/PaaSport] ERROR o.o.h.s.r.TupleQueryResultView - Query interrupted 
org.openrdf.query.QueryInterruptedException: Query evaluation took too long 
... 
10:52:29.594 [repositories/PaaSport] INFO o.o.h.s.r.TupleQueryResultView - Request for query -1325396809 is finished 

例外が表示されます。

SELECT DISTINCT ?offering ?Value 
WHERE { 
    ?offering   a       paasport:Offering ; 
         DUL:satisfies    ?groundDescription . 
    ?groundDescription paasport:offers   ?characteristic . 
    ?characteristic  a       paasport:Storage ; 
         DUL:hasParameter   ?par . 
    ?par    a       paasport:StorageCapacity ; 
         DUL:hasParameterDataValue ?Value ; 
         DUL:parametrizes   ?qualityValue . 
    ?qualityValue  uomvocab:measuredIn  ?Units . 
    ?Units    a       ?AppParMeasureUnitType . 
    ucum:GB    a       ?AppParMeasureUnitType . 
    ?Units    a       uomvocab:SimpleDerivedUnit . 
    ucum:GB    a       uomvocab:SimpleDerivedUnit . 
    ucum:GB    uomvocab:derivesFrom  ?BasicUnit . 
    ?Units    uomvocab:derivesFrom  ?BasicUnit . 
    ucum:GB    uomvocab:modifierPrefix ?prefix1 . 
    ?Units    uomvocab:modifierPrefix ?prefix2 . 
    ?prefix1   uomvocab:factor   ?Factor1 . 
    ?prefix2   uomvocab:factor   ?Factor2 . 
     FILTER(xsd:double(?Factor2)*?Value = xsd:double(?Factor1)*4) 
    } 

クエリタイムアウトが0に設定されているので、私は、クエリの中断例外の原因を確認していません。おそらくメモリの問題? 非常に単純なクエリ(特定のクラスのすべてのインスタンスを返すなど)は正常に機能します。

ヒントはありますか?どんな助けもありがとう。 必要に応じて詳細を提供することができます。

ベスト、 ニック

+0

クエリが複雑すぎるようです。あなたはクエリを共有できますか?クエリの一部の順序を変更しようとしましたか?場合によっては、クエリプランオプティマイザがより効率的な実行計画を選択するのに役立ちます。さらに、いくつかのGraphDB設定パラメータがあるかもしれませんが、私はこのトリプルストアの専門家ではありません。 – AKSW

+0

'SELECT DISTINCT?オファリング?値WHERE { ?オファーrdf:タイプpaasport:オファー。 \t?提供DUL:満たす?GroundDescription。 \t?groundDescription paasport:offers?特性。 \t?特性rdf:タイプpaasport:ストレージ。 \t?特性DUL:hasParameter?par。 \t?par rdf:type paasport:StorageCapacity。 \t?par DUL:hasParameterDataValue?Value。 \t?par DUL:パラメータはqualityValueです。 \t?qualityValue uomvocab:measuredIn?単位。 –

+0

'?単位rdf:タイプ?AppParMeasureUnitType。 \t ucum:GB rdf:type?AppParMeasureUnitType。 \t?ユニットrdf:タイプuomvocab:SimpleDerivedUnit。 \t ucum:GB rdf:type uomvocab:SimpleDerivedUnit。 \t ucum:GB uomvocab:derivesFrom?BasicUnit。 \t?単位uomvocab:derivesFrom?BasicUnit。 \t ucum:GB uomvocab:modifierPrefix?prefix1。 \t?uomvocab:modifierPrefix?prefix2という単位。 \t?prefix1 uomvocab:factor?Factor1。 \t?prefix2 uomvocab:factor?Factor2。 \t FILTER(xsd:double(?Factor2)*?Value = xsd:double(?Factor1)* 4) } –

答えて

1

は実際に私が答えられるためには、最小限にクエリを削減するために管理しています。問題は、主に以下のトリプル・パターンによるものであった:

ucum:GB rdf:type    ?AppParMeasureUnitType . 
ucum:GB rdf:type    uomvocab:SimpleDerivedUnit . 
ucum:GB uomvocab:derivesFrom ?BasicUnit . 

これらが省略され、元のクエリ内の対応する変数が一定のリソースによって置き換えられ、その後、クエリに応答がある場合。

SELECT DISTINCT ?offering ?Value 
WHERE { 
    ?offering   rdf:type     paasport:Offering . 
    ?offering   DUL:satisfies    ?groundDescription . 
    ?groundDescription paasport:offers   ?characteristic . 
    ?characteristic  rdf:type     paasport:Storage . 
    ?characteristic  DUL:hasParameter   ?par . 
    ?par    rdf:type     paasport:StorageCapacity . 
    ?par    DUL:hasParameterDataValue ?Value . 
    ?par    DUL:parametrizes   ?qualityValue . 
    ?qualityValue  uomvocab:measuredIn  ?Units . 
    ?Units    rdf:type     ucum:UnitOf-infotech . 
    ?Units    rdf:type     uomvocab:SimpleDerivedUnit . 
    ?Units    uomvocab:derivesFrom  <http://purl.oclc.org/NET/muo/ucum/unit/amount-of-information/byte> . 
    ucum:GB    uomvocab:modifierPrefix ?prefix1 . 
    ?Units    uomvocab:modifierPrefix ?prefix2 . 
    ?prefix1   uomvocab:factor   ?Factor1 . 
    ?prefix2   uomvocab:factor   ?Factor2 . 
     FILTER(xsd:double(?Factor2)*?Value >= xsd:double(?Factor1)*2) 
} 
+0

ただし、このクエリは元のクエリと同じ意味ですか?私はそうは思わない、私は正しい?しかし、確かに、それらの変数の束縛を知っているなら、あなたは結合の数を減らすことができます。 – AKSW

+0

変数へのバインディングは、より単純なSPARQLクエリによって事前に決定することができ、大きなものを構築することができます。それにもかかわらず、クエリは2700万のトリプルの次の「テストレベル」でタイムアウトします。 –

0
  1. あなたが本当にDISTINCT必要です:ここで

    は、結果のクエリがありますか?それは、すべての結果をメモリにフェッチし、ソートして一元化してから提供する必要があるため、常に遅くなります。

  2. FILTERに=または> =が必要ですか? if = thenフィルタをBIND(...?Factor2)に置き換えて、?prefix2を検索する前にこれらを置く

  3. クエリをプロファイリングしましたか? http://graphdb.ontotext.com/documentation/standard/explain-plan.html

関連する問題