6

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」名前空間が何であるかがわかりません。

これを解決する方法について何か考えはありますか?

ムロン

4

7 に答える 7

9

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

しかし、それが最適化される可能性はさらに低いと思います。

于 2011-04-15T19:37:23.907 に答える
6

bif:rndSPARQL 標準ではないため、どの SPARQL エンドポイントにも移植できません。LIMIT 、 ORDER 、および OFFSET を使用して、標準クエリでランダム サンプルをシミュレートできます。何かのようなもの ...

SELECT * WHERE { ?s ?p ?o } 
ORDER BY ?s OFFSET $some_random_number$ LIMIT 10

は、アプリケーションによって生成される数値some_random_numberです。これによりキャッシュの問題は回避されるはずですが、このクエリはいずれにしても非常に高価であり、パブリック エンドポイントがサポートするかどうかはわかりません。

のような完全にオープンなパターンを避けるよう?s ?p ?oにしてください。クエリはより効率的になります。

于 2011-04-15T14:30:54.103 に答える
1

上記の方法はどれも Jena/Fuseki では機能しないため、別の方法で実行しました。

SELECT DISTINCT ?s ?p ?o
{
  ?s ?p ?o.
  BIND ( MD5 ( ?s ) AS ?rnd)
}
ORDER BY ?rnd ?p
LIMIT 100

明らかに、これはランダムなトリプルを選択しませんが、最初の k 個の MD5 順序付けされた被験者のセットは、統計的に有意なサンプルの関連する特徴を持っている必要があります (つまり、サンプルは母集団全体を代表しており、特定の選択バイアスはありません)。

于 2016-11-16T21:52:08.940 に答える
1

同じ問題が発生しましたが、ここに記載されている解決策はどれも私の問題に対処していません。これが私の解決策です。それは自明ではなく、かなりのハックでした。これは現時点で DBPedia で機能し、他の SPARQL エンドポイントでも機能する可能性がありますが、将来のリリースで機能することは保証されていません。

DBPedia は、ドキュメント化されていない引数をRAND関数にサポートする Virtuoso を使用します。引数は、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

これは、開発者が式の静的コード評価でここまで行っていないためにのみ機能します。彼らは簡単に「ゼロを掛ける」ためのブランチを書くことができたでしょうが、残念ながら彼らはそうしませんでした:)

于 2016-02-02T02:11:35.277 に答える
1

bif:rnd は Virtuoso 固有の拡張機能であるため、Virtuoso SPARQL エンドポイントでのみ機能します。

bifは、任意の Virtuoso 関数を SPARQL で呼び出すことを可能にする Virtuoso Built In Functions のプレフィックスです。rndは、乱数を返すための Virtuoso 関数です。

于 2011-04-18T00:00:12.600 に答える
0
SELECT ?s WHERE { 
    ?s ?p ?o . 
    bind(<SHORT_OR_LONG::bif:rnd> (10, ?s, ?p, ?o) as ?rid)
}
ORDER BY ?rid
LIMIT 10

これはどう?

<SHORT_OR_LONG::bif:rnd> は <bif:rnd> よりも優れている可能性があります。( http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtTipsAndTricksGuideRandomSampleAllTriples )

ランダム ID (?rid) をバインド (?s ?p ?o) の各行にバインドし、結果をランダム ID で並べ替えるだけです。

于 2016-09-23T12:12:07.483 に答える