如何解决如何从SPARQL中选择随机DBPedia节点?
| 如何使用sparql端点从DBpedia中选择随机样本? 这个查询SELECT ?s WHERE { ?s ?p ?o . FILTER ( 1 > bif:rnd (10,?s,?p,?o) ) } LIMIT 10
(在这里找到)
在大多数SPARQL端点上似乎都可以正常工作,但是在http://dbpedia.org/sparql上,它已被缓存(因此它总是返回相同的10个节点)。
如果我从JENA尝试,则会收到以下异常:
Unresolved prefixed name: bif:rnd
而且我找不到\'bif \'名称空间是什么。
关于如何解决这个问题的任何想法?
慕罗尼
解决方法
bif:rnd
不是SPARQL标准,因此不能移植到任何SPARQL端点。您可以使用LIMIT,ORDER和OFFSET来模拟带有标准查询的随机样本。就像是 ...
SELECT * WHERE { ?s ?p ?o }
ORDER BY ?s OFFSET $some_random_number$ LIMIT 10
其中some_random_number
是您的应用程序生成的数字。这样可以避免缓存问题,但是此查询无论如何都是昂贵的,而且我不知道公共端点是否会支持它。
尽量避免使用完全开放的模式(例如?s ?p ?o
),您的查询会更加高效。
,在SPARQL 1.1中,您可以执行以下操作:
SELECT ?s
WHERE {
?s ?p ?o
}
ORDER BY RAND()
LIMIT 10
我不知道有多少家商店会优化,甚至还没有实施。
[请参阅下面的评论,这不太有效]
替代方法是:
SELECT (SAMPLE(?s) AS ?ss)
WHERE { ?s ?p ?o }
GROUP BY ?s
但是我认为优化的可能性更低。
,bif:rnd是Virtuoso特定的扩展,因此将仅在Virtuoso SPARQL端点上再次起作用。
bif是Virtuoso内置函数的前缀,该函数使SPARQL中可以调用任何Virtuoso函数,而rnd是用于返回随机数的Virtuoso函数。
,我遇到了同样的问题,这里没有解决方案可以解决我的问题。这是我的解决方案;这是不平凡的,而且很hack。到目前为止,该方法适用于DBPedia,并且可能适用于其他SPARQL端点,但是不能保证它可用于将来的发行版。
DBPedia使用Virtuoso,它支持RAND
函数的未记录参数。该参数有效地指定了用于PRNG的范围。游戏的目的是欺骗Virtuoso相信输入的参数不能在计算每个结果行之前进行静态求值,从而迫使程序对每个绑定求RAND()
:
select * {
?s dbo:isPartOf ?o . # Whatever your pattern is
bind(rand(1 + strlen(str(?s))*0) as ?rid)
} order by ?rid
魔力发生在rand(1 + strlen(str(?s))*0)
中,它等效于rand()
;但是通过利用程序无法预测涉及某个变量的表达式的值来强迫它在每次匹配上运行(在这种情况下,我们只是将IRI的长度计算为字符串)。实际表达式并不重要,因为我们将其乘以0
即可完全忽略它,然后加上1
以使rand
正常执行。
这之所以起作用,是因为开发人员在表达式的静态代码评估中没有走得那么远。他们可以很容易地为“乘以零”编写一个分支,但是可惜他们没有:)
,以上方法均不适用于Jena / Fuseki,因此我以另一种方式进行了处理:
SELECT DISTINCT ?s ?p ?o
{
?s ?p ?o.
BIND ( MD5 ( ?s ) AS ?rnd)
}
ORDER BY ?rnd ?p
LIMIT 100
显然,这不会选择随机三元组,但是前k个按MD5排序的受试者组应具有统计学上显着的样本的相关特征(即样本代表整个人群,没有特定的选择偏差)。
,SELECT ?s WHERE {
?s ?p ?o .
bind(<SHORT_OR_LONG::bif:rnd> (10,?s,?p,?o) as ?rid)
}
ORDER BY ?rid
LIMIT 10
这个怎么样?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。