如何从SPARQL中选择随机DBPedia节点?

Mul*_*one 6 random sample sparql dbpedia

如何使用sparql端点从DBpedia中选择随机样本?

这个查询

SELECT ?s WHERE { ?s ?p ?o . FILTER ( 1 > bif:rnd (10, ?s, ?p, ?o) ) } LIMIT 10
Run Code Online (Sandbox Code Playgroud)

(在这里找到)似乎在大多数SPARQL端点上都可以正常工作,但在http://dbpedia.org/sparql上它会被缓存(因此它总是返回相同的10个节点).

如果我从JENA尝试,我会得到以下异常:

Unresolved prefixed name: bif:rnd
Run Code Online (Sandbox Code Playgroud)

我找不到'bif'名称空间是什么.

关于如何解决这个问题的任何想法?

Mulone

Ste*_*ris 10

在SPARQL 1.1中,您可以执行以下操作:

SELECT ?s
WHERE {
  ?s ?p ?o
}
ORDER BY RAND()
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

我不知道有多少商店会优化,甚至实现这一点.

[见下面的评论,这不太有效]

另一种选择是:

SELECT (SAMPLE(?s) AS ?ss)
WHERE { ?s ?p ?o }
GROUP BY ?s
Run Code Online (Sandbox Code Playgroud)

但我认为更不可能进行优化.

  • 我相信RAND()仅被调用一次,因此对于所有结果它将是相同的值。如果是这样,请尝试使用“((SHA512(CONCAT(str(?s),str(RAND()))))作为随机)”和“按顺序随机订购” (2认同)

Man*_*res 6

bif:rnd不是SPARQL标准,因此不能移植到任何SPARQL端点.您可以使用LIMIT,ORDER和OFFSET来模拟带有标准查询的随机样本.就像是 ...

SELECT * WHERE { ?s ?p ?o } 
ORDER BY ?s OFFSET $some_random_number$ LIMIT 10
Run Code Online (Sandbox Code Playgroud)

some_random_number您的应用程序生成的数字在哪里.这应该避免缓存问题,但这个查询反正非常昂贵,我不知道公共端点是否会支持它.

尽量避免完全打开模式?s ?p ?o,您的查询将更加高效.

  • 我的选择顺序不是随机的,而是随机数的OFFSET会给你一个随机样本.这是OFFSET需要随机生成的东西. (2认同)