2017-12-07 4 views
0

Ich laufe von SPARQL Explorer at DBpedia. Ich möchte jeden Präsidenten nur einmal bekommen, aber da einige von ihnen mehrere Einträge für den Geburtsort haben, gibt es mehrere Reihen. Wie kann ich eine bessere SPARQL-Abfrage erstellen, um nur die Daten aus DBpedia zu erhalten? (war: "Wie man mehrere Reihen mit DBPEDIA SPARQL loswird")

SELECT DISTINCT ?person ?birthPlace ?presidentStart ?presidentEnd 
WHERE { 
     ?person dct:subject dbc:Presidents_of_the_United_States. 
     ?person dbo:birthPlace ?birthPlace . 

     OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } . 
     OPTIONAL { ?person dbp:presidentStart ?presidentStart } . 

FILTER (regex(?birthPlace, "_") OR 
     regex(?birthPlace, ";_") 
     ) . 
} 
GROUP BY ?person 
ORDER BY ?presidentStart ?person 
LIMIT 100 

ich nur den Staat haben möchte, wo sie geboren sind.

:Abraham_Lincoln [http] :Hodgenville,_Kentucky [http] - - 
:Barack_Obama [http] :Kapiolani_Medical_Center_for_Women_and_Children [http] - - 
:Bill_Clinton [http] :Hope,_Arkansas [http] - - 
:Dwight_D._Eisenhower [http] :Denison,_Texas [http] - - 
:George_W._Bush [http] :New_Haven,_Connecticut [http] - - 
:George_Washington [http] :Westmoreland_County,_Virginia [http] - - 
:George_Washington [http] :British_America [http] - - 
:George_Washington [http] :George_Washington_Birthplace_National_Monument [http] - - 
:James_A._Garfield [http] :Orange,_Ohio [http] - - 
:James_A._Garfield [http] :Moreland_Hills,_Ohio [http] - - 
:Jimmy_Carter [http] :Plains,_Georgia 
+0

Mögliche Duplikate von [Ergebnisse der SPARQL-Abfrage aggregieren] (https://stackoverflow.com/questions/18212697/aggregating-results-from-parql-query) –

+0

Geringfügige Änderung, es ist kein Duplikat, weil Sie es suchen Zoom auf einen bestimmten Wert, anstatt aggregieren. –

Antwort

0

Konzentration auf

ich nur den Staat haben möchten, wo sie

statt auf

Wie loswerden von mehreren geboren werden Zeilen mit DBPEDIA SPARQL

dies könnte eine Lösung sein:

SELECT DISTINCT ?person ?birthState ?presidentStart ?presidentEnd 
WHERE { 
     ?person dct:subject dbc:Presidents_of_the_United_States. 


     OPTIONAL { ?person dbp:presidentEnd ?presidentEnd } . 
     OPTIONAL { ?person dbp:presidentStart ?presidentStart } . 
     OPTIONAL {?person dbo:birthPlace/dbp:subdivisionType/dbp:territory ?birthState } . 

FILTER (regex(?birthState, "_") OR 
     regex(?birthState, ";_") 
     ) . 
} 
GROUP BY ?person 
ORDER BY ?presidentStart ?person 
LIMIT 100 
+0

Hallo und danke für deine Antwort, es hat mir den Kopf geöffnet. Soweit ich weiß, sollte es 45 Präsidenten geben und in Ihrer Liste "Grover Cleveland State_of_New_Jersey" erscheint vier Mal. Übrigens erscheint Donald Trump auch nicht. – Paul

2

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.

+0

Hallo und danke für deine Antwort, es hat mir den Kopf geöffnet. Soweit ich weiß, sollte es 45 Präsidenten geben und in Ihrer Liste "Grover Cleveland State_of_New_Jersey" erscheint vier Mal. Übrigens erscheint Donald Trump auch nicht. – Paul

+0

@Paul siehe aktualisierte Antwort für eine Erklärung. –

Verwandte Themen