2011-04-25 45 views
5

我試圖在python實現中使用INNOT IN語句(即如果我理解正確,在SPARQL 1.1中引入)的SPARQL(現在在rdfextras),但似乎語法不被識別。如何在python rdflib中運行IN和NOT SPARQL語句以刪除兩個圖形的交集

讓我們考慮兩組(A和B)。我想輸出的是在設置A,去除什麼是集合B

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

也許在SPARQL 1.1加入這個特別的事情,而不是由​​支持,在這種情況下,我很想有一個解決辦法(或如何做到這一點,而不使用NOT IN關鍵字)

回答

4

我試過類似的查詢,也得到了解析異常。我已經通過rdflib's SPARQL parser代碼,它似乎並不存在一個規則來處理INNOT IN。我會假設這個功能沒有實現。

無論如何,我不知道你是否正確使用它。查看SPARQL 1.1 spec中的NOT IN定義...它定義了要用於表達式列表的IN運算符。因此,你會怎麼做:

FILTER (?item NOT IN (?SetB))

而且我不能完全肯定,如果你能在右邊使用變量,因爲在規範用語所有的例子。 編輯:看RobV消息,有可能在RLH使用變量

使用一個查詢

一個可能的解決方案

的解決方法,這可能爲你工作是使用 OPTIONALbound(在支持rdflib)。像...

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

不知道更多關於您的查詢我不能更好地與這種情況下建議。

解決方法有兩個查詢

最簡單的方法來解決這個與rdlib是使用過濾器和兩個查詢,第一個查詢檢索所有更多鈔票值?SetB。螞蟻在第二個查詢動態創建 過濾器:

SELECT ?title WHERE { 
    some logic defining ?item 
    FILTER (?item != <setb_val1> && ?item != <setb_val2> && 
    ... && ?item != <setb_val2>) 
} 
+0

這就是我一直在尋找的東西。 – 2011-04-27 09:00:58

+0

在IN/NOT IN表達式的RHS中使用變量應該是合法的,RHS被定義爲1.1語法中的'ExpressionList',它允許任何「Expression」生成列表,即任何有效表達式,因此這應該包含變量 – RobV 2011-04-27 12:17:06

+0

很有意思,謝謝Rob。規範中的示例有點誤導。 – 2011-04-27 12:51:41

2

難不具體回答,但它聽起來像你想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有點讓人誤解:據我所知,它可以通過列表表達式進行操作,而不是您可以定義的列表。

+0

我不認爲'MINUS'是在RDFLIB中實現的,但不錯。 – 2011-04-25 19:55:20

+0

是的,'MINUS'是1.1的一個特性,因此在rdflib中沒有實現。 (但是,這也是我也來的有力解決方案) – 2011-04-27 08:59:19