1

注: 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)
4

1 に答える 1