注: GrapbDB のバグの可能性 (コメントを参照)
GraphDB に次のナレッジ ベースがあります。
PREFIX : <http://my_awesome_cats_collection#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
:foo a :cat ;
:name 'Marble' ;
owl:sameAs wd:Q27745011 .
# and many other cats
この連合クエリを試しました
select * where {
# remote service
SERVICE <https://query.wikidata.org/sparql> {
?cat wdt:P463 ?membership
}
?cat :name ?name .
VALUES ?name {'Marble'}
}
ウィキデータ (つまり、Musashi's の Marble メンバー) から期待どおりの結果が得られました。
次のようにパターンの順序を切り替えると:
select * where {
?cat :name ?name .
VALUES ?name {'Marble'}
# remote service
SERVICE <https://query.wikidata.org/sparql> {
?cat wdt:P463 ?membership
}
}
多くの偽陽性の結果が得られます (つまり、マーブルだけを取得したいのに、ムサシに属する他の猫のデータです。ローカル パターンとリモート パターンの間のクロス積のようなものだと思います)。
SPARQL 1.1の公式ドキュメントでは、次のように述べています。
フェデレーテッド クエリは、VALUES 句を使用して、クエリの他の部分の評価からのソリューション バインディングに基づいて、リモート エンドポイントから受信した結果を制限する場合があります。
(抜粋は有益です。これを指摘してくれた@TallTedに感謝します)
では、フェデレーションの場合VALUES
、ファイナル フィルターとしてのみ使用できますか? 何が起こっている?
編集:
- クエリは GraphDB で実行されます
- GraphDB クエリ オプティマイザーのバグのようです (Thanks to: Stanislav Kralin)