14

オントロジーの特定のクラスに関連するプロパティのリストを DBPedia に照会しようとしていますが、人間が読める「ラベル」が常に明確であるとは限らないため、データベースからの例も提供したいと思います。問題は、個別のプロパティをすべて選択したいのに、各プロパティの 1 つの例だけが必要なことです。をキャプチャせずに私のクエリがどのように見えるかを次に示します。

SELECT DISTINCT ?prop ?title WHERE {
    ?thing ?prop [].
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    ?prop rdfs:label ?title.
} ORDER BY DESC(COUNT(DISTINCT ?thing))
LIMIT 100

このように変更すると、?prop の値が重複し始めます。

SELECT DISTINCT ?prop ?title ?example WHERE {
    ?thing ?prop ?example.
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    ?prop rdfs:label ?title.
} ORDER BY DESC(COUNT(DISTINCT ?thing))
LIMIT 100

私は SPARQL とデータベース クエリ全般を使用することに非常に慣れていないため、これを行う方法がまったくわかりません。理想的には、DISTINCT(?prop) ?title ?example のようなものを用意します。これは、prop のすべての一意の値を選択し、そのタイトルと例を返します。

4

3 に答える 3

10

2 番目のクエリでは、distinct は と の値の組み合わせに適用され?prop ?titleます?example。したがって、たとえば、2 番目のクエリで取得された次の 2 つの行については、重複は取得されません。

dbpedia2:subunitName    "subunit name "@en  "cent"@en
dbpedia2:subunitName    "subunit name "@en  "centavo"@en

3 行目?exampleには 2 つの異なる値が"cent"@enあり、"centavo"@en

これを解決する 1 つの考えられる方法は、 and を使用GROUP BYして、 andMINの最低ランクの値だけを取得することです。つまり、次のようになります。?label?example

SELECT ?prop MIN(?title) MIN(?example) WHERE {
    ?thing ?prop ?example.
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    ?prop rdfs:label ?title.
} GROUP BY ?prop
于 2011-03-22T21:15:32.453 に答える
5

サブクエリで目的を達成する別の方法を次に示します。

SELECT ?prop ?title ?example 
WHERE 
{
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    { SELECT ?title ?example WHERE { ?thing ?prop ?example . ?prop rdfs:label ?title. } LIMIT 1 }
}
LIMIT 100

これには、SPARQL 1.1 標準に準拠しているという利点があります。コメントで述べたように、集計による順序付けは標準では許可されていないため、クエリの移植性を制限するベンダー固有の拡張機能を使用しています。

SPARQL 1.1 実装間で移植可能な方法で集計値で並べ替えたい場合は、最初に次のように射影する必要があります。

SELECT ?s (COUNT(?p) AS ?predicates) WHERE
{
  ?s ?p ?o
} GROUP BY ?s ORDER BY DESC(?predicates)
于 2011-03-23T08:55:33.980 に答える