2012-03-28 6 views
3

Ich bin sicher, was ich tun möchte, ist sehr einfach, aber ich kann nicht scheinen, die Abfrage richtig zu bekommen. Ich habe Datensätze im Datensatz, die Werte wie den Städtenamen z. "New York" und der entsprechende Ländercode, z. B. "US". Ich habe auch Zugriff auf die vollständigen Länder- und Länder-ISO-Codes.dbpedia SPARQL Abfrage, um bestimmte Werte für eine bestimmte Stadt zu erhalten

Ich möchte die Bevölkerung und abstrakten Wert für diese Städte aus dbpedia bekommen, durch eine where-Klausel wie:

Get population where name = "New York" and isoCountryCode = "US" 

ich um Hilfe zu diesem Thema ohne Erfolg gesucht haben.

bisher habe ich freundlicherweise von @rohk mit dieser Abfrage geholfen worden, die nicht in vollem Umfang für alle Standorte funktioniert:

SELECT DISTINCT ?city ?abstract ?pop 
WHERE { 
    ?city rdf:type schema:City ; 
    rdfs:label ?label ; 
    dbpedia-owl:abstract ?abstract ; 
    dbpedia-owl:country ?country ; 
    dbpedia-owl:populationTotal ?pop . 
    ?country dbpprop:countryCode "USA"@en . 
    FILTER (lang(?abstract) = 'en' and regex(?label, "New York City")) 
} 

Die oben genannten Arbeiten für New York, aber wenn ich ändern es:

SELECT DISTINCT ?city ?abstract ?pop 
WHERE { 
    ?city rdf:type schema:City ; 
     rdfs:label ?label ; 
     dbpedia-owl:abstract ?abstract ; 
     dbpedia-owl:country ?country ; 
     dbpedia-owl:populationTotal ?pop . 
    ?country dbpprop:countryCode "THA"@en . 
    FILTER (lang(?abstract) = 'en' and regex(?label, "Bangkok")) 
} 

Es gibt keine Ergebnisse für Bangkok, Thailand.

Ich kann nicht scheinen, die SPARQL-Abfrage korrekt zu bekommen, ich bin sicher, dass ich mit meiner Frage albern bin. Wenn mir irgendwelche Gurus helfen könnten, würde ich das schätzen. Vielen Dank!

Antwort

2

Diese Abfrage funktioniert

SELECT DISTINCT * 
WHERE { 
    ?city rdf:type schema:City ; 
     rdfs:label ?label ; 
     dbpedia-owl:abstract ?abstract ; 
     dbpedia-owl:country ?country ; 
     dbpprop:website ?website ; 
     dbpedia-owl:populationTotal ?pop . 
    ?country dbpprop:countryCode "USA"@en . 
    FILTER (lang(?abstract) = 'en' and regex(?label, "New York City")) 
} 

EDIT: Für Bangkok gibt es 2 Probleme:

  • kein Code Land für Thailand: Sie rdfs:label "Thailand"@en stattdessen verwenden können.
  • rdf:type von Bangkok ist nicht schema:City aber dbpedia-owl:Settlement

Hier eine Arbeits Abfrage für Bangkok ist

SELECT DISTINCT * 
WHERE { 
    ?city rdf:type dbpedia-owl:Settlement ; 
     rdfs:label "Bangkok"@en ; 
     dbpedia-owl:abstract ?abstract ; 
     dbpedia-owl:populationTotal ?pop ; 
     dbpedia-owl:country ?country ; 
     dbpprop:website ?website . 
    ?country rdfs:label "Thailand"@en . 
    FILTER (lang(?abstract) = 'en') 
} 
+0

Hallo - danke! Wie unten erwähnt, scheint dies die Details des Staates und nicht der Stadt wiederzugeben. Gibt es eine Möglichkeit, anzugeben, dass der Ortstyp eine Stadt oder ein Ort und kein Staat oder Land sein muss? Danke noch einmal. – Paul

+0

Richtig, ich habe meine Antwort bearbeitet –

+0

Meine Kommentare gelöscht und aktuelle Frage mit Fortschrittsbericht aktualisiert, danke! – Paul

4

Ich denke, Sie so etwas wie dies wollen:

SELECT * WHERE { 
    ?x rdfs:label "New York City"@en. 
    ?x dbpedia-owl:populationTotal ?pop. 
    ?x dbpedia-owl:abstract ?abstract. 
} 

Um nur die Englisch abstrakt, fügen Sie eine FILTER hinzu:

"New York" ist der Staat und es hat keine populationTotal Abbildung beigefügt. "New York City" ist die Stadt.

+0

Danke dafür, ich hatte gehofft, dass es vielleicht einen Weg gibt, den Ortstyp als Stadt oder Stadt zu definieren? – Paul

+0

Es gibt mehrere Möglichkeiten, keiner von ihnen funktioniert perfekt und es hängt von der Art der Sache ab, für die Sie filtern möchten. Überprüfen Sie die Werte der Eigenschaften "rdf: type", "dcterms: subject" und "dbpprop: wikiPageUsesTemplate" auf etwas, das die gewünschten Entitäten zuverlässig auswählt. Das Hinzufügen einer solchen Zeile zu Ihrer Abfrage könnte funktionieren: '? X rdf: type dbpedia-owl: City.' – cygri

+0

Vielen Dank. Du hilfst mir zu lernen, dich nicht zu blamieren. – Paul

Verwandte Themen