コンテキスト: 14M トリプル、Blazegraph ワークベンチ。現在、SELECT と ASK を組み合わせたクエリを設計しようとしています。より正確には、仮定が真であるグラフの結果を選択したいと考えています。
私の例では、著者が 1 人、編集者が 1 人の本がたくさんあるとします。彼の本がランダムなパスの長さのプロパティを介してにリンクされている著者からの本を選択したいclient#1
。
私の場合、私のデータでは、次のようにクエリを直接実現するには多くの時間がかかります。
SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.
?id_book prefix:linkedToEditor*/prefix:hasClient :client#1}
ORDER by ?id_book
微積分の時間を短縮するために (x 1:1000)、これらのクエリを連続して実現するスクリプトを使用しています。このスクリプトは、著者 n°1 を著者として持つ本を選択します。
SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1}
ORDER by ?id_book
そして、クライアント n°1 にリンクされている場合、1 から n ( id_book#1
、id_book#2
、 ...、 )の各結果を求めます。id_book#n
ASK {id_book#i prefix:linkedToEditor*/prefix:hasClient :client#1}
ASK クエリが後に続く SELECT クエリは、同じ結果に対する最初の SELECT クエリよりもはるかに高速です。のすべての可能性を探りたいわけではありません?id_book prefix:linkedToEditor*/prefix:hasClient :client#1
。リンクが存在する場所に結果を保存したいだけです。FILTER EXISTS または 2 つの SELECT クエリを試しましたが、クエリ時間は同様に長くなります。
SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.}
FILTER EXIST {?id_book prefix:linkedToEditor*/prefix:hasClient :client#1}
ORDER by ?id_book
また
SELECT ?id_book
WHERE {?id_book prefix:linkedToEditor*/prefix:hasClient :client#1.
{SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.}
}
}
クエリを 1 つのクエリに最適化するにはどうすればよいですか?