2016-07-17 19 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而不是ObjA2,因爲只有ObjA1僅爲propAA獲取值Obj1A和Obj1B。我現在所擁有的是

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。我現在在尋找的是知道是否有更好的方法來編寫這個查詢?更好意味着更高效或更簡潔(或兩者兼而有之)。

回答

0

地說你正在尋找一個解決方案?sub三重模式方面,其中的uri:propAA值均爲uri:Obj1Auri:Obj1B。這是SPARQL基本的結合:

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

我試過這個查詢,但它不起作用。它不會忽略除了Obj1A和Obj1B之外的其他propAA其他值的實例。我正在尋找的只是那些Obj1A和Obj1B作爲propAA的值的實例。任何或多或少的東西都不應該退回。在我給出的例子中,ObjA2不應該被返回,因爲除了Obj1A和Obj1B作爲propAA的值之外,它還具有Obj1C作爲propAA的值。 – 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)) 
    } 
} 

我懷疑任何變化將使差別,性能明智,但它更簡潔,並且(恕我直言)更容易閱讀。

FWIW,這裏的雙重否定是重寫通用量化的經典方法。畢竟,邏輯上,∀x P(x)等於∄x ¬P(x)。由於SPARQL沒有FORALL運算符,因此您必須使用NOT EXISTS和雙重否定。

相關問題