-
Notifications
You must be signed in to change notification settings - Fork 2
Geo Index mit SPARQL CONSTRUCT generieren
Adrian edited this page Feb 11, 2021
·
8 revisions
❗Achtung: Leider bringt die direkte Abfrage des Wikidata-SPARQL-Endoints nicht alle Ergebnisse zurück ohne eine Fehlermeldung zu liefern❗ (siehe auch https://phabricator.wikimedia.org/T211178)
Beispielhaft beschränke ich hier (mit FILTER (?wikidataUri in (wd:Q365))
) die Query auf Q365.
$ curl -H "Accept: text/turtle" -G "https://query.wikidata.org/sparql" --data-urlencode query='
CONSTRUCT {
?lobidURI a skos:Concept ;
<http://id.loc.gov/ontologies/bibframe/source> <https://nwbib.de/spatial> ;
rdfs:label ?wikidataUriLabel ;
skos:altLabel ?wikidataUriAltLabel ;
foaf:focus ?wikidataUri ;
<http://example.org/broaderLabel> ?broaderLabel .
?wikidataUri rdf:type ?type ;
schema:geo ?bnode .
?bnode rdf:type schema:GeoCoordinates ;
schema:latitude ?lat ;
schema:longitude ?lon .
<https://nwbib.de/spatial> rdfs:label "Raumsystematik der Nordrhein-Westfälischen Bibliographie" .
}
WHERE {
{
{ ?wikidataUri wdt:P31 ?type . }
{ ?wikidataUri wdt:P131* wd:Q1198 . }
UNION
{ ?wikidataUri p:P131 [ ps:P131 wd:Q1198 ] . }
{ ?wikidataUri p:P31 [ ps:P31 wd:Q829277 ] . }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q106658 ] . }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q5283531 ] . }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q262166 ] . }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q22865 ] . }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q253019 ]. }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q2983893 ]. }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q42744322 ]. }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q134626 ]. }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q448801 ]. }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q1548518 ]. }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q54935786 ]. }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q1852178 ] . }
UNION
{ ?wikidataUri p:P31 [ ps:P31 wd:Q15632166 ] . }
UNION
{ ?wikidataUri p:P31 [ps:P31 wd:Q1780389 ] . }
# UNION
# { ?wikidataUri wdt:P31/wdt:P279* wd:Q4286337 . }
OPTIONAL { ?wikidataUri wdt:P131 ?broader . }
OPTIONAL { ?wikidataUri p:P625 [
psv:P625 [
wikibase:geoLongitude ?lon;
wikibase:geoLatitude ?lat;
]
]. }
}
FILTER (?wikidataUri in (wd:Q365))
FILTER (?wikidataUri != wd:Q1787449 && ?wikidataUri != wd:Q16500124 && ?wikidataUri != wd:Q1465811 && ?wikidataUri != wd:Q1787449
&& ?wikidataUri != wd:Q16832627 && ?wikidataUri != wd:Q1113210 && ?wikidataUri != wd:Q19288281 && ?wikidataUri != wd:Q1662807
&& ?wikidataUri != wd:Q1351319 )
BIND (URI(CONCAT ("https://nwbib.de/spatial#", STRAFTER (STR(?wikidataUri),"entity/"))) AS ?lobidURI)
BIND(BNODE() AS ?bnode)
SERVICE wikibase:label { bd:serviceParam wikibase:language "de". }
}' > 365.ttl
Ergebnis (365.ttl):
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix wd: <http://www.wikidata.org/entity/> .
@prefix schema: <http://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
<https://nwbib.de/spatial> rdfs:label "Raumsystematik der Nordrhein-Westfälischen Bibliographie" .
<https://nwbib.de/spatial#Q365> a skos:Concept ;
<http://id.loc.gov/ontologies/bibframe/source> <https://nwbib.de/spatial> ;
rdfs:label "Köln"@de ;
skos:altLabel "Kölle"@de ;
foaf:focus wd:Q365 ;
<http://example.org/broaderLabel> "Regierungsbezirk Köln"@de .
wd:Q365 a wd:Q707813 ;
schema:geo _:udfe49b1c-f812-4c5c-8279-0b00bcb6533d .
_:udfe49b1c-f812-4c5c-8279-0b00bcb6533d a schema:GeoCoordinates ;
schema:latitude "50.942222222222"^^xsd:double ;
schema:longitude "6.9577777777778"^^xsd:double .
wd:Q365 a wd:Q2202509 , wd:Q200250 , wd:Q22865 , wd:Q1549591 .
$ rapper -i turtle -o ntriples 365.ttl > 365.nt
Da jsonld-cli nicht mit der Form des blank nodes klarkommt benenne ich den manuell in _:bnode
um.
Unter Nutzung des hbz-Forks von jsonld-cli:
$ jsonld import 365.nt > 365.json
frame.json:
{
"@context": {
"type": "@type",
"id": "@id",
"alias": {
"@id": "http://www.w3.org/2004/02/skos/core#altLabel",
"@language": "de"
},
"locatedIn": {
"@id": "http://example.org/broaderLabel",
"@language": "de"
},
"focus": {
"@id": "http://xmlns.com/foaf/0.1/focus",
"@type": "@id"
},
"geo": {
"@id": "http://schema.org/geo",
"@type": "@id"
},
"label": {
"@id": "http://www.w3.org/2000/01/rdf-schema#label",
"@language": "de"
},
"lat": {
"@id": "http://schema.org/latitude",
"@type": "http://www.w3.org/2001/XMLSchema#double"
},
"lon": {
"@id": "http://schema.org/longitude",
"@type": "http://www.w3.org/2001/XMLSchema#double"
},
"source": {
"@id": "http://id.loc.gov/ontologies/bibframe/source",
"@type": "@id"
},
"Concept": "http://www.w3.org/2004/02/skos/core#Concept",
"GeoCoordinates": "http://schema.org/GeoCoordinates"
},
"@type": "http://www.w3.org/2004/02/skos/core#Concept",
"@embed": "@always"
}
$ jsonld frame -f frame.json 365.json > 365.jsonld
Das Ergebnis sieht ziemlich gut aus. Einige Dinge fallen auf:
- Der Kontext muss für den Geoindex entfernt bzw. ausgelagert werden.
- Durch den ttl-nt-Schritt mit rapper sind die Sonderzeichen nicht optimal kodiert
- Das
@graph
sollte noch entfernt werden (geht aber glaube ich auch direkt mit der jsonld-java library, wenn ich das richtig in Erinnerung habe)
{
"@context": {
"type": "@type",
"id": "@id",
"label": "http://www.w3.org/2000/01/rdf-schema#label",
"alias": {
"@id": "http://www.w3.org/2004/02/skos/core#altLabel",
"@language": "de"
},
"locatedIn": {
"@id": "http://example.org/broaderLabel",
"@language": "de"
},
"focus": {
"@id": "http://xmlns.com/foaf/0.1/focus",
"@type": "@id"
},
"geo": {
"@id": "http://schema.org/geo",
"@type": "@id"
},
"label": {
"@id": "http://www.w3.org/2000/01/rdf-schema#label",
"@language": "de"
},
"lat": {
"@id": "http://schema.org/latitude",
"@type": "http://www.w3.org/2001/XMLSchema#double"
},
"lon": {
"@id": "http://schema.org/longitude",
"@type": "http://www.w3.org/2001/XMLSchema#double"
},
"source": {
"@id": "http://id.loc.gov/ontologies/bibframe/source",
"@type": "@id"
},
"Concept": "http://www.w3.org/2004/02/skos/core#Concept",
"GeoCoordinates": "http://schema.org/GeoCoordinates"
},
"@graph": [
{
"id": "https://nwbib.de/spatial#Q365",
"type": "Concept",
"locatedIn": "Regierungsbezirk K\\u00F6ln",
"source": {
"id": "https://nwbib.de/spatial",
"label": "Raumsystematik der Nordrhein-Westf\\u00E4lischen Bibliographie"
},
"label": "K\\u00F6ln",
"alias": "K\\u00F6lle",
"focus": {
"id": "http://www.wikidata.org/entity/Q365",
"type": [
"http://www.wikidata.org/entity/Q707813",
"http://www.wikidata.org/entity/Q2202509",
"http://www.wikidata.org/entity/Q200250",
"http://www.wikidata.org/entity/Q22865",
"http://www.wikidata.org/entity/Q1549591"
],
"geo": {
"type": "GeoCoordinates",
"lat": "50.942222222222",
"lon": "6.9577777777778"
}
}
}
]
}