2013-06-19 27 views
0

假設數據是這樣的:限制SPARQL結果對非反思對

<event1> member <A> 
<event1> member <B> 
<event1> member <C> 
<event2> member <D> 
<event2> member <E> 

我要找的是經由相同的會員活動連接對。即在這裏:

A B 
A C 
B C 
D E 

和顛倒的順序可能會或可能不會包括(這兩個罰款我的用例)。 H但是,像這樣

select distinct ?x ?y 
    where {?m member ?x. ?m member ?y} 

查詢還將包括瑣碎對像A AB B

我該如何限制結果給不同的?x和?y? 我嘗試添加?x != ?y在另一三聯where子句,並通過過濾器,但既不似乎工作

+0

我不希望'?x!=?y'以三重模式工作,因爲它不是三重模式。你可以使用'FILTER'顯示沒有工作的案例嗎? 'FILTER(?x!=?y)'應該工作,這取決於'?x'和'?y'的類型。如果第一個不工作,'FILTER(!sameTerm(?x,?y))'會更普遍一些。 –

回答

0

我解決這樣說:

select distinct ?x ?y 
    where {?m member ?x. ?m member ?y. filter(!(?x = ?y))} 

這並獲得成功對我來說,雖然filter(?x != ?y)導致空結果。 我不確定這是真的SPARQL相關或rdf3x mssing功能,我使用的三重商店

+1

這裏的'?x'和'?y'是什麼樣的值?根據這一點,你可能想要考慮['sameTerm'](http://www.w3.org/TR/sparql11-query/#func-sameTerm),你可以使用'FILTER(!sameTerm(?x ,?y))'。 –

+0

?x和?y是實體 –

4

雖然您發佈了an answer適合您,我會指出您遇到問題的語法似乎不是SPARQL問題,而是使用您使用的存儲/ SPARQL引擎。使用耶拿的ARQ,我可以加載以下data.n3並執行以下query.sparql和獲取你所描述的結果:

data.n3

@prefix : <http://example.org/> . 

:event1 :member :a . 
:event1 :member :a . 
:event1 :member :b . 
:event2 :member :c . 
:event2 :member :d . 

query.sparql

PREFIX : <http://example.org/> 

SELECT ?x ?y WHERE { 
    ?event :member ?x, ?y . 
    FILTER(?x != ?y) 
} 

這結果時使用Jena的命令行工具運行:

$ arq --query query.sparql --data data.n3 
----------- 
| x | y | 
=========== 
| :d | :c | 
| :c | :d | 
| :b | :a | 
| :a | :b | 
----------- 
+0

我能夠用您的示例重現相同的行爲。看起來rdf3x不喜歡!=(而ARQ確實)。對於rdf3x來說,!(?x =?y)可以做到這一點。 –