2013-06-19 43 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)可以做到这一点。 –