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

Rdf 将SPARQL结果对限制为非自反对,rdf,sparql,semantic-web,Rdf,Sparql,Semantic Web,假设数据如下: <event1> member <A> <event1> member <B> <event1> member <C> <event2> member <D> <event2> member <E> 相反的顺序可能包括,也可能不包括(对于我的用例都可以)。 owever,像这样的问题 select distinct ?x ?y where {?m mem

假设数据如下:

<event1> member <A>
<event1> member <B>
<event1> member <C>
<event2> member <D>
<event2> member <E>
相反的顺序可能包括,也可能不包括(对于我的用例都可以)。 owever,像这样的问题

select distinct ?x ?y 
  where {?m member ?x. ?m member ?y}
还将包括诸如
aa
bb
之类的普通对

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

我这样解决它:

select distinct ?x ?y 
   where {?m member ?x. ?m member ?y. filter(!(?x = ?y))}
这对我起到了作用,而
过滤器(?x!=?y)
导致了一个空结果。 我不确定这是否真的与SPARQL相关,还是rdf3x中的mssing功能,我使用的三重存储是这样解决的:

select distinct ?x ?y 
   where {?m member ?x. ?m member ?y. filter(!(?x = ?y))}
这对我起到了作用,而
过滤器(?x!=?y)
导致了一个空结果。 我不确定这是不是真的与SPARQL相关,还是rdf3x中的mssing功能,我使用的三重存储

虽然你发布了适合你的功能,但我要指出,你遇到问题的语法似乎不是SPARQL问题,而是你使用的存储/SPARQL引擎。使用Jena的ARQ,我可以加载以下
数据.n3
并执行以下
查询.sparql
并获得您描述的结果:

数据.n3

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

:event1 :member :a .
:event1 :member :a .
:event1 :member :b .
:event2 :member :c .
:event2 :member :d .
以下是使用Jena的命令行工具运行时的结果:

$ arq  --query query.sparql --data data.n3 
-----------
| x  | y  |
===========
| :d | :c |
| :c | :d |
| :b | :a |
| :a | :b |
-----------
虽然您发布了适合您的语法,但我要指出,您遇到问题的语法似乎不是SPARQL问题,而是您使用的store/SPARQL引擎。使用Jena的ARQ,我可以加载以下
数据.n3
并执行以下
查询.sparql
并获得您描述的结果:

数据.n3

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

:event1 :member :a .
:event1 :member :a .
:event1 :member :b .
:event2 :member :c .
:event2 :member :d .
以下是使用Jena的命令行工具运行时的结果:

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

这里的
?x
?y
是什么类型的值?根据这一点,您可能需要考虑,可以使用“代码>筛选器(.sAuthErm(?x,y))< /代码>。根据这一点,您可能需要考虑,可以使用“代码>筛选器(.sAuthErm(?x,y))< /代码>。我不希望<代码> x!=?y以三重模式工作,因为它不是三重模式。但是,你能用不起作用的
过滤器来显示案例吗<代码>过滤器(?x!=?y)
应该可以工作,这取决于
?x
?y
的类型<如果第一个过滤器不工作,代码>过滤器(!sameTerm(?x,?y))会更通用一些。我不希望
?x!=?y
以三重模式工作,因为它不是三重模式。但是,你能用不起作用的
过滤器来显示案例吗<代码>过滤器(?x!=?y)
应该可以工作,这取决于
?x
?y
的类型<代码>过滤器(!sameTerm(?x,?y))会更一般一些,如果第一个过滤器不起作用。我能够用您的示例重现相同的行为。似乎rdf3x不喜欢!=(而ARQ则如此)。对于rdf3x!(?x=?y)成功了。我可以用你的例子重现同样的行为。似乎rdf3x不喜欢!=(而ARQ则如此)。对于rdf3x!(?x=?y)起作用。