Sparql 如何显示不同的一对学生?

Sparql 如何显示不同的一对学生?,sparql,rdf4j,Sparql,Rdf4j,如果我的图形中有这样的关系,我如何显示不同的学生对: :ST1 :read :BOOK1,:BOOK2,:BOOK3. :ST2 :read :BOOK1,:BOOK2. :ST3 :read :BOOK2. SELECT DISTINCT ?x ?book ?y { ?x :read ?book. ?book ^:read ?y. FILTER(?x != ?y). } 在我的选择中,我有如下内容: :ST1 :read :BOOK1,:BOOK2,:BOOK3. :ST

如果我的图形中有这样的关系,我如何显示不同的学生对:

:ST1 :read :BOOK1,:BOOK2,:BOOK3.
:ST2 :read :BOOK1,:BOOK2.
:ST3 :read :BOOK2.
SELECT DISTINCT ?x ?book ?y
{
   ?x :read ?book.
   ?book ^:read ?y.
   FILTER(?x != ?y).
}
在我的选择中,我有如下内容:

:ST1 :read :BOOK1,:BOOK2,:BOOK3.
:ST2 :read :BOOK1,:BOOK2.
:ST3 :read :BOOK2.
SELECT DISTINCT ?x ?book ?y
{
   ?x :read ?book.
   ?book ^:read ?y.
   FILTER(?x != ?y).
}
但使用我的图形数据,输出将是:

 :ST1 :BOOK1 :ST2
 :ST2 :BOOK1 :ST1 ... etc

我只想显示
:ST1:BOOK1:ST2
关系。

您的问题是,您将DISTINCT放在一个变量中,而只有在显示多个变量时,才能将其应用于一个变量,您可以改为:

SELECT (SAMPLE(?x) as ?xx) ?book (SAMPLE(?y) as ?yy)
 {
   ?y :read ?book.
   ?book ^:read ?x.
   FILTER(?x != ?y).
}
GROUP BY ?book
输出:

:ST1 :BOOK1 :ST2

你能告诉我为什么你只想打印:ST1:BOOK1:ST2,我的意思是你能解释一下你要求的逻辑吗?你想打印读同一本书的学生吗?在这种情况下,您将有:ST1:BOOK 1:ST2和:ST1:BOOK 2:ST2,因为ST1和ST2有两个常用的书,因为当唯一的区别是学生的顺序时,将同一对显示两次是没有意义的。我发现了您的问题,现在我将分享您的答案我不明白您为什么需要在这里分组?我的意思是,只做
FILTER(?x
resp有什么不对。如果三元组存储是挑剔的do
FILTER(str(?x)
?@unformedUser过滤器只防止同一个学生在一个三元组中,如ST1 BOOK1 ST1,因此我们将使用ST1 BOOK1 ST2和ST2 BOOK1 ST1,为了防止这种重复,我们不能只使用distinct,因为我们没有一个变量,这样做的一个可能方法是按书分组,使其成为一个不真实的对象。我的过滤器将始终确保只有
(x,y)
的一个组合,因为
x
y
-如果你不相信我,试试看我已经试过了,在OP的情况下使用过滤器是不够的,他使用了过滤器,但尽管它重复了一次,我给他的解决方案已经尝试过了,而且效果很好,我们都尝试过了,效果很好,对你来说不是很好吗?