hbz / nwbib

Die Nordrhein-Westfälische Bibliographie
http://nwbib.de
3 stars 2 forks source link

Übernahme neuer Systematikwerte in lobid-resources-Daten #468

Closed acka47 closed 5 years ago

acka47 commented 5 years ago

Depends on #470.

Da die Lokalsysteme ja auch aktualisiert werden müssen, wird das Updateverfahren einige Wochen/Monate laufen während die Katalogisierung bereits auf die kontrollierten Werte umsteigt.

Sobald die Redaktionen anfangen, QIDs+label in anstatt GSW zu katalogisieren, müssen wir die Morph entsprechend anpassen, dass sowohl das alte Verfahren (bei GSW Lookup) und das neue Verfahren (Generierung des spatial-Eintrags auf Basis der kontrollierten Werte) funktionieren.

:exclamation: Für beide Verfahren muss das bisherige Verfahren (über Morph und Geo-Index) angepasst werden, weil die Daten in eine andere JSON-LD-Struktur als bisher überführt werden. Es handelt sich hier sozusagen um einen lobid-NWBib-API-Break! :exclamation:

acka47 commented 5 years ago

Es sind noch zwei Fragen offen, die wir bisher nur andiskutiert haben:

  1. Was machen wir mit den kontrollierten Werten aus der bestehenden Raumsystematik, die bisher unter subject stehen?
  2. Wo kommen die Geookoordinaten hin?

Zu 1.) denke ich, dass alles einheitlich im spatial-Feld sehen sollte und für 2.) halte ich nach wie vor den foaf:focus-Ansatz am besten. Nehmen wir als Beispiel BT000122326.

Momentan sieht das JSON-LD so aus (Snippet):

{
   "subject":[
      {
         "id":"http://purl.org/lobid/nwbib-spatial#n20",
         "source":{
            "id":"http://purl.org/lobid/nwbib-spatial",
            "label":"Raumsystematik der Nordrhein-Westfälischen Bibliographie"
         },
         "notation":"20",
         "label":"Ruhrgebiet"
      },
      {
         "id":"http://purl.org/lobid/nwbib#s586040",
         "source":{
            "id":"http://purl.org/lobid/nwbib",
            "label":"Sachsystematik der Nordrhein-Westfälischen Bibliographie"
         },
         "notation":"586040",
         "label":"Zoologische Gärten"
      }
   ],
   "spatial":[
      {
         "id":"http://www.wikidata.org/entity/Q2100",
         "label":"Duisburg",
         "geo":{
            "lat":51.432222222222,
            "lon":6.7611111111111
         },
         "type":[
            "http://www.wikidata.org/entity/Q1549591",
            "http://www.wikidata.org/entity/Q262166",
            "http://www.wikidata.org/entity/Q22865",
            "http://www.wikidata.org/entity/Q253030",
            "http://www.wikidata.org/entity/Q1187811",
            "http://www.wikidata.org/entity/Q707813",
            "http://www.wikidata.org/entity/Q42744322"
         ]
      }
   ]
}

Mein Vorschlag ist folgender:

