Skip to content

Geo Index mit SPARQL CONSTRUCT generieren

Adrian edited this page Feb 11, 2021 · 8 revisions

Schritt 1: SPARQL Query

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 .

Schritt 2: N-Triples

$ rapper -i turtle -o ntriples 365.ttl > 365.nt

Schritt 3: bnodes umbenennen

Da jsonld-cli nicht mit der Form des blank nodes klarkommt benenne ich den manuell in _:bnode um.

Schritt 4: JSON-LD

Unter Nutzung des hbz-Forks von jsonld-cli:

$ jsonld import 365.nt > 365.json

Schritt 5: Framing und Compacting

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

Ergebnis

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"
        }
      }
    }
  ]
}