クエリ
次のようなクエリが必要なようです。
SELECT ?philosopher ?pName ?influence (SAMPLE(?iName) as ?iName)
WHERE {
# This subquery selects all the philosophers and
# selects just one of their names .
{
SELECT ?philosopher (SAMPLE(?pName) as ?pName) WHERE {
?philosopher a dbpedia-owl:Philosopher ;
foaf:name ?pName .
}
GROUP BY ?philosopher
}
# This main query selects the influence of the
# philosophers and select their names. The GROUP
# BY on the outer query puts all the
# (?philosopher,?pName,?influence,?iName) tuples
# that have the same ?philosopher, ?pName, and
# influence together, and the (SAMPLE(?iName) as ?iName)
# in the outer SELECT combines them all, choosing an
# arbitrary representative ?iName.
?influence dbpedia-owl:influenced ?philosopher ;
a dbpedia-owl:Philosopher ;
foaf:name ?iName .
}
GROUP BY ?philosopher ?pName ?influence
SPARQL の結果
名前だけに興味があり、実際のリソースを選択することを気にしない場合は、必要なく?philosopher
、?influence
最も外側SELECT
にあり、それを作成できます
SELECT ?pName (SAMPLE(?iName) as ?iName)
WHERE { …
SPARQL の結果
ORDER BY
結果を確認しやすくするために、最後にを追加することもできます。
…
GROUP BY ?philosopher ?pName ?influence
ORDER BY ?pName
SPARQL の結果
Plato の場合、これらの最後の結果には次の行が含まれます。
"Plato"@en "Socrates"@en
"Plato"@en "Parmenides"@en
"Plato"@en "Zeno of Elea"@en
"Plato"@en "Pythagoras"@en
"Plato"@en "Gorgias"@en
"Plato"@en "Protagoras"@en
"Plato"@en "Heraclitus"@en
ここに書いたクエリでは、哲学者の s のSAMPLE
1 つを任意に選択していましたが、値を選択するために使用できる 集約代数foaf:name
には他の関数があります。順番に「最初の」値が必要な場合は、Minに興味があるかもしれません。
サブクエリ、GROUP BY、SAMPLE、MIN など
これは、実際には、SPARQL 仕様のセクション 12、サブクエリでサブクエリについて示した例と非常によく似ています。その例では、次のクエリを使用して、Alice が知っている人を選択し、それぞれについて、人の名前を 1 つだけ選択します。
PREFIX : <http://people.example/>
SELECT ?y ?minName
WHERE {
:alice :knows ?y .
{
SELECT ?y (MIN(?name) AS ?minName)
WHERE {
?y :name ?name .
} GROUP BY ?y
}
}
これは、哲学的影響力の問題に適応するのはそれほど難しくありませんでした。哲学者の問題は、すべての哲学者とその名前を選択し、実際の哲学者リソースでグループ化し、サンプルを使用して各哲学者の代表的な名前を選ぶことから始まりました。外側のクエリも同じことを行いますが、哲学者を選択するのではなく、各哲学者に影響を与えたエンティティを選択しています。結果はグループ化され、影響の代表的な名前が選択されます。