0

假设这样的数据:

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

我正在寻找通过同一会员活动连接的对。即这里:

A B
A C
B C
D E

并且可能会或可能不会包括相反的顺序(对于我的用例来说都很好)。但是,像这样的查询

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

还将包括琐碎的对,例如A Aor B B

如何将结果限制为具有不同 ?x 和 ?y 的结果?我尝试?x != ?y在 where 子句和 FILTER 中添加另一个三元组,但似乎都不起作用

4

2 回答 2

4

尽管您发布了一个适合您的答案,但我会指出您遇到问题的语法似乎不是 SPARQL 问题,而是您使用的 store/SPARQL 引擎。使用 Jena 的 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 |
-----------
于 2013-06-19T15:42:55.230 回答
0

我是这样解决的:

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

这对我有用,同时filter(?x != ?y)导致了一个空的结果。我不确定这是否真的与 SPARQL 相关或我使用的三重存储 rdf3x 中的 mssing 功能

于 2013-06-19T15:26:17.300 回答