7

SPARQLのPython実装(現在はrdfextrasINにあります)でandNOT INステートメント(正しく理解していれば、SPARQL 1.1で導入されたもの)を使用しようとしていますが、構文が認識されていないようです。

2つのセット(AとB)を考えてみましょう。セットAにあるものを出力し、セットBにあるものを削除したいと思います。

SELECT ?title WHERE {
   some logic defining ?item and ?SetB
   FILTER (?item NOT IN ?SetB)
}

たぶん、この特定のものはSPARQL 1.1で追加されrdfextra、によってサポートされていません。その場合、回避策(またはNOT INキーワードを使用せずにそれを行う方法)が欲しいです。

4

2 に答える 2

7

同様のクエリを試しましたが、解析の例外も発生しました。rdflibのSPARQLパーサーINコードを確認しましたが、またはを処理するルールが存在しないようですNOT IN。この機能は実装されていないと思います。

とにかく、正しく使っているかわかりません。SPARQL 1.1仕様NOT INの定義を見ると、式のリストに対して使用される演算子が定義されています。したがって、次のようにします。IN

FILTER (?item NOT IN (?SetB))

また、仕様のすべての例で用語が使用されているため、右側で変数を使用できるかどうかは完全にはわかりません。 編集:RobVメッセージを参照してください。RLHで変数を使用することが可能です。

1つのクエリによる回避策

OPTIONAL考えられる解決策の1つは、とを使用することですbound(どちらもrdflibでサポートされています)。何かのようなもの ...

SELECT ?title WHERE {
   some logic defining ?item
   OPTIONAL {
   some logic defining ?SetB
   }
   FILTER (bound(?SetB) && ?setB != ?item)
}

あなたの質問についてもっと知らなければ、私はこの場合より良いアドバイスをすることはできません。

2つのクエリによる回避策

rdlibでこれを解決する最も簡単な方法は、フィルターと2つのクエリを使用することです。最初のクエリは、のすべての可能な値を取得します?SetB。2番目のクエリのAntは、動的にフィルターを作成します。

SELECT ?title WHERE {
   some logic defining ?item
   FILTER (?item != <setb_val1> && ?item != <setb_val2> &&
   ... && ?item != <setb_val2>)
}
于 2011-04-25T19:53:12.147 に答える
4

詳細なしで答えるのは難しいですが、あなたが望むように聞こえますMINUS

SELECT ?title WHERE {
    ?item ... ITEM CRITERIA ...
    MINUS { ?item ... SET CRITERIA ... }
}

例えば:

SELECT ?title WHERE {
    ?item ex:colour "red" .       # item is red
    MINUS { ?item ex:size "big" } # but not in set of big things
}

NOT IN少し誤解を招く可能性があります。私が知る限り、定義できるリストではなく、リスト式に対して機能します。

于 2011-04-25T19:53:27.713 に答える