2016-07-17 4 views
3

レッツは、私がSPARQLクエリが一部だけではなく、すべてのプロパティを持つインスタンスを取得するために

uri:ObjA1 uri:propAA uri:Obj1A . 
uri:ObjA1 uri:propAA uri:Obj1B . 

uri:ObjA2 uri:propAA uri:Obj1A . 
uri:ObjA2 uri:propAA uri:Obj1B . 
uri:ObjA2 uri:propAA uri:Obj1C . 

が、私は何をしようとしていることだけに値Obj1AとObj1Bを持っているすべてのインスタンスを見つけることであるフォームのトリプルを持っていると言いますpropAA。基本的に、ObjA1はpropAAに対してのみObj1AとObj1Bの値を取るため、クエリはObjA1を返し、ObjA2は返しません。私が今いるのは、

SELECT * where { 
    ?sub uri:propAA uri:Obj1A . 
    ?sub uri:propAA uri:Obj1B . 
    FILTER NOT EXISTS { 
     ?sub uri:propAA ?obj . 
     FILTER((?obj != uri:Obj1A) && (?obj != uri:Obj1B)) . 
    } 
} 

です。 FILTER NOT EXISTS句を指定しないと、ObjA1とObjA2の両方が返されます。私が今探しているのは、このクエリを書く良い方法があるかどうかを知ることです。より良い、より効率的、またはより簡潔な(またはその両方)という意味になります。あなたがuri:propAAの値はuri:Obj1Auri:Obj1Bともに?subのためのソリューションを探しているトリプル・パターンの観点から述べると

答えて

0

。これは、SPARQLでの基本的な組み合わせです:

SELECT * 
WHERE { 
    ?sub uri:propAA uri:Obj1A . 
    ?sub uri:propAA uri:Obj1B . 
} 
+0

このクエリを試しましたが、動作しません。 Obj1AとObj1B以外のpropAAの他の値を持つインスタンスは無視されません。私が探しているのは、propAAの値としてObj1AとObj1Bを持つインスタンスだけを取得することです。多かれ少なかれ返されるべきではありません。私が与えた例では、ObjA2の値としてObj1AとObj1Bを除いて、propAAの値としてObj1Cもあるので、ObjA2は返されません。 – thisisshantzz

+0

その場合、私はあなたがOPで正しいと思いました。 – scotthenninger

0

あなたは少しNOT IN演算子を使用して、そしてまた、トリプルパターンの繰り返しを避けるために,コネクタを使用して物事を短縮することができます:

SELECT * where { 
    ?sub uri:propAA uri:Obj1A, uri:Obj1B . 
    FILTER NOT EXISTS { 
     ?sub uri:propAA ?obj . 
     FILTER(?obj NOT IN (uri:Obj1A, uri:Obj1B)) 
    } 
} 

を、私はどちらかの変更を行います疑いますパフォーマンスの差はありますが、より簡潔で読みやすく(IMHO)もあります。

FWIWでは、ここでの二重否定は、普遍的な定量化を書き換える古典的な方法です。結局のところ、論理的には、∀x P(x)∄x ¬P(x)に等しい。 SPARQLにはFORALL演算子がないため、NOT EXISTSと二重否定を行う必要があります。

関連する問題