Als SPARQL ist eine Musterabgleich Sprache, der Trick, wenn Ihre Abfrage-Ergebnis „zu breit/General“ ist, ist zu schafft ein spezifisches Muster . In diesem Fall besteht Ihre Absicht nicht nur darin, alle Ressourcen zurückzuerhalten, die als dbo:birthPlace
-Werte markiert sind, sondern auch als nur Ressourcen, die US-Bundesstaaten repräsentieren.
Also müssen wir herausfinden, wie sich US-Bundesstaaten von anderen Standorten in DBPedia unterscheiden.
Nehmen wir Kentucky als ein Beispiel. Die Ressource, die Kentucky darstellt, ist http://dbpedia.org/resource/Kentucky. Wenn wir die Seite herunterblättern, die die Eigenschaften dieser Ressource beschreibt, finden wir mehrere Einträge für die rdf:type
-Beziehung, aber diejenige, die bei mir als am besten geeignet herausspringt, ist yago:WikicatStatesOfTheUnitedStates
(http://dbpedia.org/class/yago/WikicatStatesOfTheUnitedStates).
Wenn wir Ihre Abfrage ändern, dass als zusätzliche Beschränkung setzen in, und legen Sie den seltsamen regulären Ausdruck, etwa so:
SELECT DISTINCT ?person ?birthPlace ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
?birthPlace a yago:WikicatStatesOfTheUnitedStates .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
sollten Sie bekommen, was Sie brauchen.
Leider, wenn Sie versuchen, finden Sie, dass Sie nicht. Dies liegt daran, dass DBPedia-Daten unordentlich sind. Die obige Abfrage gibt nur drei Ergebnisse, und schlimmer noch, ein Ergebnis ist eindeutig falsch:
person birthPlace presidentStart presidentEnd
dbr:Barack_Obama dbr:Hawaii
dbr:George_Washington dbr:Virginia
dbr:Theodore_Roosevelt dbr:New_York_City
es zwei Dinge, ist hier los: Zunächst einmal, New York City ist falsch als Staat in DBPedia eingestuft. Zweitens haben die meisten Präsidenten ihren Staat nicht ausdrücklich als ihren Geburtsort markiert, sondern nur Dinge wie ihre Heimatstadt.
Zum Glück können wir etwas ändern. DBPedia weiß, dass HodgenVille, Kentucky, in Kentucky liegt. Woher weiß es das? Nun, werfen Sie einen Blick auf die Ressourcen-Seite für Hodgenville: http://dbpedia.org/resource/Hodgenville,_Kentucky.Sie werden sehen, dass es eine dbo:isPartOf
Beziehung mit der Ressource, die den Bundesstaat Kentucky darstellt, hat.
Also müssen wir unsere Abfrage noch einmal umformulieren: Wir wollen den Status für jeden Präsidenten, wo ihr Geburtsort Teil dieses Staates ist. In SPARQL:
SELECT DISTINCT ?person ?birthState ?presidentStart ?presidentEnd
WHERE {
?person dct:subject dbc:Presidents_of_the_United_States.
?person dbo:birthPlace ?birthPlace .
?birthPlace dbo:isPartOf ?birthState .
?birthState a yago:WikicatStatesOfTheUnitedStates .
OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } .
OPTIONAL { ?person dbp:presidentStart ?presidentStart } .
}
GROUP BY ?person
ORDER BY ?presidentStart ?person
LIMIT 100
Dies sollte Sie fast vollständig das Ergebnis erhalten, das Sie brauchen.
Update wie Sie notiert, Donald Trump fehlt von der Liste. Das liegt daran, dass DBPedia hinter der Zeit zurückliegt und er immer noch als Präsidentschaftskandidat und nicht als Präsident eingestuft wird.
Da für Grover Cleveland vier Mal erscheint, ist dies eine interessante Anomalie. Cleveland diente zwei nicht aufeinanderfolgende Bedingungen als Präsident, von 1885 bis 1889 und wieder von 1893 bis 1897. So gibt es zwei Startdaten und zwei Enddaten. Da in DBPeda nicht explizit modelliert wird, welches Startdatum zu welchem Enddatum gehört, erhalten Sie für jede Kombination von Start- und Enddatum, insgesamt vier, ein Ergebnis. Es kann eine Möglichkeit geben, um diese Frage abzufragen (eine Option wäre, das Start- und Enddatum zusammen mit einem group_concat
Aggregat zu gruppieren), aber es ist ein solcher Kantenfall, dass es einfacher sein könnte, es einfach in der Nachbearbeitung zu handhaben.
Mögliche Duplikate von [Ergebnisse der SPARQL-Abfrage aggregieren] (https://stackoverflow.com/questions/18212697/aggregating-results-from-parql-query) –
Geringfügige Änderung, es ist kein Duplikat, weil Sie es suchen Zoom auf einen bestimmten Wert, anstatt aggregieren. –