{
   "subject":[
      {
         "id":"http://purl.org/lobid/nwbib#s586040",
         "type":[
            "Concept"
         ],
         "source":{
            "id":"http://purl.org/lobid/nwbib",
            "label":"Sachsystematik der Nordrhein-Westfälischen Bibliographie"
         },
         "notation":"586040",
         "label":"Zoologische Gärten"
      }
   ],
   "spatial":[
      {
         "id":"http://purl.org/lobid/nwbib-spatial#n20",
         "type":[
            "Concept"
         ],
         "label":"Ruhrgebiet",
         "source":{
            "id":"http://purl.org/lobid/nwbib-spatial",
            "label":"Raumsystematik der Nordrhein-Westfälischen Bibliographie"
         },
         "notation":"20",
         "focus":{
            "id":"http://www.wikidata.org/entity/Q151993",
            "type":[
               "https://www.wikidata.org/entity/Q245260"
            ]
         }
      },
      {
         "id":"http://purl.org/lobid/nwbib-spatial#Q2100",
         "type":[
            "Concept"
         ],
         "label":"Duisburg",
         "focus":{
            "id":"http://www.wikidata.org/entity/Q2100",
            "geo":{
               "lat":51.432222222222,
               "lon":6.7611111111111
            },
            "type":[
               "http://www.wikidata.org/entity/Q1549591",
               "http://www.wikidata.org/entity/Q262166",
               "http://www.wikidata.org/entity/Q22865",
               "http://www.wikidata.org/entity/Q253030",
               "http://www.wikidata.org/entity/Q1187811",
               "http://www.wikidata.org/entity/Q707813",
               "http://www.wikidata.org/entity/Q42744322"
            ]
         }
      }
   ]
}

Die Änderungen sind zusammengefasst:

Außerdem:

acka47 commented 5 years ago

Dieses Ticket ist das aufwändigste und gleichzeitig das erst, das wir nun für den umstieg auf die neue NWBib-Raumsystematik behandeln müssen. Änderungen müssen auf zwei Ebenen stattfinden.

Im Geoindex:

In der Morph:

Mit @dr0i habe ich gerade besprochen, dass wir für den GO-Index wie folgt vorgehen:

acka47 commented 5 years ago

Hier ist schonmal ein Anfang, es fehlen noch die Daten für das foaf:focus-Objekt:

curl -H "Accept: text/turtle" -G "https://query.wikidata.org/sparql" --data-urlencode query='
CONSTRUCT {
    ?lobidURI a skos:Concept ;
    skos:inScheme <http://purl.org/lobid/nwbib-spatial> ;
    skos:prefLabel ?wikidataUriLabel ;
   skos:altLabel  ?wikidataUriAltLabel ;
    foaf:focus ?wikidataUri ;
    skos:broaderLabel ?broaderLabel .
  }
  WHERE {
    {
         { ?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 . }
    }
    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 (STRAFTER (STR(?wikidataUri),"entity/") AS ?QID)
    BIND (URI(CONCAT ("https://nwbib.de/spatial#", ?QID)) AS ?lobidURI)
     SERVICE wikibase:label { bd:serviceParam wikibase:language "de". }
      }'

Ergebnis:

<https://nwbib.de/spatial#Q365> a skos:Concept ;
    skos:inScheme <http://purl.org/lobid/nwbib-spatial> ;
    skos:prefLabel "Köln"@de ;
    skos:altLabel "Kölle"@de ;
    foaf:focus wd:Q365 ;
    skos:broaderLabel "Regierungsbezirk Köln"@de .
acka47 commented 5 years ago

