2014-01-30 46 views
0

我有類似:SPARQL不同運營商

SELECT DISTINCT ?name1 
WHERE { 
GRAPH <blabla> 
{ 
?k swrc:author ?x. 
?x foaf:name ?name1. 
}. 
GRAPH <blabla2> 
{ 
?l swrc:author ?y. 
?y foaf:name ?name2. 
}. 
FILTER(?x != ?y). 
} 

我想什麼是隻存在於第一個圖布拉布拉名稱。 直觀地反駁我得到一些實際屬於交叉點的名稱。發生這種情況是因爲b(集合A)= b(集合B)? 。什麼是!=的正確語義?我怎樣才能超越這個問題?

+0

命名圖只是三元組的集合。它並不「擁有」出現在三元組中的資源。 RDF資源是URI,空白節點或文字。無論出現什麼圖形,URI都是一樣的。這實際上是使用URI作爲標識符的一大特點。這意味着你可以描述一些資源,其他人也可以。 –

+0

鑑於無論它們出現在哪裏的URI都是相同的,這看起來像您之前的問題(在SPARQL中設置差異)的副本(http://stackoverflow.com/q/21391444/1281433),模仿了以下事實:使用不同的模式來綁定變量。它仍然是一個問題:如果你想要一個設置差異'{?e:e in A,e not in B}',你需要一個像''?e是A ...的元素的查詢...過濾器不存在{...?e是B的一個元素}。 –

回答

3

!=的語義正是它左邊的參數不等於它的正確參數。但是FILTER會針對每種可能的數值組合進行評估 - 因此,您制定的查詢將返回所有?x的名稱值,其中的某些值與?y的值不相等。

如果你想找回的?x唯一的名字,值其?y所有值不等於它,你應該使用NOT EXISTS條款:

SELECT DISTINCT ?name1 
WHERE { 
GRAPH <blabla> 
{ 
    ?k swrc:author ?x. 
    ?x foaf:name ?name1. 
} 
FILTER NOT EXISTS { 
    GRAPH <blabla2> 
    { 
     ?l swrc:author ?x. 
    } 
    } 

}

請注意,使用這種方法實際上可以完全擺脫變量?y:您將條件更改爲僅檢查在第一個圖中找到的作者?x不會在第二個圖中出現。