Запросы
Похоже, вам нужен запрос вроде:
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"@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
В написанном здесь запросе я использовал SAMPLE
, чтобы произвольно выбрать одну из foaf:name
философии, но есть и другие функции в совокупная алгебра, которую можно использовать для выбора значения. Min может быть вам интересен, если вы хотите «первое» значение по порядку.
Подзапросы, GROUP BY, SAMPLE, MIN и т. Д.
На самом деле это очень похоже на пример, приведенный для подзапросов в разделе 12. , Подзапросы спецификации SPARQL. В этом примере следующий запрос используется для выбора людей, которых знает Алиса, и для каждого из них выбирается только одно из имен людей:
PREFIX : <http://people.example/>
SELECT ?y ?minName
WHERE {
:alice :knows ?y .
{
SELECT ?y (MIN(?name) AS ?minName)
WHERE {
?y :name ?name .
} GROUP BY ?y
}
}
Это было несложно приспособить к проблеме философского влияния. Проблема философов началась с выбора всех философов и их имен, группировки по фактическим философским ресурсам и выбора репрезентативного имени для каждого философа по образцу. Внешний запрос делает то же самое, но вместо отбора философов он выбирает сущности, которые повлияли на каждого философа. Результаты группируются, и выбирается репрезентативное название влияния.
person
Joshua Taylor
schedule
16.06.2013