为一个谓词随机取两个不同的对象
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" |
--------------------------------------
我有一个这样的 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
请注意,适用于链接问题的相同警告,
---------------------------------------
| 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" |
--------------------------------------