将SPARQL结果对限制为非自反对

时间:2013-06-19 14:54:12

标签: rdf sparql semantic-web

假设这样的数据:

<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 AB B等琐碎对。

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

2 个答案:

答案 0 :(得分:4)

虽然您发布了适合您的an answer,但我会指出您遇到问题的语法似乎不是SPARQL问题,而是您使用的存储/ 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 |
-----------

答案 1 :(得分:0)

我这样解决了:

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

这对我来说很有用,而filter(?x != ?y)导致了空洞的结果。 我不确定这是否真的与SPARQL相关或者rdf3x中的mssing功能,我使用的三重商店