2016-05-10 5 views
1

私はノードのリストを持っており、それらのノード間のすべての関係を含むトリプルを取得したいと思います。'values'ブロック内に多数の値を持つSPARQLクエリ

これは私がこれまで何をやったかである:私は私が欲しいものを得る。これにより

PREFIX myPrefix: <http://example.org/myPrefix/> 
SELECT ?a ?relation ?b 
WHERE{ 
values ?a { myPrefix:id_00083184 myPrefix:id_00083187 
      myPrefix:id_00083189 myPrefix:id_00083182 
      myPrefix:id_09463313 myPrefix:id_00000790 
      myPrefix:id_00073965 myPrefix:id_00073966 
      myPrefix:id_00016990 myPrefix:id_08380001 
      myPrefix:id_00019131 myPrefix:id_03739215 
      myPrefix:id_00019129 myPrefix:id_00034482 
      myPrefix:id_00098617      

      } 

values ?b { myPrefix:id_00083184 myPrefix:id_00083187 
      myPrefix:id_00083189 myPrefix:id_00083182 
      myPrefix:id_09463313 myPrefix:id_00000790 
      myPrefix:id_00073965 myPrefix:id_00073966 
      myPrefix:id_00016990 myPrefix:id_08380001 
      myPrefix:id_00019131 myPrefix:id_03739215 
      myPrefix:id_00019129 myPrefix:id_00034482 
      myPrefix:id_00098617      
      } 
    ?a ?relation ?b . 
} 

を、それが、私の(外部)リスト上のノード間のすべての関係です。 valuesを使用し、?a?bのノードを繰り返します。しかし、問題は、私のノードリストが非常に大きくなる可能性があります。時には1000ノードまで持つことができますが、これはほんの小規模なケースです。そのクエリは実行に時間がかかりすぎます。

私は必要なことをするための良い方法がありますか?これが私が見つけた唯一のアプローチですが、私はSPARQLに慣れていないので、正しく実行する方法はありますか?

PS:ノードリストを別のデータベースのクエリから外部に取得し、Javaを使用して、リスト上のすべてのノードを追加するクエリを作成します。

これは私にとっては非常に洞窟のようですが、私が言ったように、私はSPARQLを使い始めています。

ありがとうございます。

+0

非常に単純なクエリであるため、クエリのパフォーマンスを改善できると思いました。 'n '個のノードを持っているなら、単純な解決法の複雑さは明らかに' O(n²) ' – AKSW

+0

私はあなたのクエリのパフォーマンスをどう改善できると思いますか?私は、それは私の質問のようなものです。@AKSW – antorqs

+0

申し訳ありませんが、私は "私はそうは思わない"という意味でした。もちろん、関係が対称であれば、 'a r b'と' b r a'の両方をチェックしないようにすることもできますが、これは実際にクエリを作成する際の作業です。 – AKSW

答えて

0

あなたが今やっていることはおそらくこれを行う最も一般的な方法です。

個々のAPI(例:Jena)は、値ブロックと機能的に同等な初期バインディングのセットを指定する他の方法をサポートしていますが、実際のクエリをはるかに短くすることができます。たとえば、my answerSaving and reusing the result of a SPARQL queryを参照してください。 Add text search where clause to SPARQL queryの答えには、Jenaの初期バインディングの例もあります。

関連する問題