【发布时间】:2015-03-17 15:23:27
【问题描述】:
我有以下数据:
<node:1><urn:connectTo><node:2>
<node:1><urn:connectTo><node:3>
<node:1><urn:connectTo><node:4>
<node:2><urn:connectTo><node:10>
<node:2><urn:connectTo><node:11>
<node:2><urn:connectTo><node:12>
<node:3><urn:connectTo><node:21>
<node:3><urn:connectTo><node:13>
<node:3><urn:connectTo><node:41>
<node:3><urn:connectTo><node:100>
<node:4><urn:connectTo><node:119>
<node:4><urn:connectTo><node:120>
如您所见,每个节点都有多个连接。我想为每个节点随机选择一个连接。我怎样才能做到这一点?我尝试了以下查询,但都没有解决问题:
-
select ?currentNode ?nextNode where { ?currentNode ?p ?nextNode BIND(RAND() AS ?orderKey) } ORDER BY ?orderKey LIMIT 1 -
select ?currentNode SAMPLE(?nextNode) as ?nextNode1 where { ?currentNode ?p ?nextNode } GROUP BY ?currentNode注意:结果给出了每个节点的第一个连接,但不是随机的
select ?currentNode ?nextNode (COUNT(?nextNode) AS ?noOfChoices) where { ?currentNode ?p ?nextNode BIND(RAND() AS ?orderKey) } GROUP BY ?currentNode ORDER BY ?orderKey OFFSET (RAND()*?noOfChoices) LIMIT 1
【问题讨论】:
-
样品肯定是要走的路。您是否尝试过将 1) 与 2) 混合使用?即随机排序,然后分组抽样。 (我怀疑我们处于未定义行为的领域)
-
对带有 rand 的子查询的结果使用 sample 可以获得您想要的结果,至少在使用 Apache Jena 时是这样。但是,我不认为这种行为是有保证的。
标签: random rdf sparql semantic-web