random - sparql:为每个节点随机选择一个连接

标签 random rdf sparql semantic-web

我有以下数据:

<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>

如您所见,每个节点都有多个连接。我想为每个节点随机选择一个连接。我怎样才能做到这一点?我已尝试以下查询,但没有解决问题:

  1. select ?currentNode ?nextNode where {
      ?currentNode ?p ?nextNode
      BIND(RAND() AS ?orderKey)
    }
    ORDER BY ?orderKey
    LIMIT 1
    
  2. select ?currentNode SAMPLE(?nextNode) as ?nextNode1
    where {
      ?currentNode ?p ?nextNode
    }
    GROUP BY ?currentNode
    

    注意:结果给出了每个节点的第一个连接,但不是随机的

  3. 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
    

最佳答案

sample aggregate返回组内的个体:

Sample is a set function which returns an arbitrary value from the multiset passed to it. … For example, given Sample({"a", "b", "c"}), "a", "b", and "c" are all valid return values. Note that Sample() is not required to be deterministic for a given input, the only restriction is that the output value must be present in the input multiset.

这将是一个如下查询:

prefix node: <node:>
prefix urn: <urn:>

select ?source (sample(?_target) as ?target) where {
  ?source urn:connectTo ?_target
}
group by ?source

---------------------
| source | target   |
=====================
| node:1 | node:2   |
| node:2 | node:10  |
| node:3 | node:13  |
| node:4 | node:119 |
---------------------

当然,正如您所注意到的,实现只需返回任意个体。每次都很容易相同。您可以在子查询中进行一些排序,并希望随机化目标的顺序,以便从样本获得不同的结果,但不要求结果的顺序子查询也被保留。看起来像这样:

prefix node: <node:>
prefix urn: <urn:>

select ?source (sample(?_target) as ?target) where {
  { select ?source ?_target {
      ?source urn:connectTo ?_target
    }
    order by rand() }
}
group by ?source

这似乎适用于 Apache Jena。以下是重复调用的结果:

---------------------
| source | target   |
=====================
| node:1 | node:2   |
| node:2 | node:11  |
| node:3 | node:100 |
| node:4 | node:120 |
---------------------

---------------------
| source | target   |
=====================
| node:1 | node:3   |
| node:2 | node:11  |
| node:3 | node:13  |
| node:4 | node:120 |
---------------------

---------------------
| source | target   |
=====================
| node:1 | node:3   |
| node:2 | node:10  |
| node:3 | node:21  |
| node:4 | node:119 |
---------------------

---------------------
| source | target   |
=====================
| node:1 | node:3   |
| node:2 | node:10  |
| node:3 | node:100 |
| node:4 | node:119 |
---------------------

关于random - sparql:为每个节点随机选择一个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29103024/

相关文章:

python - 使用 txt 文件作为输入创建 RDF 文件

sparql - 构造成命名图

SPARQL group by 和 order by : not ordered

unit-testing - 测试随机值 - 关于这种方法的想法?

javascript - Math.random() 是加密安全的吗?

jquery - 触发鼠标进入随机元素

java - 如何制作一个包含另一个数组的随机元素对的二维数组?

rdf - 选择主题和 rdf :type in a SPARQL query

Django RDF 支持?

javascript - 在 HTML 中格式化 SPARQL 查询时的 JSON 和 JavaScript 集成