假设这样的数据:
<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 A
或B B
等琐碎对。
如何将结果限制为具有不同?x和?y的结果?
我尝试在where子句中添加?x != ?y
作为另一个三元组并通过FILTER但似乎都不起作用
答案 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功能,我使用的三重商店