为一个谓词随机取两个不同的对象

randomly take two different objects for one predicate

我有一个这样的 RDF 数据集:

<subject1> <some_predicate> "Value 1" .
<subject1> <some_predicate> "Value 2" .
<subject1> <some_predicate> "Value 3" .
<subject1> <some_predicate> "Value 4" .
<subject1> <some_predicate> "Value 5" .

<subject2> <some_predicate> "Value 6" .
<subject2> <some_predicate> "Value 7" .
<subject2> <some_predicate> "Value 8" .
<subject2> <some_predicate> "Value 9" .
<subject2> <some_predicate> "Value 10" .

现在,对于每个主题,我希望有两个随机值 "some_predicate"。它们应该是两个不同的。因此,预期结果将类似于:

--------------------------------------------
| subject | random_value_1 | random_value_2 |
============================================
| subject1 | "Value 2"     | "Value 5"      |
| subject2 | "Value 6"     | "Value 7"      |
--------------------------------------------

我找到了这个问题但是,问题是要得到一个值,我需要两个不同的 值。

你可以只是做同样的事情,但它有点复杂。首先 select 其他主题的一个随机值。然后,在外部查询中,select 以相同的方式再增加一个随机值,但与第一个不同(您可以通过删除过滤器来允许相同的值):

select ?subject (sample(?v1) as ?value1) (sample(?v2) as ?value2) {
  { select ?subject ?v1 ?v2 {
      { select ?subject ?v1 {
          ?subject <some_predicate> ?v1
        }
        order by rand() }

      ?subject <some_predicate> ?v2
      filter(!sameTerm(?v1,?v2))
    }
    order by rand()
  }
}
group by ?subject

请注意,适用于链接问题的相同警告,;由于未指定 sample 的实现,因此可以想象它会为您提供非随机结果。以下是使用 Jena 的 ARQ 的一些示例输出:

---------------------------------------
| subject    | value1     | value2    |
=======================================
| <subject1> | "Value 1"  | "Value 2" |
| <subject2> | "Value 10" | "Value 6" |
---------------------------------------

--------------------------------------
| subject    | value1    | value2    |
======================================
| <subject1> | "Value 4" | "Value 1" |
| <subject2> | "Value 8" | "Value 6" |
--------------------------------------

--------------------------------------
| subject    | value1    | value2    |
======================================
| <subject1> | "Value 4" | "Value 3" |
| <subject2> | "Value 6" | "Value 8" |
--------------------------------------