Ich habe die SPARQL CONSTRUCT Query jetzt erweitert und mit rapper und jsonld-cli ganz ansehnliches JSON-LD aus dem Ergebnis generiert. Leider gibt es einen Bug mit den CONSTRUCT queries in Wikidata (siehe https://phabricator.wikimedia.org/T211178), so dass ich nicht das komplette Verfahren für alle Daten umsetzen kann.

Wie auch immer, ich hoffe, dass die Ergebnisse für dich trotzdem nützlich sind, @dr0i. Vielleicht kannst du das Verfahren ja lokal mit einer RDF-Library auf das Geo-Wikidata-Subset anwenden.

Ich habe die Schritte im Wiki dokumentiert: https://github.com/hbz/nwbib/wiki/Geo-Index-mit-SPARQL-CONSTRUCT-generieren

acka47 commented 5 years ago

Die Systematik-Tickets sind jetzt übrigens nur noch im entsprechenden Projekt-Board und sollten da rumgeschoben werden: https://github.com/orgs/hbz/projects/3

acka47 commented 5 years ago

Eine offene Frage war noch, wie wir mit den Wikidata-Typen im focus-Objekt umgehen. Im Standup haben wir heute beschlossen, eine Liste der wichtigsten Typen zu sammeln und nur diese zu ergänzen. (Am besten sollten die auch im Kontext ergänzt werden, damit die schöner aussehen.) Todo Adrian

acka47 commented 5 years ago

Ich habe hier mal eine erste csv-Liste erstellt, inklusive Kürzel für den Kontext. Wir können das ja erstmal so machen, sollten uns aber eine systematischere Lösung überlegen. (z.B. sind die letzten vier alles Unterklassen von "Region")

qid, label, context 
Q829277, Regierungsbezirk in Nordrhein-Westfalen, Regierungsbezrik
Q5283531, Landkreis in Preußen, LandkreisPreussen
Q106658, Landkreis in Deutschland, Landkreis
Q22865, kreisfreie Stadt in Deutschland, KreisfreieStadt
Q262166, Gemeinde in Deutschland, Gemeinde
Q253019, Ortsteil, Ortsteil
Q2983893, Stadtteil, Stadtteil
Q2740635, Stadtbezirk in Deutschland, Stadtbezirk
Q42744322, Stadtgemeinde Deutschlands, Stadtgemeinde
Q317669, Stadtbezirk von Düsseldorf, StadtbezirkDuesseldorf
Q1852178, Stadtteil von Düsseldorf, StadtteilDuesseldorf
Q13415859, Stadtbezirk in Wuppertal, StadtbezirkWuppertal
Q15632133, Stadtbezirk von Köln, StadtbezirkKoeln
Q15632166, Stadtteil von Köln, StadtteilKoeln
Q160742, Abtei, Abtei
Q353344, Grafschaft, Grafschaft
Q208500, Fürstentum, Fuerstentum
Q196068, Herrschaft, Herrschaft
Q897303, Kirchenkreis, Kirchenkreis
Q2072238, Erzdiözese, Erzdioezese
Q3146899, Diözese der katholischen Kirche, Dioezese
Q385337, Dekanat, Dekanat
Q46831, Gebirge, Gebirge
Q4421, Wald, Wald
Q8502, Berg, Berg
Q82794, Region, Region
Q1970725, Naturraum, Naturraum
Q819435, Bergbaurevier, Bergbaurevier
Q107425, Landschaft, Landschaft
Q1129474, Kulturlandschaft, Kulturlandschaft
dr0i commented 5 years ago

@acka47 the updated data structure should be reflected in the new resources-staging, ready tomorrow at 8:00.

dr0i commented 5 years ago

Oh, this didn't work out because the to be lookuped geo-index had got the alias suffix, thus named geo_nwbib-neu-staging whilest there was only a geo_nwbib-neu. As just discussed with @acka47: reviewing using the freshly built index resources-smalltest resp. e.g. http://test.lobid.org/resources/search?q=nwbib would be sufficient.

acka47 commented 5 years ago

I just reviewed it:

For reference, here an update of https://github.com/hbz/nwbib/issues/468#issuecomment-466981344:

{
   "subject":[
      {
         "id":"https://nwbib.de/subjects#N586040",
         "type":[
            "Concept"
         ],
         "source":{
            "id":"https://nwbib.de/subjects",
            "label":"Sachsystematik der Nordrhein-Westfälischen Bibliographie"
         },
         "notation":"586040",
         "label":"Zoologische Gärten"
      }
   ],
   "spatial":[
      {
         "id":"https://nwbib.de/spatial#N20",
         "type":[
            "Concept"
         ],
         "label":"Ruhrgebiet",
         "source":{
            "id":"https://nwbib.de/spatial",
            "label":"Raumsystematik der Nordrhein-Westfälischen Bibliographie"
         },
         "notation":"20",
         "focus":{
            "id":"http://www.wikidata.org/entity/Q151993",
            "type":[
               "https://www.wikidata.org/entity/Q245260"
            ]
         }
      },
      {
         "id":"https://nwbib.de/spatial#Q2100",
         "type":[
            "Concept"
         ],
         "label":"Duisburg",
         "source":{
            "id":"https://nwbib.de/spatial",
            "label":"Raumsystematik der Nordrhein-Westfälischen Bibliographie"
         },
         "focus":{
            "id":"http://www.wikidata.org/entity/Q2100",
            "geo":{
               "lat":51.432222222222,
               "lon":6.7611111111111
            },
            "type":[
               "http://www.wikidata.org/entity/Q1549591",
               "http://www.wikidata.org/entity/Q262166",
               "http://www.wikidata.org/entity/Q22865",
               "http://www.wikidata.org/entity/Q253030",
               "http://www.wikidata.org/entity/Q1187811",
               "http://www.wikidata.org/entity/Q707813",
               "http://www.wikidata.org/entity/Q42744322"
            ]
         }
      }
   ]
}
acka47 commented 5 years ago

Für das neue Katalogisierungsverfahren mit den URIs der SKOS-Objekte müssen wir ja die Geokoordinaten und Typen aus Wikidata ergänzen, weil sie nicht in der SKOS-Datei stehen werden. Dafür haben wir uns im Gespräch auf folgendes Verfahren geeinigt.

Da wir noch keine NWbib-property haben, anhand der sich alle relevanten Wikidata-Ressourcen filtern lassen, mssen wir erstmal mit der alten Abfrage arbeiten. Die entsprechende Abfrage für die CSV-Datei sieht wie folgt aus:

curl -H "Accept: text/csv" -G "https://query.wikidata.org/sparql" --data-urlencode query='SELECT DISTINCT
 ?item
 ?itemLabel
(GROUP_CONCAT(DISTINCT ?type;separator="; ") AS ?types)
 ?coordinates
 WHERE {
  {
       { ?item wdt:P131* wd:Q1198 . }
    UNION
       { ?item p:P131 [ ps:P131 wd:Q1198 ] }
       { ?item p:P31 [ ps:P31 ?type ] . }
       { ?item wdt:P625 ?coordinates .}
       { ?item p:P31 [ ps:P31 wd:Q829277 ] . } # Regierungsbezirk in NRW
   UNION
       { ?item p:P31 [ ps:P31 wd:Q106658 ] . } # Landkreis in Deutschland 
   UNION
       { ?item p:P31 [ ps:P31 wd:Q5283531 ] . } # Landkreis in Preußen
   UNION
       { ?item p:P31 [ ps:P31 wd:Q262166 ] . } # Gemeinde in Deutschland
   UNION
       { ?item p:P31 [ ps:P31 wd:Q22865 ] . } # kreisfreie Stadt in Deutschland
   UNION
       { ?item p:P31 [ ps:P31 wd:Q253019 ]. } # Ortsteil
   UNION
       { ?item p:P31 [ ps:P31 wd:Q2983893 ]. } # Stadtteil
   UNION
       { ?item p:P31 [ ps:P31 wd:Q42744322 ]. } # Stadtgemeinde Deutschlands
   UNION
       { ?item p:P31 [ ps:P31 wd:Q134626 ]. } # Kreisstadt
   UNION
       { ?item p:P31 [ ps:P31 wd:Q448801 ]. } # Große Kreisstadt
   UNION
       { ?item p:P31 [ ps:P31 wd:Q1548518 ]. } # Große kreisangehörige Stadt
   UNION
        { ?item p:P31 [ ps:P31 wd:Q54935786 ]. } # Mittlere kreisangehörige Stadt
   UNION
       { ?item p:P31 [ ps:P31 wd:Q1852178 ] . } # Stadteil von Düsseldorf
   UNION
       { ?item p:P31 [ ps:P31 wd:Q15632166 ] . } # Stadtteil von Köln
   UNION
       { ?item wdt:P31/wdt:P279* wd:Q3146899 } # Diözese der katholischen Kirche
   UNION
      { ?item p:P361 [ps:P361 wd:Q1380992 ] } # Teil der ev. Kirche im Rheinland
   UNION
      { ?item p:P361 [ ps:P361 wd:Q1381014 ] } # Teil der ev. Kirche Westfalen
   UNION
      { ?item p:P31 [ps:P31 wd:Q1780389 ] } # Kommunalverband der besonderen Art (derzeit nur "Städteregion Aachen")
  }

  FILTER (?item != wd:Q1787449 && ?item != wd:Q16500124 && ?item != wd:Q1465811 && ?item != wd:Q1787449
        && ?item != wd:Q16832627 && ?item != wd:Q1113210 && ?item != wd:Q19288281 && ?item != wd:Q1662807
         && ?item != wd:Q1351319 ) # Herausfiltern von Altkreisen, die namensidentisch sind mit Neukreisen
  SERVICE wikibase:label {  bd:serviceParam wikibase:language "de" }
}
GROUP BY  ?item ?itemLabel ?coordinates'

Passt das, @dr0i ?

acka47 commented 5 years ago

Was noch fehlt, sind die WIkidata-Entitäten aus https://github.com/hbz/lobid-resources/blob/master/src/main/resources/string2wikidata.tsv. Ich habe leider noch keinen Weg gefunden, mit SPARQL eine Liste von URIs abzufragen. Folgende Ansätze laufen in ein Timeout:

curl -H "Accept: text/csv" -G "https://query.wikidata.org/sparql" --data-urlencode query='SELECT DISTINCT
?item
?itemLabel
(GROUP_CONCAT(DISTINCT ?type;separator=", ") AS ?types)
?coordinates
WHERE {
 {
  { ?item p:P31 [ ps:P31 ?type ] . }
  FILTER (?item = wd:Q1700 || ?item = wd:Q26271345 || ?item = wd:Q1746460 || ...)
  OPTIONAL { ?item wdt:P625 ?coordinates .}
 }
 SERVICE wikibase:label {  bd:serviceParam wikibase:language "de" }
}
GROUP BY  ?item ?itemLabel ?coordinates'
 curl -H "Accept: text/csv" -G "https://query.wikidata.org/sparql" --data-urlencode query='SELECT DISTINCT
 ?item
 ?itemLabel
(GROUP_CONCAT(DISTINCT ?type;separator=", ") AS ?types)
 ?coordinates
 WHERE {
  {
       { ?item p:P31 [ ps:P31 ?type ] . }
       FILTER (?item IN (wd:Q1700 || wd:Q26271345 || wd:Q1746460 || ...))
       OPTIONAL { ?item wdt:P625 ?coordinates .}
  }
  SERVICE wikibase:label {  bd:serviceParam wikibase:language "de" }
}
GROUP BY  ?item ?itemLabel ?coordinates'
dr0i commented 5 years ago

@acka47 please have a look again, the red ticks in https://github.com/hbz/nwbib/issues/468#issuecomment-492972315 sollten erledigt sein. Versuche weywot5.hbz-nrw.de:9200/resources-smalltest/_search?q=HT017250960 .

acka47 commented 5 years ago

Re. Sparql query für dieTSV-Liste: Dank @WikidataFacts@mastodon.social (siehe https://mastodon.social/@WikidataFacts/102106777513683776) habe ich jetzt eine einfache Lösung, die sich leicht erweitern lässt: die VALUES Expression macht's. Hier die Query:

curl -H "Accept: text/csv" -G "https://query.wikidata.org/sparql" \--data-urlencode \
query='SELECT DISTINCT
?item
?itemLabel
(GROUP_CONCAT(DISTINCT ?type;separator=", ") AS ?types)
?coordinates
WHERE {
 {
  VALUES ?item { 
    wd:Q1700 wd:Q26271345 wd:Q1746460 wd:Q896058 wd:Q767106 wd:Q1432757 
    wd:Q1746460 wd:Q767106 wd:Q26271345 wd:Q1123895 wd:Q56033157 wd:Q56033167 
    wd:Q1184019 wd:Q767106 wd:Q109773 wd:Q464473 wd:Q876515 wd:Q2133651 wd:Q317108
    wd:Q875161 wd:Q702826 wd:Q2548986 wd:Q30602340 wd:Q109773 wd:Q2011523 
    wd:Q56041996 wd:Q4219 wd:Q56042224 wd:Q31553414 wd:Q56042007 wd:Q778810 
    wd:Q56042004 wd:Q1487002 wd:Q56042224 wd:Q2147825 wd:Q1243986 wd:Q212520 
    wd:Q1243933 wd:Q47445689 wd:Q47454940 wd:Q884315 wd:Q981347 wd:Q47454950 
    wd:Q1749655 wd:Q981347 wd:Q1243933 wd:Q47444602 wd:Q1997843 wd:Q599193 
    wd:Q63191391 wd:Q993449 wd:Q1406857 wd:Q14212620 wd:Q2533842 wd:Q564155 
    wd:Q688373 wd:Q152432 wd:Q325202 wd:Q328928 wd:Q551530 wd:Q876552 wd:Q47443308
    wd:Q553182 wd:Q1541708 wd:Q15130492 wd:Q316174 wd:Q736029 wd:Q457468 wd:Q881030
    wd:Q3821487 wd:Q315663 wd:Q932656 wd:Q477038 wd:Q879507 wd:Q55890544 wd:Q315288 
    wd:Q3821213 wd:Q56005590 wd:Q825489 wd:Q56007789 wd:Q55721822 wd:Q1614442 
    wd:Q876546 wd:Q165763 wd:Q55986040 wd:Q3821604 wd:Q11026135 wd:Q628609 
    wd:Q328545 wd:Q55936383 wd:Q1452958 wd:Q1541799 wd:Q56008058 wd:Q1265044
    wd:Q1020946 wd:Q55888099 wd:Q55984306 wd:Q544579 wd:Q3708105 wd:Q56372838 
    wd:Q56397821 wd:Q56099854 wd:Q56374605 wd:Q56398321 wd:Q56398551 wd:Q56373241 
    wd:Q56395271 wd:Q56398029 wd:Q56402341 wd:Q56374635 wd:Q56395213 wd:Q56395068 
    wd:Q56398420 wd:Q56099734 wd:Q56395189 wd:Q56373947 wd:Q56397874 wd:Q56373173 
    wd:Q56398251 wd:Q56373671 wd:Q56099483 wd:Q56397628 wd:Q56398585 wd:Q1573603 
    wd:Q1573603 wd:Q884493 wd:Q884493 wd:Q1490832 wd:Q1490832 wd:Q1761685 wd:Q1318888 
    wd:Q1503134 wd:Q883257 wd:Q769380 wd:Q769380 wd:Q769380 wd:Q11805 wd:Q11805 
    wd:Q11805 wd:Q11805 wd:Q1457938 wd:Q645030 } .
    ?item p:P31 [ ps:P31 ?type ] . 
    OPTIONAL { ?item wdt:P625 ?coordinates . }
 }
 SERVICE wikibase:label {  bd:serviceParam wikibase:language "de" }
}
GROUP BY  ?item ?itemLabel ?coordinates'

Wo soll ich die ablegen, @dr0i ?

dr0i commented 5 years ago

Cool :) Leg's hierhin: https://github.com/hbz/lobid-resources/tree/master/src/main/resources .

acka47 commented 5 years ago

+1 for the smalltest index. It's time for @fsteeg to start working on #474

fsteeg commented 5 years ago

To be deployed on Monday (2019-06-03).

dr0i commented 5 years ago

Deployed to production, closed.