Lobid Blog2024-03-21T12:00:12+00:00http://blog.lobid.org/Lobid teamsemweb@hbz-nrw.deVeröffentlichung von Richtlinien einer rücksichtsvollen lobid-Nutzung2023-10-12T00:00:00+00:00Adrian Pohl & Sebastian Meyerhttp://blog.lobid.org/2023/10/12/lobid-usage-policy<p>Nach längerem Schweigen zu diesem Thema verkünden wir nun stolz, dass wir seit einigen Tagen die Leitlinien zur Nutzung von lobid als offenem Dienst veröffentlicht haben unter dem Namen <a href="https://lobid.org/usage-policy/">“Richtlinien einer rücksichtsvollen lobid-Nutzung”</a>.</p>
<p>Diese Richtlinien sind das Ergebnis einer Beauftragung von <a href="https://www.opencultureconsulting.com/">Open Culture Consulting</a> durch das <a href="https://www.hbz-nrw.de/">Hochschulbibliothekszentrum des Landes Nordrhein-Westfalen (hbz)</a>, auf die ein Evaluierungsprozesses folgte, an dem mehrere Fachexperten beteiligt waren. Zunächst führten Felix Lohmeier und Adrian Pohl die erwähnte anonyme <a href="https://blog.lobid.org/2022/02/03/umfrage.html">Umfrage unter Nutzenden der lobid-Dienste</a> durch, deren <a href="https://blog.lobid.org/2022/07/19/survey-results.html">Ergebnisse</a> den Status Quo der praktischen Anwendung der APIs widerspiegelten und erste Anhaltspunkte für in den Nutzungsrichtlinien zu adressierende Verbesserungspotentiale zeigten. Diese Aspekte wurden von Christian Erlinger in Fachinterviews mit ausgewählten “Power Usern” der lobid APIs weiter vertieft. Daneben evaluierte Jens Nauber die <a href="https://docs.google.com/document/d/1kWFxz6Wc3Uy1X5P0WZPxpyyhhsIHzLzuadzcSNoz0Ho/edit">Dokumentationen anderer Anbieter</a> prominenter Schnittstellen im Bereich freier Kultur- und Forschungsdaten insbesondere unter dem Aspekt der über Nutzungsbedingungen gesteuerten fairen Verwendung der Dienste. Auf Basis der Umfrageergebnisse, Fachinterviews und Evaluierung formulierten Leander Seige, Sebastian Meyer et al. schließlich die Richtlinien zur Nutzung, Hinweise zur Implementierung, Gewährleistungsausschluss sowie Verbesserungsvorschläge.</p>
<p>Die Richtlinien einer rücksichtsvollen lobid-Nutzung gliedern sich in vier Bereiche:</p>
<h2 id="1-einleitungwillkommen">1. Einleitung/Willkommen</h2>
<p>Hier wird die Motivation für die Veröffentlichung der Richtlinien erläutert und darauf hingewiesen, dass es sich “nicht um verbindliche Vorschriften [handelt], sondern vielmehr um Anregungen, die ein faires Miteinander garantieren sollen”.</p>
<h2 id="2-lobid-als-datenquelle-nennen">2. lobid als Datenquelle nennen</h2>
<p>In diesem Abschnitt wird verdeutlicht, dass es aufgrund der Nutzung der CC0-Lizenz zwar nicht nötig ist, lobid als Datenquelle zu nennen, aber durchaus als gute Praxis erwünscht ist. Für die einfache Umsetzung wird der Text um HTML-Snippets für die leichte Umsetzung der Attribuierung ergänzt.</p>
<h2 id="3-technische-hinweise-zur-lobid-nutzung">3. Technische Hinweise zur lobid-Nutzung</h2>
<p>Dieser Abschnitt nimmt am meisten Raum ein und richtet sich an implementierende Techniker:innen. Um die technische Umsetzung der in den Richtlinien beschriebenen Maßnahmen so niedrigschwellig wie möglich zu gestalten, werden Hinweise zur Implementierung gegeben und mit Kurzbeispielen illustriert. Auch diese Maßnahmen sind als Empfehlungen zu verstehen und werden seitens lobid nicht technisch erzwungen.</p>
<h2 id="4-informationen-zur-gewährleistung">4. Informationen zur Gewährleistung</h2>
<p>Parallel zu den Nutzungsrichtlinien haben wir <a href="http://lobid.org/warranty/">Informationen zum Gewährleistungsausschluss</a> publiziert, die hier verlinkt werden. Dies ist letztlich auch der einzige juristisch wirksame Text und wurde daher – analog zu Impressum und Datenschutzerklärung – unabhängig publiziert.</p>
<p>Wir sind sehr froh, diese Richtlinien nun publiziert zu haben. So können wir bei entsprechenden Anfragen, die regelmäßig an uns gerichtet werden, einfach darauf verweisen. Wir sind gespannt, ob die Richtlinien ihren Zweck erfüllen und was die lobid-Nutzer:innen dazu sagen. Wir freuen uns über Rückmeldungen und konstruktive Kritik, wenn Dinge fehlen oder besser dargestellt werden können.</p>
Pflege und Verbesserung von lobid-organisations2023-09-01T00:00:00+00:00Tobias Bülte & Adrian Pohlhttp://blog.lobid.org/2023/09/01/giving-lobid-organisations-some-love-and-updates<p>Manchmal funktionieren Dinge einfach vor sich hin, so auch lobid-organisations seit mehr als sechs Jahren.
lobid-organisations ist ein umfassendes Verzeichnis von über 20.000 Gedächtnisinstitutionen (Bibliotheken, Archiven und Museen) im deutschsprachigen Raum.
Die Datenquellen dieses Dienstes sind das Deutsche ISIL-Verzeichnis und die Stammdaten der Deutschen Bibliotheksstatistik (DBS).
Darüber hinaus lassen sich auch die ZDB-E-Bookpakete suchen.<sup id="fnref:ebook" role="doc-noteref"><a href="#fn:ebook" class="footnote" rel="footnote">1</a></sup></p>
<p>lobid-organisations war der erste lobid-Dienst, den wir vor einigen Jahren modernisierten, um <a href="https://blog.lobid.org/2017/07/04/lobid-launch.html">2017 einen Relaunch zu verkünden</a>. Seitdem lief der Dienst weitestgehend unverändert vor sich hin. Über die Jahre sammelten sich allerdings eine Anzahl kleiner Tickets und es wurden Instandhaltungsarbeiten nötig.</p>
<p>So haben wir ein wenig Ruhe in der Sommerpause genutzt, um mit einer Modernisierung zu beginnen, indem wir zunächst die Datentransformationsprozesse auf einen aktuellen Stand bringen.
Mit einem Update von Metafacture 4 auf die aktuelle Version und der Nutzung der Fix-Mappingsprache können gleichzeitig einige lang
bestehende Probleme auf leichte Weise gelöst und viele Tickets geschlossen werden.</p>
<p>Für einen Überblick über die Tickets, die mit den Änderungen geschlossen werden, siehe den entsprechenden <a href="https://github.com/hbz/lobid-organisations/milestone/1">Meilenstein</a>. Wir wollen jegliche Probleme für bestehende API-Nutzer:innen vermeiden und haben versucht, nicht-rückwärtskompatible Änderungen auszuschließen.</p>
<p>Der neue Stand ist derzeit auf dem Testsystem deployt. Die Anpassungen sollen am am 18.09.2023 auf dem Produktivsystem aktiviert werden. Wir bitten Nutzer:innen der lobid-organisations-API, ihre Anwendungen probeweise gegen das Testsystem unter <a href="https://test.lobid.org/organisations">https://test.lobid.org/organisations</a> laufen zu lassen und uns auf Probleme hinzuweisen, die wir eventuell übersehen haben.</p>
<p>Fußnote</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:ebook" role="doc-endnote">
<p><small>Bei einer normalen Suche sind die E-Book-Pakete ausgeschlossen, weil es sich ja um ein Organisationsverzeichnis handelt. Sie können aber durch die Ergänzung einer Abfrage um <code class="language-plaintext highlighter-rouge">AND type:Collection</code> durchsucht werden, vgl. die Liste aller ca. 4000 E-Book-Pakete unter <a href="https://lobid.org/organisations/search?q=*+AND+type:Collection">https://lobid.org/organisations/search?q=*+AND+type:Collection</a>.</small> <a href="#fnref:ebook" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Wikipedia-Normdatenvorlage verlinkt nun auf lobid2023-06-06T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2023/06/06/wikipedia-normdatenvorlage<p>Wir freuen uns, dass seit gestern in der Wikipedia Verlinkungen auf lobid-gnd auf auftauchen, siehe zum Beispiel der <a href="https://de.wikipedia.org/wiki/K%C3%B6ln">Eintrag von Köln</a>:</p>
<p><img src="/images/lobid-link-bsp.png" alt="Normdaten-Box aus dem deutschsprachigen Wikipedia Eintrag zu Köln" /></p>
<p>Hintergrund war eine Anpassung der <a href="https://de.wikipedia.org/wiki/Vorlage:Normdaten">Normdatenvorlage</a> der deutschsprachigen Wikipedia, die umgesetzt wurde, weil die Dienste der Deutschen Nationalbibliothek Ende Mai mehrere Tage ausgefallen waren – inklusive des Katalogs, auf den die GND-URIs <code class="language-plaintext highlighter-rouge">https://d-nb.info/gnd/{gnd-id}</code> weitergeleitet werden. Deshalb entschied sich auf der Diskussionsseite der Normdatenvorlage auf Wikipedia, neben den DNB-Links auch weitere Dienste wie die OGND anzuzeigen, um Nutzer:innen in solchen Fällen zukünftig alternative Möglichkeiten zur Anzeige eines GND-Normdatensatzes zu geben.</p>
<p>Christian Erlinger (<a href="https://de.wikipedia.org/wiki/Benutzer:Mfchris84">Mfchris84</a>) brachte dann auch eine <a href="https://de.wikipedia.org/wiki/Vorlage_Diskussion:Normdaten#lobid">Verlinkung zu lobid</a> ins Spiel und sparte nicht mit dem Lob:</p>
<blockquote>
<p>[lobid] hat sich in den letzten Jahren mit allen drei Ressourcen-Typen (lobid-resources, lobid-orgs und lobid-gnd) als wertvoller Bestandteil bibliothekarischer Infrastruktur in Richtung linked open data entwickelt und von der Durchsuchbarkeit, Verfügbarkeit und Nachnutzbarkeit hat kein GND-Service im bibliothekarischen Alltag jenes Standing, welches lobid geniesst. trust me :-)
<a href="https://de.wikipedia.org/wiki/Vorlage_Diskussion:Normdaten#c-Mfchris84-20230602210200-Aschmidt-20230602205500">Quelle</a></p>
</blockquote>
<p>Adrian <a href="https://de.wikipedia.org/wiki/Vorlage_Diskussion:Normdaten#c-Acka47-20230605084500-Mfchris84-20230602214700">kommentierte</a> für das lobid-Team, um bestehende Bedenken an der dauerhaften Verfügbarkeit von lobid auszuräumen und erwähnte unsere langjährige Verbundenheit mit der Wikimedia-Community.</p>
<p>Am Ende ging es ganz schnell und lobid wurde in der Vorlage ergänzt, direkt hinter dem Link zum DNB-Katalog. Mit dieser kleinen Änderung ist lobid nun unter etwa 640.000 Wikipedia-Artikeln verlinkt (siehe die <a href="https://de.wikipedia.org/wiki/Wikipedia:Normdaten#Statistik">Normdaten-Statistik</a>)!</p>
<p>Dank an den netten Austausch auf der Diskussionsseite der Normdatenvorlage und insbesondere an Christian dafür, dass er uns <a href="https://openbiblio.social/@librerli/110476810002463297">auf Mastodon</a> darauf aufmerksam gemacht hat.</p>
Wir suchen: Informationsspezialist*in2023-05-31T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2023/05/31/job-informationsspezialistin<p><img style="float: right; width:150px !important;" src="https://lobid.org/images/hbz.png" /></p>
<p>Wir schreiben eine <a href="https://blog.lobid.org/2023/03/29/job-informationsspezialistin.html">Stelle</a> neu aus und freuen uns auf Bewerber*innen für unsere kompetente und nette Gruppe bestehend aus drei Bibliothekar*innen und fünf Entwickler*innen!</p>
<p>Gefördert durch das Ministerium für Kultur und Wissenschaft NRW, bauen wir am Hochschulbibliothekszentrum NRW (hbz) im Projekt Metadaten.nrw ein Kompetenzzentrum für offene Metadaten mit Blick auf Bibliotheken, Forschung und Lehre auf. Ein Unterprojekt ist bei der hbz-Gruppe Metadateninfrastruktur angesiedelt, die offene Softwaretools und Web-APIs wie lobid und Metafacture entwickelt und betreibt.</p>
<p>Zur Verstärkung suchen wir dafür zum nächstmöglichen Zeitpunkt eine*n</p>
<h2 id="informationsspezialistin-mwd">Informationsspezialist*in (m/w/d)</h2>
<h3 id="bis-entgeltgruppe-11-tv-l-bis-100-zunächst-auf-zwei-jahre-befristet">(bis Entgeltgruppe 11 TV-L, bis 100%, zunächst auf zwei Jahre befristet)</h3>
<p><strong>Ihre Aufgaben</strong></p>
<ul>
<li>Mitarbeit bei Aufbau und Pflege eines Suchindex für Forschende zunächst mit Fokus NRW</li>
<li>Kommunikation mit potentiellen Datenlieferanten</li>
<li>Aufsetzen von ETL-Prozessen</li>
<li>eigenverantwortliche Klassifikation, Auswahl, Anwendung und Anpassung existierender Serviceangebote der hbz-Gruppe</li>
<li>Metadateninfrastruktur für den Bereich Forschungsdatenmanagement</li>
</ul>
<p><strong>Ihre Qualifikationen</strong></p>
<ul>
<li>Abgeschlossenes Studium im Bereich der Bibliotheks- und Informationswissenschaften, der Bibliotheksinformatik oder des Bibliotheksmanagements oder gleichwertige Kenntnisse und Erfahrungen</li>
<li>Kenntnisse im Bereich Web-Standards, bibliothekarischer Datenmodelle und -schnittstellen sowie Datentransformation</li>
<li>Bereitschaft und Fähigkeit, sich in technische Standards einzuarbeiten</li>
<li>Praktische Erfahrung und Identifikation mit offenen Ansätzen (Open Source, Open Data, Open Web, Open Access, Open Educational Resources)</li>
<li>Sehr gute analytische und kommunikative Fähigkeiten sowie eine selbstständige Arbeitsweise</li>
<li>Gute Englischkenntnisse</li>
</ul>
<p><strong>Wir bieten Ihnen</strong></p>
<ul>
<li>Zukunftsorientierte Themenfelder an der Schnittstelle zwischen Bibliotheken, Forschung und Lehre</li>
<li>Ein familienfreundliches und dynamisches Arbeitsumfeld</li>
<li>Ein professionelles und freundliches Team mit offener Kommunikationskultur, flachen Hierarchien und agilen Prozessen</li>
<li>Möglichkeit zur Teilnahme an nationalen und internationalen Konferenzen</li>
<li>Flexible Arbeitszeiten ohne Kernarbeitszeit, Möglichkeit zur Remote- und Teilzeitarbeit</li>
<li>Vielfältige Möglichkeiten zur Fort- und Weiterbildung</li>
</ul>
<p>Das hbz fördert ausdrücklich die Vielfalt in seinem Arbeitsumfeld und begrüßt die Bewerbung aller Menschen — unabhängig von Alter, Geschlecht und geschlechtlicher Identität, ethnischer, sozialer und kultureller Herkunft, Religion und Weltanschauung, Behinderung, sexueller Orientierung und Identität. Wir freuen uns besonders über Bewerbungen von Frauen und bevorzugen Frauen nach Maßgabe des LGG NRW in Bereichen, in denen sie unterrepräsentiert sind. Bewerbungen schwerbehinderter Menschen sowie gleichgestellter behinderter Menschen im Sinne des § 2 SGB IX sind erwünscht.</p>
<p>Ansprechpartner für fachliche Rückfragen:<br />
<a href="https://lobid.org/team/ap#!">Adrian Pohl</a><br />
✆ 0221 400 75-235<br />
✉ pohl@hbz-nrw.de</p>
<p>Die Bewerbungsfrist endet am <strong>18.06.2023</strong>.</p>
<h4 id="zum-bewerbungsverfahren">Zum Bewerbungsverfahren</h4>
<p>Bewerbungen bitte direkt bis zum 18.06.2023 über das zfm-Karriereportal (<a href="https://www.zfm-bonn.de/jobboerse/stellenangebot/?job=informationsspezialist-in-m+w+d-hochschulbibliothekszentrum-des-landes-nordrhein-westfalen">Link zur Stellenanzeige bei zfm</a>) einreichen bzw. digital per E-Mail an: bewerbung@zfm-bonn.de.</p>
Zum Umstieg von lobid-resources auf Alma-basierte Daten2023-04-11T00:00:00+00:00Tobias Bülte, Adrian Pohlhttp://blog.lobid.org/2023/04/11/lobid-alma<p>Seit Ende 2019 arbeiten das hbz und die NRW-Verbundbibliotheken im <a href="https://www.hbz-nrw.de/projekte/goal-cbms">GO:AL-Projekt</a> am Umstieg auf Alma als landesweit einheitliches cloudbasiertes Bibliotheksmanagementsystem. Im Rahmen von fünf Waves migrieren alle Verbundbibliotheken auf Alma. Mit der anstehende dritten Wave wird Aleph durch eine Community Zone in Alma als primäres Verbundsystem abgelöst, das sämtliche Verbunddaten samt Beständen vorhält. Im Zuge dessen wird auch <a href="https://lobid.org/resources">lobid-resources</a> nicht mehr mit Aleph, sondern mit Alma-Daten gefüttert.</p>
<p>Das lobid-Team arbeitet schon seit langer Zeit auf diesen Umstieg hin. Wir haben eine lobid-resources-Instanz auf Basis der Alma-Daten aufgesetzt und nach und nach verbessert. Das Ergebnis läuft momentan unter <a href="https://alma.lobid.org/resources">https://alma.lobid.org/resources</a>. Im Zuge dieser Migration haben wir die Fix-Sprache, die sich an Catmandu-Fix anlehnt, für die Datentransformation mit <a href="https://metafacture.org">Metafacture</a> entwickelt und angewendet. Die recht komplexe Transformation von 24 Millionen Verbunddatensätzen bedeutete dabei den Lackmustest für Metafacture-Fix.</p>
<h2 id="erste-tests-waren-erfolgreich">Erste Tests waren erfolgreich</h2>
<p>Wir sind zuversichtlich, dass der Umstieg für die meisten lobid-resources-Nutzer:innen recht reibungslos ablaufen wird. Einige hbz-interne Systeme und auch die Nutzung der lobid-Daten im Discovery-System der TU Dortmund wurden bereits testweise umgestellt: Das lobid-resources UI wurde bereits entsprechend angepasst wie auch die Nordrhein-Westfälische Bibliographie (NWBib).</p>
<p>Dementsprechend sind wir sehr zuversichtlich, dass auch alle anderen Anwendungen, die auf lobid-resources zugreifen mit relativ geringem Aufwand weiterlaufen können.</p>
<h2 id="ziel-rückwärtskompatibilität-mit-minimalen-anpassungen">Ziel: Rückwärtskompatibilität mit minimalen Anpassungen</h2>
<p>Beim Umstieg auf Alma-basierte Daten haben wir uns also oberstes Ziel gesetzt, die lobid-resources-API möglichst rückwärtskompatibel zu machen, d.h. so wenig wie möglich Änderungen am Datenmodell und den API Calls vorzunehmen. Um ein paar Änderungen und die Korrektur ungünstiger vergangener Entscheidungen bei der Datenmodellierung sind wir aber nicht herumgekommen. Auch ist eine grundlegende Änderung, dass zukünftig Alma-basierte Identifikatoren für die Ressourcen-URIs genutzt werden. Einige Anpassungen sind bedingt durch die neue Datenbasis (MARC statt MAB-orientiert).</p>
<p>Hier eine Übersicht über die stattgefundenen Änderungen:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">id</code> (HTTP-URI zur Identifizierung der bibliographischen Ressourcen) wird jetzt nicht auf Basis der HBZ-ID konstruiert, sondern auf Basis der ALMA-MMS-ID des jeweiligen Records. (siehe <a href="https://github.com/hbz/lobid-resources/issues/1693">#1693</a> and <a href="https://github.com/hbz/lobid-resources/issues/1639">#1639</a>)</li>
<li>Bei den Holding-Angaben werden nur noch teilweise die Institutionsbibliotheken explizit mithilfe einer ISIL angegeben, da durch die ALMA-Migration des Verbunds die Datenlage vereinfacht wurde. Nur noch Bibliotheken, die explizit Mappings für ihre “Sublibraries” bereitstellen, werden auch entsprechend verlinkt. (Siehe <a href="https://github.com/hbz/lobid-resources/issues/1652">#1652</a>)</li>
<li>zwei Elemente zur Verlinkung zu anderen Resourcen bzw. externen Materialien u.a. aufgrund unklarer Definition und fehlendem Mehrwert wurden gelöscht:
<ul>
<li><code class="language-plaintext highlighter-rouge">hasVersion</code></li>
<li><code class="language-plaintext highlighter-rouge">similar</code></li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">owl:sameAs</code> und <code class="language-plaintext highlighter-rouge">umbel:isLike</code> wurden als <code class="language-plaintext highlighter-rouge">sdo:sameAs</code> zusammen geführt. (siehe <a href="https://github.com/hbz/lobid-resources/issues/1400">#1400</a>)</li>
<li><code class="language-plaintext highlighter-rouge">titleOfSubSeries</code> wurde gelöscht und die Werte werden an <code class="language-plaintext highlighter-rouge">title</code> angehangen (Siehe <a href="https://github.com/hbz/lobid-resources/issues/1215">#1214</a>)</li>
<li>das Hilfsfeld <code class="language-plaintext highlighter-rouge">subjectAltLabels</code> wurde gelöscht, da die varianten Namen jetzt eindeutig einem konkreten Schlagworteintrag unter <code class="language-plaintext highlighter-rouge">subject</code> als <code class="language-plaintext highlighter-rouge">altLabel</code> zugeordnet werden können (Siehe: <a href="https://github.com/hbz/lobid-resources/issues/1505">#1505</a>)</li>
<li><code class="language-plaintext highlighter-rouge">publication.location</code> and <code class="language-plaintext highlighter-rouge">publication.publishedBy</code> ist jetzt ein in Array (Siehe: <a href="https://github.com/hbz/lobid-resources/issues/1098">#1106</a>)</li>
<li>einige nicht mehr benötigte NWBib-Felder bzw. fehlerhafte Felder wurden gelöscht:
<ul>
<li><code class="language-plaintext highlighter-rouge">longitudeAndLatitude[].*</code></li>
<li><code class="language-plaintext highlighter-rouge">coverage[].*</code></li>
<li><code class="language-plaintext highlighter-rouge">spatial[].*.focus.geo[].*.lat</code></li>
<li><code class="language-plaintext highlighter-rouge">spatial[].*.focus.geo[].*.lon</code></li>
<li><code class="language-plaintext highlighter-rouge">license[].*.note[].*</code></li>
</ul>
</li>
<li>Die Unterfelder <code class="language-plaintext highlighter-rouge">exampleOfWork.creatorOfWork</code> und <code class="language-plaintext highlighter-rouge">exampleOfWork.instrumentation[].*</code> wurden gelöscht, da die Datenbasis nicht mehr existiert und die Informationen jetzt in dem <code class="language-plaintext highlighter-rouge">contribution</code>-Objekt gelistet ist (Siehe <a href="https://github.com/hbz/lobid-resources/pull/1500">#1500</a>)</li>
<li>Provenienzangaben in <code class="language-plaintext highlighter-rouge">describedBy</code> wurden umgestellt, da sich die Informationen auf den Eintrag im Verbundkatalog beziehen (<code class="language-plaintext highlighter-rouge">describedBy.resultOf.object</code>). Zudem ist <code class="language-plaintext highlighter-rouge">describedBy.resultOf.object.modifiedBy</code> jetzt ein Array (siehe: <a href="https://github.com/hbz/lobid-resources/issues/1470">#1470</a>) und in den Feldern <code class="language-plaintext highlighter-rouge">describedBy.resultOf.object.dateCreated</code> und <code class="language-plaintext highlighter-rouge">describedBy.resultOf.object.dateModified</code> wird das Datumsformat yyyy-mm-dd anstatt yyyymmdd genutzt.</li>
<li>falsche/Überflüssige Felder in <code class="language-plaintext highlighter-rouge">contribution</code> wurden entfernt:
<ul>
<li><code class="language-plaintext highlighter-rouge">contribution[].*.agent.altLabel</code></li>
<li><code class="language-plaintext highlighter-rouge">contribution[].*.agent.label[].*</code></li>
<li><code class="language-plaintext highlighter-rouge">contribution[].*.agent.source.id</code></li>
<li><code class="language-plaintext highlighter-rouge">contribution[].*.agent.source.label</code></li>
<li><code class="language-plaintext highlighter-rouge">corporateBodyForTitle[].*</code></li>
<li><code class="language-plaintext highlighter-rouge">natureOfContent[].*.gndIdentifier</code></li>
<li><code class="language-plaintext highlighter-rouge">natureOfContent[].*.source.id</code></li>
<li><code class="language-plaintext highlighter-rouge">natureOfContent[].*.source.label</code></li>
<li><code class="language-plaintext highlighter-rouge">natureOfContent[].*.type[].*</code></li>
</ul>
</li>
</ul>
<h2 id="bitte-testet-eure-anwendungen">Bitte testet eure Anwendungen</h2>
<p>Um einen reibungslosten Umstieg Anfang Mai zu gewährleisten, bitten wir euch darum, in der zweiten Aprilhälfte alle eure Anwendungen zu testen, die gegen lobid-resources laufen.</p>
Wir suchen: Informationsspezialist*in2023-03-29T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2023/03/29/job-informationsspezialistin<p><img style="float: right; width:150px !important;" src="https://lobid.org/images/hbz.png" /></p>
<p>Wir schreiben eine <a href="https://blog.lobid.org/2022/07/26/job-informationsspezialistin.html">Stelle</a> neu aus und freuen uns auf Bewerber*innen für unsere kompetente und nette Gruppe bestehend aus drei Bibliothekar*innen und fünf Entwickler*innen!</p>
<p>Metadaten sind der Schlüssel um Daten aller Art, z.B. Literatur oder Forschungsdaten in der eigenen Hochschule, dem Forschungsumfeld oder auch im gesamten Internet zu finden und in ihren Kontext einordnen zu können. Gefördert durch das Ministerium für Kultur und Wissenschaft NRW will das Hochschulbibliothekszentrum NRW (hbz) mit dem Projekt metadaten.nrw die Etablierung einer leistungsfähigen webbasierten Metadateninfrastruktur erreichen.</p>
<p>Im Rahmen des Teilprojekts Infrastrukturinitiative Metadaten-Services suchen wir zur Verstärkung der Gruppe Offene Infrastruktur zum nächstmöglichen Zeitpunkt eine*n</p>
<h2 id="informationsspezialistinbibliothekarin-mwd">Informationsspezialist*in/Bibliothekar*in (m/w/d)</h2>
<h3 id="bis-entgeltgruppe-11-tv-l-befristet">(bis Entgeltgruppe 11 TV-L, befristet)</h3>
<p><strong>Deine Aufgaben</strong></p>
<ul>
<li>Erarbeitung und Initialisierung von Standardisierungsprozessen im Bereich OER-Metadaten und Koordination der Ergebnisse in Hinblick auf eine einheitliche Gesamtstruktur</li>
<li>eigenverantwortliche Klassifikation, Auswahl, Anwendung und Anpassung existierender Angebote auf den Bereich Forschungsdatenmanagement</li>
<li>Organisation des bibliothekarischen Austauschs in NRW über OER-Metadatenerstellung, -standardisierung und -nutzung</li>
</ul>
<p><strong>Dein Profil</strong></p>
<ul>
<li>Abgeschlossenes Studium im Bereich der Bibliotheks- und Informationswissenschaften, der Bibliotheksinformatik oder des Bibliotheksmanagements oder gleichwertige Kenntnisse und Erfahrungen</li>
<li>Kenntnisse im Bereich Web-Standards und bibliothekarischer Datenmodelle</li>
<li>Idealerweise praktische Erfahrung und hohe Identifikation mit offenen Ansätzen (Open Source, Open Data, Open Access, Open Educational Resources, Open Web)</li>
<li>Bereitschaft und Fähigkeit, sich in technische Standards einzuarbeiten</li>
<li>Sehr gute analytische und kommunikative Fähigkeiten sowie eine selbstständige Arbeitsweise</li>
<li>Gute Englischkenntnisse</li>
</ul>
<p><strong>Das bieten wir</strong></p>
<ul>
<li>Mitarbeit an spannenden und innovativen Entwicklungen im Umfeld von Bibliotheken und Open Educational Resources (OER)</li>
<li>Möglichkeit zur Teilnahme an nationalen und internationalen Konferenzen</li>
<li>Flexible Arbeitszeiten ohne Kernarbeitszeit</li>
<li>ein vorerst auf zwei Jahre befristetes Arbeitsverhältnis</li>
<li>Vielfältiges Fort- und Weiterbildungsprogramm u. a. bei der Akademie Mont-Cenis und IT-NRW</li>
<li>Moderne Arbeitskultur mit open-door-policy und flachen Strukturen</li>
<li>Beratungs- und Unterstützungsangebote bezüglich der Vereinbarkeit von Familie und Beruf</li>
<li>Möglichkeit zur Teilzeitbeschäftigung</li>
</ul>
<p>Das hbz fördert ausdrücklich die Vielfalt in seinem Arbeitsumfeld und begrüßt die Bewerbung aller Menschen — unabhängig von Alter, Geschlecht und geschlechtlicher Identität, ethnischer, sozialer und kultureller Herkunft, Religion und Weltanschauung, Behinderung, sexueller Orientierung und Identität. Wir freuen uns besonders über Bewerbungen von Frauen und bevorzugen Frauen nach Maßgabe des LGG NRW in Bereichen, in denen sie unterrepräsentiert sind. Bewerbungen schwerbehinderter Menschen sowie gleichgestellter behinderter Menschen im Sinne des § 2 SGB IX sind erwünscht.</p>
<p>Ansprechpartner für fachliche Rückfragen:<br />
<a href="https://lobid.org/team/ap#!">Adrian Pohl</a><br />
✆ 0221 400 75-235<br />
✉ pohl@hbz-nrw.de</p>
<p>Die Bewerbungsfrist endet am <strong>16.04.2023</strong>.</p>
<h4 id="zum-bewerbungsverfahren">Zum Bewerbungsverfahren</h4>
<p>Bewerbungen bitte direkt bis zum 16.04.2023 über das zfm-Karriereportal (<a href="https://www.zfm-bonn.de/jobboerse/stellenangebot/?job=informationsspezialist-in+bibliothekar-in-m+w+d-hochschulbibliothekszentrum-des-landes-nordrhein-westfalen">Link zur Stellenanzeige bei zfm</a>) einreichen bzw. digital per E-Mail an: bewerbung@zfm-bonn.de.</p>
Wir suchen: Projektkoordinator*in2022-08-19T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2022/08/19/job-projektkoordinatorin<p><img style="float: right; width:150px !important;" src="https://lobid.org/images/hbz.png" /></p>
<p><small><em>Hinweis: Diese Stelle wurde ursprünglich zusammen mit einer zweiten hbz-Stelle <a href="https://www.zfm-bonn.de/jobs/stellenangebote/stellenangebot/?job=projektkoordinator-in-w+m+d-hochschulbibliothekszentrum-des-landes-nordrhein-westfalen">im zfm-Karriereportal</a> ausgeschrieben. Für die Veröffentlichung hier im lobid-Blog haben wir die Ausschreibungen getrennt.</em></small></p>
<p>Das Hochschulbibliothekszentrum des Landes Nordrhein-Westfalen (hbz) gehört zum Geschäftsbereich des Ministeriums für Kultur und Wissenschaft NRW und hat seinen Sitz im Herzen von Köln. Unsere Mission ist die nachhaltige Informationsversorgung von Wissenschaft, Kultur und Hochschulen. Wir engagieren uns u. a. in den Bereichen Open Access, Open Source und Open Data.</p>
<p>Metadaten sind der Schlüssel um Daten aller Art, z.B. Literatur oder Forschungsdaten in der eigenen Hochschule, dem Forschungsumfeld oder auch im gesamten Internet zu finden und in ihren Kontext einordnen zu können. Gefördert durch das Ministerium für Kultur und Wissenschaft NRW will das Hochschulbibliothekszentrum NRW mit dem Projekt metadaten.nrw die Etablierung einer leistungsfähigen webbasierten Metadateninfrastruktur erreichen.</p>
<p>Das Teilprojekt „Infrastrukturinitiative Metadaten-Services“ dient der Vermittlung von Metadaten-Services in Projekte der Digitalen Hochschule NRW (DH.NRW), insbesondere in den Bereichen Open Educational Resources (OER) und Forschungsdatenmanagement. Im Rahmen dieses Teilprojekts suchen wir zur Verstärkung des Teams <a href="https://www.hbz-nrw.de/produkte/linked-open-data">„Offene Infrastruktur“</a> zum nächstmöglichen Zeitpunkt eine*n</p>
<h2 id="projektkoordinatorin-wmd">Projektkoordinator*in (w/m/d)</h2>
<h3 id="bis-entgeltgruppe-13-tv-l-befristet-bis-100">(bis Entgeltgruppe 13 TV-L, befristet, bis 100%)</h3>
<p><strong>Folgende Aufgaben warten auf Sie…</strong></p>
<ul>
<li>Koordination der Projektarbeiten</li>
<li>Kommunikation nach außen und innen, Arbeit in Gremien</li>
<li>Mitarbeit in regionalen, nationalen und internationalen Arbeitsgruppen sowie aktive Teilnahme auf fachspezifischen Tagungen und Konferenzen</li>
<li>Erhebung von Anforderungen der DH.nrw an Metadateninfrastrukturen</li>
<li>Förderung des bibliothekarischen Austauschs in NRW über OER-Metadatenerstellung, -standardisierung und -nutzung</li>
</ul>
<p><strong>Idealerweise bringen Sie mit…</strong></p>
<ul>
<li>abgeschlossenes Hochschul- oder Fachhochschulstudium, gerne in Informatik, Bibliotheks-, Informationswissenschaften oder einem vergleichbaren Studiengang</li>
<li>Kenntnisse in der Planung, Koordinierung und Durchführung von (IT-) Projekten, idealerweise im Bibliotheks- oder Hochschulumfeld</li>
<li>praktische Erfahrung und hohe Identifikation mit offenen Ansätzen (Open Source, Open Data, Open Access, Open Educational Resources, Open Web)</li>
<li>Kenntnisse im Bereich Forschungsdatenmanagement und Standards bibliothekarischer Metadaten</li>
<li>Erfahrungen in der verständlichen Vermittlung technischer Sachverhalte</li>
<li>gute Kenntnisse der deutschen und englischen Sprache in Wort und Schrift</li>
<li>Erfahrung im Schreiben von Blogbeiträgen</li>
</ul>
<p><strong>Was Sie erwarten können…</strong></p>
<ul>
<li>Mitarbeit an spannenden und innovativen Entwicklungen im Umfeld von Bibliotheken, Metadateninfrastrukturen, Forschungsdaten und Open Educational Resources (OER)</li>
<li>ein auf 24 Monate befristetes Arbeitsverhältnis</li>
<li>Flexible Arbeitszeiten ohne Kernarbeitszeit, Möglichkeit zur Remote- und Teilzeitarbeit</li>
<li>Vielfältiges Fort- und Weiterbildungsprogramm u. a. bei der Akademie Mont-Cenis und IT-NRW</li>
<li>Moderne Arbeitskultur mit open-door-policy und flachen Strukturen</li>
<li>Teilnahmemöglichkeit am Job-Ticket</li>
<li>Beratungs- und Unterstützungsangebote bezüglich der Vereinbarkeit von Familie und Beruf</li>
</ul>
<p>Das hbz fördert ausdrücklich die Vielfalt in seinem Arbeitsumfeld und begrüßt die Bewerbung aller Menschen — unabhängig von Alter, Geschlecht und geschlechtlicher Identität, ethnischer, sozialer und kultureller Herkunft, Religion und Weltanschauung, Behinderung, sexueller Orientierung und Identität. Wir freuen uns besonders über Bewerbungen von Frauen und bevorzugen Frauen nach Maßgabe des LGG NRW in Bereichen, in denen sie unterrepräsentiert sind. Bewerbungen schwerbehinderter Menschen sowie gleichgestellter behinderter Menschen im Sinne des § 2 SGB IX sind erwünscht.</p>
<p>Ansprechpartner für fachliche Rückfragen:<br />
<a href="https://lobid.org/team/ap#!">Adrian Pohl</a><br />
✆ 0221 400 75-235<br />
✉ pohl@hbz-nrw.de</p>
<p>Die Bewerbungsfrist endet am <strong>11.09.2022</strong>.</p>
<h4 id="zum-bewerbungsverfahren">Zum Bewerbungsverfahren</h4>
<p>Bewerben Sie sich direkt bei der von uns beauftragten Beratungsgesellschaft zfm. Lassen Sie uns Ihre aussagekräftigen Bewerbungsunterlagen bitte bis zum 11.09.2022 über das zfm-Karriereportal (<a href="https://www.zfm-bonn.de/jobs/stellenangebote/stellenangebot/?job=projektkoordinator-in-w+m+d-hochschulbibliothekszentrum-des-landes-nordrhein-westfalen">Link zur Stellenanzeige bei zfm</a>) zukommen bzw. digital per E-Mail an: bewerbung@zfm-bonn.de.</p>
Wir suchen: Informationsspezialist*in2022-07-26T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2022/07/26/job-informationsspezialistin<p><img style="float: right; width:150px !important;" src="https://lobid.org/images/hbz.png" /></p>
<p>Das Hochschulbibliothekszentrum des Landes Nordrhein-Westfalen (hbz) gehört zum Geschäftsbereich des Ministeriums für Kultur und Wissenschaft NRW und hat seinen Sitz im Herzen von Köln. Unsere Mission ist die nachhaltige Informationsversorgung von Wissenschaft, Kultur und Hochschulen. Wir engagieren uns u. a. in den Bereichen Open Access, Open Source und Open Data sowie Digitale Langzeitverfügbarkeit.</p>
<p>Metadaten sind der Schlüssel um Daten aller Art, z.B. Literatur oder Forschungsdaten in der eigenen Hochschule, dem Forschungsumfeld oder auch im gesamten Internet zu finden und in ihren Kontext einordnen zu können. Gefördert durch das Ministerium für Kultur und Wissenschaft NRW will das Hochschulbibliothekszentrum NRW (hbz) mit dem Projekt metadaten.nrw die Etablierung einer leistungsfähigen webbasierten Metadateninfrastruktur erreichen.</p>
<p>Im Rahmen des Teilprojekts Infrastrukturinitiative Metadaten-Services suchen wir zur Verstärkung der Gruppe Offene Infrastruktur zum nächstmöglichen Zeitpunkt eine*n</p>
<h2 id="informationsspezialistin-mwd">Informationsspezialist*in (m/w/d)</h2>
<h3 id="bis-entgeltgruppe-11-tv-l-befristet">(bis Entgeltgruppe 11 TV-L, befristet)</h3>
<p><strong>Folgende Aufgaben warten auf Sie…</strong></p>
<ul>
<li>Mitarbeit in Standardisierungsprozessen im Bereich OER-Metadaten</li>
<li>Anwendung und Anpassung existierender Angebote auf den Bereich Forschungsdatenmanagement</li>
<li>Förderung des bibliothekarischen Austauschs in NRW über OER-Metadatenerstellung, -standardisierung und -nutzung</li>
</ul>
<p><strong>Idealerweise bringen Sie mit…</strong></p>
<ul>
<li>Abgeschlossenes Studium im Bereich der Bibliotheks- und Informationswissenschaften, der Bibliotheksinformatik oder des Bibliotheksmanagements oder gleichwertige Kenntnisse und Erfahrungen</li>
<li>Kenntnisse im Bereich Web-Standards und bibliothekarischer Datenmodelle</li>
<li>Praktische Erfahrung und hohe Identifikation mit offenen Ansätzen (Open Source, Open Data, Open Access, Open Educational Resources, Open Web)</li>
<li>Bereitschaft und Fähigkeit, sich in technische Standards einzuarbeiten</li>
<li>Sehr gute analytische und kommunikative Fähigkeiten sowie eine selbstständige Arbeitsweise</li>
<li>Gute Englischkenntnisse</li>
</ul>
<p><strong>Was Sie erwarten können…</strong></p>
<ul>
<li>Mitarbeit an spannenden und innovativen Entwicklungen im Umfeld von Bibliotheken und Open Educational Resources (OER)</li>
<li>Möglichkeit zur Teilnahme an nationalen und internationalen Konferenzen</li>
<li>ein auf 24 Monate befristetes Arbeitsverhältnis</li>
<li>Flexible Arbeitszeiten ohne Kernarbeitszeit</li>
<li>Vielfältiges Fort- und Weiterbildungsprogramm u. a. bei der Akademie Mont-Cenis und IT-NRW</li>
<li>Moderne Arbeitskultur mit open-door-policy und flachen Strukturen</li>
<li>Teilnahmemöglichkeit am Job-Ticket</li>
<li>Beratungs- und Unterstützungsangebote bezüglich der Vereinbarkeit von Familie und Beruf</li>
<li>Möglichkeit zur Teilzeitbeschäftigung</li>
</ul>
<p>Das hbz fördert ausdrücklich die Vielfalt in seinem Arbeitsumfeld und begrüßt die Bewerbung aller Menschen — unabhängig von Alter, Geschlecht und geschlechtlicher Identität, ethnischer, sozialer und kultureller Herkunft, Religion und Weltanschauung, Behinderung, sexueller Orientierung und Identität. Wir freuen uns besonders über Bewerbungen von Frauen und bevorzugen Frauen nach Maßgabe des LGG NRW in Bereichen, in denen sie unterrepräsentiert sind. Bewerbungen schwerbehinderter Menschen sowie gleichgestellter behinderter Menschen im Sinne des § 2 SGB IX sind erwünscht.</p>
<p>Ansprechpartner für fachliche Rückfragen:<br />
<a href="https://lobid.org/team/ap#!">Adrian Pohl</a><br />
✆ 0221 400 75-235<br />
✉ pohl@hbz-nrw.de</p>
<p>Die Bewerbungsfrist endet am <strong>10.08.2022</strong>.</p>
<h4 id="zum-bewerbungsverfahren">Zum Bewerbungsverfahren</h4>
<p>Bewerben Sie sich direkt bei der von uns beauftragten Beratungsgesellschaft zfm. Lassen Sie uns Ihre aussagekräftigen Bewerbungsunterlagen bitte bis zum 10.08.2022 über das zfm-Karriereportal (<a href="https://www.zfm-bonn.de/jobs/stellenangebote/stellenangebot/?job=informationsspezialist-in-m+w+d-hochschulbibliothekszentrum-des-landes-nordrhein-westfalen">Link zur Stellenanzeige bei zfm</a>) zukommen bzw. digital per E-Mail an: bewerbung@zfm-bonn.de.</p>
Ergebnisse der Umfrage zur Nutzung der lobid-API2022-07-19T00:00:00+00:00Felix Lohmeier, Adrian Pohlhttp://blog.lobid.org/2022/07/19/survey-results<p>Im Frühjahr hatten wir <a href="https://blog.lobid.org/2022/02/03/umfrage.html">eine kleine Umfrage</a> zur Nutzung der lobid-API durchgeführt. Wir haben uns sehr über die rege Teilnahme (70 Personen) gefreut! So haben wir einen guten Überblick gewonnen, welche schönen Dienste und Projekte auf der lobid-API aufbauen. Die Ergebnisse der Umfrage und erste Erkenntnisse möchten wir hier nun gerne teilen.</p>
<p>Zur Einordnung:</p>
<ul>
<li>Zeitraum der Umfrage: 03.02. bis 11.04.2022</li>
<li>Rückmeldungen: 70</li>
<li>Mehrfachnennungen waren möglich</li>
</ul>
<h2 id="frage-1-welche-dienste-von-lobid-nutzen-sie">Frage 1: Welche Dienste von lobid nutzen Sie?</h2>
<p><img src="/images/2022-07-survey-results/frage1-dienste.png" alt="frage-1" /></p>
<p>Wie erwartet, ist <a href="https://lobid.org/gnd">lobid-gnd</a> der mit Abstand prominenteste Dienst.</p>
<h2 id="frage-2-in-welchem-anwendungskontext-verwenden-sie-lobid">Frage 2: In welchem Anwendungskontext verwenden Sie lobid?</h2>
<p><img src="/images/2022-07-survey-results/frage2-anwendungskontext.png" alt="frage-2" /></p>
<p>Interessant ist für uns der hohe Anteil von Anwendungen außerhalb des Bibliotheksbereichs. Offenbar wird die lobid-API in vielen Forschungsprojekten in den Digital Humanities aber auch darüber hinaus eingesetzt. Unter “Sonstiges” wurden beispielsweise Dissertationen, soziologische Forschung und wissenschaftliche Dokumentation genannt. Weiterhin wird lobid-API auch für Forschungsinformationssysteme eingesetzt.</p>
<h2 id="frage-3-welche-funktionen-von-lobid-nutzen-sie">Frage 3: Welche Funktionen von lobid nutzen Sie?</h2>
<p><img src="/images/2022-07-survey-results/frage3-funktionen.png" alt="frage-3" /></p>
<p>Die lobid-API verfügt über einige Zusatzfunktionen die offenbar wenig genutzt werden. Ortsbezogene Suche und RSS-Feeds wurden gar nicht ausgewählt. Hier wollen wir prüfen, ob diese vielleicht besser bekannt gemacht werden können.</p>
<p>Wie erwartet, wird die Reconciliation API (z.B. via OpenRefine) oft genutzt. Hier haben wir die letzten Jahre viel an den Funktionen gearbeitet, <a href="https://blog.lobid.org/2018/08/27/openrefine.html">Tutorials</a> erstellt und Workshops angeboten.</p>
<p>Am meisten werden Live-Zugriffe auf Einzeldaten und die Suchfunktion genutzt. Der Abruf größerer Datenmengen (Bulk-Downloads) wird nur von einem kleineren Teil genutzt. In vielen Anwendungskontexten können Bulk-Downloads und anschließende lokale Verarbeitung effizienter als Einzelabrufe sein. Hier werden wir prüfen, ob wir mit neuen Anleitungen eine ressourcenschonendere Nutzung der lobid-API unterstützen können.</p>
<h2 id="frage-4-mit-welcher-häufigkeitfrequenz-nutzen-sie-lobid">Frage 4: Mit welcher Häufigkeit/Frequenz nutzen Sie lobid?</h2>
<table>
<thead>
<tr>
<th>Antwort</th>
<th>Anteil</th>
</tr>
</thead>
<tbody>
<tr>
<td>Regelmäßig</td>
<td>58,44 %</td>
</tr>
<tr>
<td>Zeitlich begrenzt</td>
<td>41,56 %</td>
</tr>
</tbody>
</table>
<p>Bei dieser Frage zeigt sich nochmal deutlich der Anteil von (Forschungs-)projekten.</p>
<h2 id="frage-5-welche-tools-nutzen-sie-um-lobid-abzufragen">Frage 5: Welche Tools nutzen Sie um lobid abzufragen?</h2>
<p><img src="/images/2022-07-survey-results/frage5-tools.png" alt="frage-5" /></p>
<p>Es ist schön zu sehen, mit welcher Vielfalt an Werkzeugen die lobid-API genutzt wird. Bei den Programmiersprachen führt Python (23) vor Java (7), Javascript (4), Perl (3) und PHP (3). Spezifisch für lobid entwickelte Clients wie <a href="https://github.com/csae8092/pylobid">pylobid</a> (0), <a href="https://github.com/telota/lobid-client">lobid-client</a> (1) und <a href="https://github.com/acdh-oeaw/django-gnd">django-gnd</a> (0) wurden fast gar nicht genannt. Wir sind selbst erst im Rahmen der Umfrage <a href="https://twitter.com/lobidOrg/status/1494650142972129283">darauf aufmerksam geworden</a>, so dass diese sicher noch bekannter gemacht werden könnten.</p>
<h2 id="frage-6-wofür-nutzen-sie-lobid">Frage 6: Wofür nutzen Sie lobid?</h2>
<p>Hier waren wir schlicht überwältigt von der vielfältigen Nutzung. Einige Teilnehmer*innen der Umfrage haben sich die Mühe gemacht, ihre Anwendungsfälle detailliert zu beschreiben. Wir finden das sind viele inspirierende Beispiele, von denen andere profitieren können. Daher wollen wir in Zukunft gerne eine Sammlung von Anwendungsfällen aufbauen, in die sich dann alle auch selbst eintragen können.</p>
<h2 id="frage-7-erwähnen-sie-lobid-in-irgendeiner-weise-öffentlich-als-datenquelle">Frage 7: Erwähnen Sie lobid in irgendeiner Weise öffentlich als Datenquelle?</h2>
<table>
<thead>
<tr>
<th>Antwort</th>
<th>Anteil</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ja</td>
<td>41,54 %</td>
</tr>
<tr>
<td>Nein</td>
<td>58,46 %</td>
</tr>
</tbody>
</table>
<p>Vielen Dank für die Credits! Bislang gibt es dazu keine Empfehlungen und trotzdem hat fast die Hälfte bereits lobid als Datenquelle öffentlich erwähnt. In einigen Anwendungsfällen, z.B. bei Hintergrunddiensten, gibt es auch gar keine einfache Möglichkeit für eine öffentliche Notiz. Wir schauen uns die bisherigen Beispiele an und prüfen dann, ob wir allgemeine Empfehlungen aussprechen können.</p>
<h2 id="und-wozu-die-ganzen-fragen">Und wozu die ganzen Fragen?</h2>
<p>Wie hier im Blog schon zuvor berichtet, arbeiten wir an der Entwicklung von Leitlinien für die Nutzung offener Dienste. Wir sind oft nach Vorgaben und Empfehlungen zur Nutzung der lobid-API gefragt worden und möchten das nun einmal für zukünftige Nutzer*innen ausarbeiten.</p>
<p>Als nächstes werden wir ein paar der Interviewpartner kontaktieren, um einzelne Anwendungsfälle noch genauer zu verstehen und Ideen für die Nutzungspolicy zu diskutieren. Außerdem werden wir recherchieren, was andere offene Dienste (frei zugängliche APIs ohne Registrierungszwang) regeln.</p>
<p>Zum Ende dieses kleinen Projekts in Zusammenarbeit mit <a href="https://opencultureconsulting.com">Open Culture Consulting</a> sollen dann Entwürfe einer Nutzungspolicy und technischer Empfehlungen vorliegen, die wir gerne hier im Blog zur Diskussion stellen werden.</p>
Umfrage: Wer nutzt die lobid-API und wofür?2022-02-03T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2022/02/03/umfrage<p>lobid stellt seit mehr als zehn Jahren eine offene Programmierschnittstelle (API) für verschiedene bibliothekarische Datensets zur Verfügung, u.a. die Gemeinsame Normdatei. Wir bitten alle lobid-Nutzer*innen darum, uns durch die Teilnahme an einer kleinen, maximal fünfminütigen Umfrage zu unterstützen. Hier der Link zur Umfrage: <a href="https://survey.lamapoll.de/lobid-api">https://survey.lamapoll.de/lobid-api</a></p>
<p><img src="/images/lobid-poll.png" alt="Screenshot von einem Teil des Umfrageformulars mit den Fragen 'Welche Dienste von lobid nutzen Sie?' und 'In welchem Anwendungskontext verwenden Sie lobid?'" />
<small>Abbildung: Screenshot von einem Teil des Umfrageformulars</small></p>
<p>Der Hintergrund: In Zusammenarbeit mit <a href="https://opencultureconsulting.com/">Open Culture Consulting</a> haben wir gerade ein kleines Projekt begonnen. Ziel des Projekts ist die Entwicklung von Leitlinien für die Nutzung offener Dienste, also solcher Dienste, die ohne Authentifizerung oder gar Vertrag nutzbar sind. Wir haben vor, das Projekt bis zum Sommer zu beenden und werden alle Interessierten hier sowie auf <a href="https://twitter.com/lobidOrg">Twitter</a> und <a href="https://openbiblio.social/@lobid">Mastodon</a> auf dem Laufenden halten.</p>
Ein Protokoll für den Datenabgleich im Web am Beispiel von OpenRefine und der Gemeinsamen Normdatei (GND)2022-01-20T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2022/01/20/reconciliation-api-beitrag<p><img src="/images/recon-article-screenshot.png" alt="Screenshot mit bibliographischen Angaben des Beitrags von der De-Gruyter-Webseite." /></p>
<p>Bereits im Oktober 2021 wurde der Sammelband <a href="https://doi.org/10.1515/9783110691597">Qualität in der Inhaltserschließung</a>, herausgegeben von Michael Franke-Maier, Anna Kasprzik, Andreas Ledl und Hans Schürmann, veröffentlicht, in dem auch ein Beitrag aus dem lobid-Team mit dem Titel <a href="https://doi.org/10.1515/9783110691597-013">Ein Protokoll für den Datenabgleich im Web am Beispiel von OpenRefine und der Gemeinsamen Normdatei (GND)</a> enthalten ist.</p>
<p>Wir bedanken uns bei den Herausgeber:innen für die gute Kommunikation und insgesamt tolle Arbeit an dem Sammelband (<a href="https://www.uebertext.org/2014/03/sammelband-herausgeben-gelernt.html">ich weiß wovon ich spreche</a>). Das Ergebnis kann sich sehen lassen und ist – wie sich das gehört – Open Access zugänglich, was auch eine Bedingung von uns und anderen Autor:innen für einen Beitrag war.</p>
<h2 id="zusammenfassung">Zusammenfassung</h2>
<p>Normdaten spielen als externe Datenquellen eine wichtige Rolle für die Qualität der Inhaltserschließung. OpenRefine ermöglicht über eine Reconciliation-API den Abgleich eigener Daten mit externen Datenquellen. Das hbz stellt mit lobid-gnd eine solche Datenquelle für die GND bereit. Dieser Beitrag stellt nach einer Einordnung der Reconciliation für die Inhaltserschließung die Möglichkeiten der Reconciliation-API anhand ihrer Verwendung in OpenRefine zum Abgleich mit der GND dar. Anschließend wird als Ausblick die Arbeit der Entity Reconciliation Community Group des W3C vorgestellt, in der ein Protokoll zur Standardisierung dieser Funktionalität entwickelt wird.</p>
<p>Der Beitrag behandelt so die Qualität des Datenaustauschs (speziell die Beschreibung und Verbesserung des Protokolls selbst im Rahmen einer Standardisierung), die Qualität von Datensätzen im Kontext anderer Datensätze (speziell die Einheitlichkeit der Verknüpfung und Ermöglichung von Datenanreicherung durch Nutzung von Normdaten statt der Verwendung von Freitext), sowie die Qualität von Werkzeugen und Algorithmen (speziell von Werkzeugen, die das Protokoll nutzen, konkret OpenRefine, sowie durch das Protokoll ermöglichte Arbeitsabläufe).</p>
GND-Integration in die Repository-Software DSpace auf Basis der lobid-API 2021-06-22T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2021/06/22/bibtag21<p>Beim <a href="https://bibliothekartag2021.de/">109. Bibliothekstag</a> haben Pascal Becker vom DSpace Service Provider <a href="https://www.the-library-code.de/">The Library Code</a> und Adrian Pohl vom lobid-team einen gemeinsamen Vortrag in der Session “Repositorien aktuell” gehalten mit dem Titel “Integration der gemeinsamen Normdatei in DSpace auf Basis von lobid”.</p>
<p><img src="/images/2021-06-22-bibtag21.png" alt="Ergebnis der lobid-basierten Suche nach "Yellowstone" in der DSpace-Oberfläche" />
Abbildung: Ergebnisanzeige einer lobid-basierten Suche nach “Yellowstone” in der DSpace-Oberfläche</p>
<p>Die Vortragsfolien sind online:</p>
<ul>
<li><a href="https://slides.lobid.org/2021-06-17-bibtag21/">Teil I von Adrian zu lobid-gnd</a></li>
<li><a href="https://www.slideshare.net/pascalbecker/integration-der-gemeinsamen-normdatei-in-dspace-auf-basis-von-lobid/pascalbecker/integration-der-gemeinsamen-normdatei-in-dspace-auf-basis-von-lobid">Teil II von Pascal über die DSpace-Integration</a></li>
</ul>
<p>Alle registrierten Teilnehmer*innen des Bibliothekstag können die Aufzeichnung hier ansehen: <a href="https://dbt2021.pathable.eu/meetings/virtual/FvvQM9pqf2KktnuAW">https://dbt2021.pathable.eu/meetings/virtual/FvvQM9pqf2KktnuAW</a></p>
<p>Ab Oktober 2021 werden die Aufzeichnungen offen zugänglich für alle im TIB-AV-Portal zur Verfügung gestellt.</p>
Reconciliation mit lobid, OpenRefine und Cocoda bei der GNDCon2021-06-18T00:00:00+00:00Adrian Pohl, Fabian Steeg, Jakob Voßhttp://blog.lobid.org/2021/06/18/gndcon-reconciliation<p>In der letzten Woche fand die <a href="https://wiki.dnb.de/display/GNDCON/GNDCon">GNDCon 2.0</a> statt. Die zweite Ausgabe der GNDCon wurde dezentral veranstaltet. Verschiedene Akteure übernahmen dabei die inhaltliche Umsetzung und kümmerten sich um das technische Hosting für eine “MiniCon”. Wir haben gemeinsam mit Jakob Voß von der Verbundzentrale des GBV die <a href="https://wiki.dnb.de/x/qx0RD">MiniCon “Wie verlinken wir unsere Daten mit der GND?”</a> angeboten.</p>
<p><img src="/images/gndcon2021-logos.png" alt="Die Logos von ColiConc, OpenRefine, lobid und GND" /></p>
<h2 id="reconciliation-als-grundlage-für-die-verlinkung-mit-normdaten">Reconciliation als Grundlage für die Verlinkung mit Normdaten</h2>
<p>Grundlage einer solchen Verlinkung eigener Daten ist ein Abgleich dieser Daten mit der GND. Dieser zugrunde liegende Prozess des Datenabgleichs wird auch als <em>Reconciliation</em> bezeichnet. Adrian bestimmte in seinem <a href="https://pad.gwdg.de/p/gndcon2021-reconciliation-i">Einleitungsvortrag</a> Reconciliation wie folgt:</p>
<blockquote>
<p>“Reconciliation ist ein Prozess zum Abgleich von Namen und ggf. weiteren Attributen (einer Person, eines Ortes, eines Schlagworts etc.) mit jeweils einem Eintrag innerhalb einer Normdatei”</p>
</blockquote>
<p>Anwendungsfälle gibt es viele, allein schon im Kontext der Gemeinsamen Normdatei (GND) wollen viele Akteure aus Museen und Archiven oder etwa den Digital Humanities eigene Daten mit der GND verknüpfen. Neben der GND gibt es eine größere Anzahl weiterer <a href="https://reconciliation-api.github.io/testbench/">Datenquellen, für die eine Reconciliationschnittstelle angeboten wird</a>. Der große Bedarf an Möglichkeiten zur Reconciliation mit Normdatenquellen – nicht nur im Bibliotheksbereich – wurde von der Community erkannt und hat zur Gründung einer <a href="https://www.w3.org/community/reconciliation/">Entity Reconciliation Community Group</a> (CG) im Rahmen des World Wide Web Consortium (W3C) geführt. Das lobid-Team ist mit Adrian und Fabian in der Gruppe vertreten, siehe auch Fabians Blogbeitrag <a href="https://www.w3.org/community/reconciliation/2021/01/04/supporting-reconciliation-from-a-library-perspective/">“Supporting reconciliation from a library perspective”</a>.</p>
<p>Die Entity Reconciliation CG zielt mittelfristig auf die <a href="https://reconciliation-api.github.io/specs/latest/">Spezifikation</a> eines allgemeinen Protokolls für den Datenabgleich im Web ab. In einem ersten Schritt wird zunächst die bestehende API der <a href="https://docs.openrefine.org/manual/reconciling">Reconciliation-Funktionalität in OpenRefine</a> spezifiziert. OpenRefine ist – <a href="https://openrefine.org/blog/2020/02/20/2020-survey-results.html">auch im Bibliotheksbereich</a> – eines der meistbenutzten und -bewährten Werkzeuge für Datenbereinigung und -abgleich und wird als <a href="https://openrefine.org/blog/2019/11/14/czi-eoss.html">Essential Open Source Software for Science</a> gefördert. Als generisches tabellenbasiertes Werkzeug zur Bereinigung und Transformation von Daten ermöglicht OpenRefine auch die Verknüpfung mit verschiedenen Normdatenquellen und die darauf folgende Anreicherung aus den verknüpften Normdaten.</p>
<h2 id="reconciliation-von-lokalen-daten-und-der-gnd-mit-openrefine">Reconciliation von lokalen Daten und der GND mit OpenRefine</h2>
<p>In seiner Präsentation zur <a href="https://slides.lobid.org/2021-gndcon-reconcile/">OpenRefine Reconciliation mit lobid-gnd</a> gab Fabian zunächst einen Überblick zu den <a href="https://slides.lobid.org/2021-gndcon-reconcile/#/8">Datenquellen</a> und der <a href="https://slides.lobid.org/2021-gndcon-reconcile/#/10">Rechercheoberfläche</a> von lobid-gnd. Die Oberfläche dient hier zum Erkunden der Daten, deren Verständnis eine wichtige Grundlage für einen erfolgreichen Abgleich darstellt.</p>
<p>Im Anschluss wurde zunächst das <a href="https://slides.lobid.org/2021-gndcon-reconcile/#/18">grundsätzliche Vorgehen</a> beim Datenabgleich mit der <a href="https://lobid.org/gnd/reconcile">Reconciliation-Schnittstelle</a> von lobid-gnd in OpenRefine vorgestellt, sowie die darauf aufbauende <a href="https://slides.lobid.org/2021-gndcon-reconcile/#/33">Anreicherung</a> auf Basis der abgeglichenen GND-Einträge.</p>
<p>Schließlich wurden <a href="https://slides.lobid.org/2021-gndcon-reconcile/#/44">verschiedene Strategien</a> zur Verbesserung der Qualität des Abgleichs vorgestellt, insbesondere die <a href="https://slides.lobid.org/2021-gndcon-reconcile/#/47">Verwendung zusätzlicher lokalen Daten</a> (z.B. Lebensdaten und Berufe) als Merkmale zur Disambiguierung der abzugleichenden Namen.</p>
<h2 id="reconciliation-von-normdaten-untereinander-mit-cocoda">Reconciliation von Normdaten untereinander mit Cocoda</h2>
<p>Mit <a href="https://coli-conc.gbv.de/de/cocoda/">Cocoda</a> wurde im zweiten Teil der MinCon eine Webanwendung vorgestellt, die ebenfalls die Reconciliation API verwendet, um passende Einträge in der GND oder in anderen Normdateien zu finden. Wie Jakob in <a href="https://coli-conc.gbv.de/publications/gndcon2021.pdf">seiner Präsentation</a> und einer kurzen Live-Demo zeigte, ist Cocoda im Rahmen des Projekt coli-conc vor Allem entwickelt worden um verschiedene Klassifikationen durch Mappings aufeinander abzubilden. Herausgekommen ist allerdings auch eine Infrastruktur zum einheitlichen Zugriff auf unterschiedlichste Vokabulare, darunter GND, RVK, DDC und Wikidata.</p>
<p>In Cocoda lassen sich nicht nur Vokabulare auf die GND abbilden sondern auch vorhandene Mappings von und auf die GND durchsuchen. Eine Besonderheit von Cocoda ist, dass einzelne Mappings mit ihrer Provenienz gespeichert werden und mit einem Review-System auch komplexere Workflows zur Qualitätssicherung umgesetzt werden können. Der Vortrag schloss mit einem Vergleich von Cocoda und OpenRefine um Anhaltspunkte zu geben wann welches Werkzeug besser geeignet ist.</p>
<h2 id="diskussion">Diskussion</h2>
<p>Schon während der Vorträge entstand im Chat eine lebhafte Diskussion, die zum Teil in Pausen, zum Teil nach den Vorträgen im Plenum aufgegriffen wurde. Den vollständigen Chatverlauf und die Ergebniss von zwei Umfragen finden sich im <a href="https://etherpad.lobid.org/p/gndcon2021">Etherpad</a> zu der Veranstaltung.</p>
<p>So wurde etwa das Einspielen eigener Daten angesprochen, wenn die GND keinen passenden Eintrag enthält. In OpenRefine lässt sich eine Liste von nicht gemappten Einträgen exportieren, um anschließend beispielsweise im GND-Redaktionsystem neue GND-Einträge zu erstellen. In Cocoda ist es möglich, zumindest auf übergeordnete Einträge zu mappen. Eine Vorschlagsfunktion für neue GND-Einträge ist in Cocoda angedacht, erfordert jedoch die Anbindung an eine Schreib-API für neue Begriffe. Solch eine API könnte auch in OpenRefine verwendet werden um direkt aus der Anwendung Ergänzungen in die GND aufzunehmen, vergleichbar mit der in OpenRefine enthaltenen <a href="https://www.wikidata.org/wiki/Wikidata:Tools/OpenRefine/Editing/Tutorials/Basic_editing">Extension zum Import in Wikidata</a>.</p>
<p>In der <a href="https://wiki.dnb.de/x/kAdND">Runde des Resümees</a> am Ende des Tages wurde mit Vertreter*innen verschiedener technisch orientierter MiniCons über die technische Weiterentwicklung der GND diskutiert. Auch hier war der Datenabgleich ein Thema, insbesondere wurde die Bedeutung von Standards bei der Zusammenarbeit in einer verteilten Infrastruktur wie der GND-Kooperative betont.</p>
<p>Zugleich wurde deutlich, wie herausfordernd eine konsolidierte webbasierte Bereitstellung der GND-Daten ist. Die Daten liegen originär in traditionell bibliothekarischen Datenformaten vor (Internformat Pica, Austauschformat MARC), die sich nicht unmittelbar für die Webentwicklung eignen. Deshalb bildet für lobid-gnd der <a href="https://www.dnb.de/DE/Professionell/Metadatendienste/Datenbezug/LDS/lds_node.html">Linked-Data-Service</a> (LDS) der DNB die Datenbasis, allerdings bilden die LDS-Daten nicht alle Informationen aus den Pica-Daten ab. Die Möglichkeit einer kollaborativen Weiterentwicklung der LDS-Daten wäre aus unserer Sicht ein wichtiger Schritt hin zu mehr Zusammenarbeit in der GND-Kooperative bei der Entwicklung neuer bzw. Konsolidierung bestehender GND-Webangebote.</p>
Code4Lib-Artikel zum Aufbau der NWBib- Raumsystematik auf Basis von Wikidata2021-06-16T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2021/06/16/nwbib-wikidata-code4lib<p>In dem 2016 erschienenen <a href="https://libreas.eu/ausgabe29/04pohl/">Libreas-Artikel von Adrian Pohl und Fabian Steeg</a> “Zurück ins Web. Die Entwicklung eines neuen Webauftritts für die Nordrhein-Westfälische Bibliographie (NWBib)” heißt es:</p>
<blockquote>
<p>“Als fortwährendes und bis heute nicht gelöstes Problem erwiesen sich die von der NWBib-Redaktion so genannten “Gliedernden Schlagwörter” (GSW). Diese sind der groben Ortsklassifikation beigeordnet und geben einen konkreten Ort, auf den sich der Inhalt eines Titel bezieht. Dabei kann es sich um Angabe eines Orts (zum Beispiel “Köln”) oder eines Ortsteils (zum Beispiel “Köln-Ehrenfeld”) handeln. Diese Schlagwörter sind nicht normiert, so dass es für denselben Ort verschiedene Schreibweisen geben kann. (…)</p>
<p>Schon früh gab es den Wunsch, die GSW in die normierte Systematik zu integrieren und im Zuge dessen verschiedene Schreibweisen zu eliminieren. Eine vernünftige und zukunftssichere Lösung ist allerdings nur unter Anpassung der Quelldaten in der Aleph-Verbunddatenbank machbar und sollte mit einer Änderung der Katalogisierungspraxis einhergehen. Da sich hier keine einfache Lösung anbietet, wurde die Umsetzung auf die Zeit nach dem offiziellen Launch der NWBib vertagt. Aus Sicht des Entwicklungsteams sollte es Ziel sein, die Raumsystematik um Orte und Ortsteile zu erweitern beziehungsweise bestehende Ortsdatenbanken wie GeoNames oder Wikidata zu nutzen, um eine kontrollierte Erfassung zu gewährleisten.”</p>
</blockquote>
<p>In einem Projekt von Ende 2017 bis Anfang 2020 haben wir schließlich die nicht normierten Gliedernden Schlagwörter in eine normierte Raumsystematik überführt. Dazu findet sich in der aktuellen Ausgabe des Code4Lib-Magazins ein Artikel, der das Projekt dokumentiert: Pohl, Adrian (2021): How We Built a Spatial Subject Classification Based on Wikidata. In: Code4Lib 51. URL: <a href="https://journal.code4lib.org/articles/15875">https://journal.code4lib.org/articles/15875</a></p>
<p>Hier das Abstract:</p>
<blockquote>
<p>“From the fall of 2017 to the beginning of 2020 a project had been carried out to upgrade spatial subject indexing in North Rhine-Westphalian Bibliography (NWBib) from uncontrolled strings to controlled values. For this purpose, a spatial classification with around 4,500 entries was created from Wikidata and published as SKOS (Simple Knowledge Organization System) vocabulary. The article gives an overview over the initial problem and outlines the different implementation steps.”</p>
</blockquote>
ActivityPub Conference 20202020-10-09T00:00:00+00:00Adrian Pohl, Felix Ostrowskihttp://blog.lobid.org/2020/10/09/skohub-apconf<p>From 2-5 October the <a href="https://conf.activitypub.rocks/">ActivityPub conference</a> happened online where people using the ActivityPub protocol came together to discuss topics all around federated networks and the respective web standards. For presentations, a flipped classroom approach was chosen where talks would be uploaded before the conference and the live part would be Q&A sessions for each talk. On Sunday, there was an additional round of lightning talks and some birds of a feather (bof) sessions where – quite similar to a barcamp session – people interested in a topic could propose a session and meet with likeminded people.</p>
<p>The programme with links to the recordings and forum can be viewed at <a href="https://conf.activitypub.rocks/#live">https://conf.activitypub.rocks/#live</a>.</p>
<p>On Friday, we had a session about SkoHub. Here is our previously recorded video:</p>
<iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://conf.tube/videos/embed/85a7d230-7e75-48fd-b399-d182ddece030" frameborder="0" allowfullscreen=""></iframe>
<p>With regard to creating and maintaining controlled vocabularies and assigning topics, (at least some) people who develop applications for the Fediverse have quite some interest in building on experiences and approaches from the library world. What we learned from our Q&A session is to better prepare next time as there most certainly will be some people who haven’t fully watched the recording or where some time has passed since watching it: Next time we would have some slides ready to recap the basic concepts and some links to point to exemplary implementations and further information.</p>
<p>Here are some projects that are dealing with categories, taxonomies in the Fediverse:</p>
<ul>
<li><a href="https://socialhub.activitypub.rocks/t/commonspub-and-the-quest-for-a-modular-decentralised-app-ecosystem/938"><strong>CommonsPub</strong></a> – which builds on experiences from MoodleNet – is working on “[f]ederated taxonomies for topic-based search and discovery across instances.”</li>
<li>The CommonsPub-based <a href="https://haha.academy/"><strong>HAHA</strong> Academy</a> is experimenting with collaboratively created and maintained <a href="https://haha.academy/#the_knowledge">“taxonomy of all human knowledge”</a>.</li>
<li><a href="https://socialhub.activitypub.rocks/t/learnawesome-org-building-a-better-goodreads-with-activitypub/946"><strong>LearnAwesome.org</strong></a> helps people in managing and finding learning material online in very different formats. It supports following certain topics.</li>
<li>The <a href="https://socialhub.activitypub.rocks/t/the-reboot-of-the-indymedia-project/942"><strong>“Rebooting Indymedia” project</strong></a> wants to use topic-based channels to create moderation workflows for building independent news sites from decentrally published content.</li>
<li>In a related effort by Trolli Schmittlauch, the problem is addressed how to create a comprehensive <strong>hashtag search</strong> & subscription in a federated social network. See <a href="https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf">this paper</a> for details.</li>
</ul>
<p>In a birds of a feather session about <a href="https://socialhub.activitypub.rocks/t/topics-and-services-we-can-subscribe-to/995">“Topics” and Services we can subscribe to</a> some of the people working on tags, controlled vocabularies etc. came together and had a fruitful exchange, sorting out the different problems and which approaches exist to address them. We are looking forward to further working on SkoHub and discussing common approaches to assigning or following controlled topics in the fediverse.</p>
Presenting SkoHub PubSub2020-06-25T00:00:00+00:00Adrian Pohl, Felix Ostrowskihttp://blog.lobid.org/2020/06/25/skohub-pubsub<p>In the previous blog posts we have presented <a href="http://blog.lobid.org/2019/09/27/presenting-skohub-vocabs.html">SkoHub Vocabs</a> and <a href="http://blog.lobid.org/2020/03/31/skohub-editor.html">SkoHub Editor</a>. In the final post of this SkoHub introduction series we will take a deeper look at SkoHub PubSub, the part of SkoHub that brings the novel approach of KOS-based content subscription into the game.</p>
<p>Let’s refresh what SkoHub is about by quoting the gist from <a href="https://skohub.io/">the project homepage</a>:</p>
<blockquote>
<p>SkoHub supports a novel approach for finding content on the web. The general idea is to extend the scope of Knowledge Organization Systems (KOS) to also act as communication hubs for publishers and information seekers. In effect, SkoHub allows to follow specific subjects in order to be notified when new content about that subject is published.</p>
</blockquote>
<p>Before diving into the technical implementation and protocols used, we provide an example on how this subscription, publication and notification process can be carried out in practice. Although SkoHub PubSub constitutes the core of the SkoHub infrastructure being the module that brings all SkoHub components together, it is not visible to end users by itself but only through applications which send out notifications or subscribe to a specific topic. (This is the great thing about open standards as it also invites everybody to develop new clients for specific use cases!)</p>
<p>So, let’s take a look at an example workflow involving SkoHub Editor and the federated microblogging service <a href="https://en.wikipedia.org/wiki/Mastodon_(software)">Mastodon</a> to demonstrate the functionalities.</p>
<h2 id="subscribing-to-a-subject">Subscribing to a subject</h2>
<p>In one of the already mentioned blog posts we exemplarily published the <a href="https://w3id.org/class/esc/scheme">Educational Subjects Classification</a> with SkoHub Vocabs. Now, let’s take a look at a single subject from this classification, e.g. <a href="https://w3id.org/class/esc/n0322">Library, information and archival studies</a>:</p>
<p><img src="/images/skohub-pubsub/concept.png" alt="Screenshot of the HTML version of a SKOS concept published with SkoHub." /></p>
<p>On the left-hand side, you can see the location of the topic in the classification hierarchy. On the right-hand side, there is some basic information on the subject: It has a URI (<code class="language-plaintext highlighter-rouge">https://w3id.org/class/esc/n0322</code>), a notation (<code class="language-plaintext highlighter-rouge">0322</code>), a preferred label (<code class="language-plaintext highlighter-rouge">Library, information and archival studies</code>) and an inbox. This is how the <a href="https://w3id.org/class/esc/n0322.json">underlying JSON data</a> (e.g. by adding the format suffix <code class="language-plaintext highlighter-rouge">.json</code> to the URI) looks like:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://w3id.org/class/esc/n0322"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:</span><span class="s2">"Concept"</span><span class="p">,</span><span class="w">
</span><span class="nl">"followers"</span><span class="p">:</span><span class="s2">"https://skohub.io/followers?subject=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322"</span><span class="p">,</span><span class="w">
</span><span class="nl">"inbox"</span><span class="p">:</span><span class="s2">"https://skohub.io/inbox?actor=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322"</span><span class="p">,</span><span class="w">
</span><span class="nl">"prefLabel"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"en"</span><span class="p">:</span><span class="s2">"Library, information and archival studies"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"notation"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"0322"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"broader"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://w3id.org/class/esc/n032"</span><span class="p">,</span><span class="w">
</span><span class="nl">"prefLabel"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"en"</span><span class="p">:</span><span class="s2">"Journalism and information"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"inScheme"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://w3id.org/class/esc/scheme"</span><span class="p">,</span><span class="w">
</span><span class="nl">"title"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"en"</span><span class="p">:</span><span class="s2">"Educational Subjects Classification"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Besides the usual SKOS properties, the <code class="language-plaintext highlighter-rouge">followers</code> key gives a hint that I can somehow follow this subject. Clicking on the associated URL, I will see a JSON file containing the list of followers of this subject. I am also interested in this topic and want to follow it to receive notifications about new online resources that are published and tagged with this subject. How do I achieve this?</p>
<p>As already noted, what I need is an application that speaks ActivityPub. In this case we will use one of the most popular services in the <a href="https://en.wikipedia.org/wiki/Fediverse">Fediverse</a>: Mastodon. So, I open up my Mastodon client and put the topic URI into the search box:</p>
<p><img src="/images/skohub-pubsub/subscribe.png" alt="Screenshot of a Mastodon search result for a topic URL with adjacent subscribe button" style="width:420px" /></p>
<p>I click on the follow button and am now following this subject with my Mastodon account and will receive any updates posted by it.</p>
<h2 id="describing-and-announcing-a-resource-with-skohub-editor">Describing and announcing a resource with SkoHub Editor</h2>
<p>Let’s now switch into the role of a scholar, teacher, tutor or general interested person who has created an instructive online resource and wants to publish it to all people interested in the topic of “Library, information and archival studies”. In this case, I published a <a href="http://blog.lobid.org/2020/01/29/skohub-talk-at-swib19.html">blog post about a talk at SWIB19 – Semantic Web in Libraries Conference</a> and want to share it with others. I somehow need to send a message to the topic’s inbox, in this case I am using the SkoHub Editor (but it could be any other ActivityPub client or even the command line interface from which I publish). For the best user experience I download the SkoHub browser extension (<a href="https://addons.mozilla.org/firefox/addon/skohub-extension/">Firefox</a>, <a href="https://chrome.google.com/webstore/detail/skohub/ghalhmcgaicdcpmdicinaegnoanfmggd">Chrome</a>).</p>
<p>As the default JSON schema uses another classification, we first have to configure the editor based on a schema that actually makes use of the Educational Subjects Classification. For this, we created a <a href="https://raw.githubusercontent.com/dini-ag-kim/lrmi-profile/useEsc4Subjects/draft/schemas/schema.json">version of the default schema</a> that does so. Now I put it into the extension’s settings:</p>
<p><img src="/images/skohub-pubsub/configure-extension.png" alt="Screenshot of how to configure a custom schema in the SkoHub Editor extension for Firefox" /></p>
<p>Then, I fire up the extension when visiting the web page I like to share and add data to the input form:</p>
<p><img src="/images/skohub-pubsub/describing.png" alt="Describing a resource with the SkoHub Editor browser extension" /></p>
<p>I select the topic “Library, information and archival studies” from the suggestions in the “subject” field, add information on licensing etc. and click “Publish”. A pop up lets me know that the resource is published to “Library, information and archival studies”. In the background, the description of the resource is sent to the respective topic (it could be more than one) which distributes the information to all its subscribers. Thus, in the end I as a subscriber of the topic will receive a notification of the resource in my Mastodon timeline:</p>
<p><img src="/images/skohub-pubsub/toot.png" alt="The toot announcing a resource newly published to a SkoHub topic" style="width:500px" /></p>
<h2 id="protocols-and-implementation">Protocols and implementation</h2>
<p>The SkoHub-PubSub server is built in <a href="https://nodejs.org/en/">Node.js</a> and implements a subset of <a href="http://activitypub.rocks/">ActivityPub</a>, <a href="https://www.w3.org/TR/ldn/">Linked Data Notifications</a> and <a href="https://docs.joinmastodon.org/spec/webfinger/">Webfinger</a> to achieve the behavior described above. On the ActivityPub side, Server to Server <a href="https://www.w3.org/TR/activitypub/#follow-activity-inbox">Follow</a> and corresponding <a href="https://www.w3.org/TR/activitypub/#undo-activity-inbox">Undo</a> interactions can be received to handle the subscription mechanism. Non-activity messages are considered Linked Data Notifications and can simply be sent to the inbox of a subject using a <a href="https://www.w3.org/TR/ldn/#sender">POST request</a> with any JSON body. These notifications are considered metadata payload, wrapped in a <code class="language-plaintext highlighter-rouge">Create</code> action and distributed to every follower of the corresponding subject again using ActivityPub.</p>
<p>As for the internals, <a href="https://www.mongodb.com/">MongoDB</a> is used to manage followers lists and an <a href="https://www.elastic.co/elasticsearch/">Elasticsearch</a> index is used to keep an archive of all payloads that have been distributed. This archive can be used to search and further explore metadata that has been distributed, e.g. by visualizing the distribution of subjects across all payloads.</p>
<p>The most challenging aspects of the implementation were to gain an understanding of <a href="https://github.com/hbz/skohub-pubsub/issues/27">Webfinger</a> for user discovery and of the details of message signatures and how to validate them. <a href="https://blog.joinmastodon.org/2018/06/how-to-implement-a-basic-activitypub-server/">“How to implement a basic ActivityPub server”</a> was a good guidance here!</p>
<h2 id="outlook">Outlook</h2>
<p>We currently consider PubSub the least mature component of SkoHub. In the future, we would like to validate incoming Linked Data Notifications against a JSON schema that should be specific enough to ensure a consistent experience when viewing them e.g. in Mastodon but flexible enough to support additional use cases. We would also like to support <a href="https://github.com/hbz/skohub-pubsub/issues/38">ActivityPub on the publication side</a> and <a href="https://www.w3.org/TR/activitypub/#announce-activity-inbox">Announce</a> activities in order to enable use cases such as <a href="https://github.com/hbz/skohub-pubsub/issues/37">mentioning a SkoHub concept on Mastodon</a>. We would really value your input on this!</p>
Wir suchen: Informationsspezialist*in2020-06-03T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2020/06/03/stellenausschreibung-bib<hr />
<p><em>Die Original-Stellenangebot (PDF) findet sich bis zum <strong>Ende der Ausschreibungsfrist am 21.6.2020</strong> unter <a href="https://www.hbz-nrw.de/ueber-uns/stellenangebote/20oibib">https://www.hbz-nrw.de/ueber-uns/stellenangebote/20oibib</a>.</em></p>
<hr />
<p><img style="float: right; width:150px !important;" src="https://lobid.org/images/hbz.png" />
Das Hochschulbibliothekszentrum des Landes Nordrhein-Westfalen in Köln (hbz) ist eine zentrale Dienstleistungs- und Entwicklungseinrichtung für die Hochschulbibliotheken in NRW. Das hbz ist Mitglied des W3C. Es setzt sich für die Etablierung einer offenen Dateninfrastruktur in der Bibliothekswelt und der Wissenschaft ein und entwickelt aktiv Open-Source-Software.</p>
<p>Zur Verstärkung der Gruppe „Offene Infrastruktur“ suchen wir zum nächstmöglichen Zeitpunkt eine/einen</p>
<h2 style="text-align: center;">Informationsspezialistin/ Informationsspezialist (m/w/d)</h2>
<h3 style="text-align: center;">(bis Entgeltgruppe 11 TV-L bei Vorliegen der tariflichen Voraussetzung, zunächst auf zwei Jahre befristet)</h3>
<h3 id="ihre-aufgaben">Ihre Aufgaben</h3>
<ul>
<li>Mitarbeit an der Konzeption, Entwicklung und Pflege von IT-Services zum Konfigurieren und Teilen von ETL-Prozessen und zur Recherche von Open Educational Resources im Bereich Hochschule</li>
<li>Fokus auf User Interface und User Experience</li>
<li>Entwicklung Moderation und Unterstützung von Metadatenstandardisierung im Bereich Open Educational Resources</li>
</ul>
<h3 id="ihre-qualifikationen">Ihre Qualifikationen</h3>
<ul>
<li>Abgeschlossenes Studium im Bereich der Bibliotheks- und Informationswissenschaften, der Bibliotheksinformatik oder des Bibliotheksmanagements oder gleichwertige Kenntnisse und Erfahrungen</li>
<li>Kenntnisse im Bereich Web-Standards und bibliothekarischer Datenmodelle</li>
<li>Praktische Erfahrung und hohe Identifikation mit offenen Ansätzen (Open Source, Open Data, Open Access, Open Educational Resources, Open Web)</li>
<li>Bereitschaft und Fähigkeit, sich in technische Standards einzuarbeiten</li>
<li>Sehr gute analytische und kommunikative Fähigkeiten sowie eine selbstständige Arbeitsweise</li>
<li>Gute Englischkenntnisse</li>
</ul>
<h3 id="wir-bieten-ihnen">Wir bieten Ihnen</h3>
<ul>
<li>Mitarbeit an spannenden und innovativen Entwicklungen im Umfeld von Open Educational Resources (OER), und (Weiter-)Entwicklung von Expertise in Technologien wie Git, GitHub, Elasticsearch, Metafacture</li>
<li>Eine abwechslungsreiche und herausfordernde Tätigkeit in einer zukunftsgerichteten, hochschulnahen und IT-orientierten Dienstleistungseinrichtung im Herzen von Köln</li>
<li>Möglichkeit zur Teilnahme an nationalen und internationalen Konferenzen</li>
<li>Eine familienfreundliche Arbeitsumgebung (beispielsweise Teilzeit, Gleitzeit, Telearbeit)</li>
<li>Vielfältige Möglichkeiten zur Fort- und Weiterbildung</li>
<li>Möglichkeit zum Erwerb eines Jobtickets für den Verkehrsverbund Rhein-Sieg</li>
</ul>
<p>Die Eingruppierung erfolgt in Entgeltgruppe 11 des Tarifvertrages für den öffentlichen Dienst der Länder (TV-L). Eine endgültige Stellenbewertung bleibt vorbehalten.</p>
<p>Bewerbungen geeigneter schwerbehinderter Menschen und gleichgestellter behinderter Menschen gem. § 2 Abs. 3 SGB IX sind ausdrücklich erwünscht.</p>
<p>Das Land Nordrhein-Westfalen fördert die berufliche Entwicklung von Frauen. Bewerbungen von Frauen werden daher besonders begrüßt. In den Bereichen, in denen Frauen noch unterrepräsentiert sind, werden sie bei gleicher Eignung, Leistung und Befähigung nach Maßgabe des Landesgleichstellungsgesetzes bevorzugt berücksichtigt.</p>
<p>Die Ausschreibung wendet sich ausdrücklich auch an Menschen mit Migrationshintergrund.</p>
<p>Die Wahrnehmung der Aufgaben ist auch im Wege einer Teilzeitbeschäftigung möglich.</p>
<p><strong>Ansprechpartner</strong>
Für weitere Rückfragen steht Ihnen Herr Pohl gerne zur Verfügung (Telefon 0221/400 75-235, E-Mail: pohl@hbz-nrw.de). Allgemeine Informationen über das Hochschulbibliothekszentrum sind unter der Internetadresse <a href="http://www.hbz-nrw.de">www.hbz-nrw.de</a> einzusehen.</p>
<p><strong>Verfahren</strong>
Ihre Bewerbung mit den üblichen Unterlagen richten Sie bitte mit dem Kennwort “20oiDEV” bis zum <strong>21.06.2020</strong> an das</p>
<p style="text-align:center;">
<b>
Hochschulbibliothekszentrum des Landes NRW<br />
Personalservice<br />
Postfach 27 04 51<br />
50510 Köln
</b>
</p>
<p>oder digital per E-Mail an: <strong>bewerbung@hbz-nrw.de</strong>.</p>
<p><strong>Hinweis</strong>: Die üblichen Bewerbungsunterlagen bitte nur in Kopie einreichen. Es erfolgt keine Rücksendung. Die Unterlagen werden nach einer Aufbewahrungsfrist von fünf Monaten vernichtet. Bei einem beigefügten Freiumschlag erfolgt eine Rücksendung der Unterlagen. Bei einer digitalen Bewerbung bitte möglichst alle Dokumente in einer *.pdf-Datei oder in einem komprimierten Ordner versenden. Eine Bewerbung per E-Mail ist datenschutzmäßig bedenklich. Der Versender trägt dafür die volle Verantwortung.</p>
<p>Bitte beachten Sie unsere Datenschutzerklärung unter <a href="https://www.hbz-nrw.de/datenschutz-bewerbung">https://www.hbz-nrw.de/datenschutz-bewerbung</a>.</p>
<p>Vor Übersendung Ihrer Bewerbung werden Sie gebeten, Ihre Gehaltsvorstellung mit den durch den TV-L vorgegebenen Möglichkeiten abzugleichen (siehe hierzu <a href="https://www.tdl-online.de">www.tdl-online.de</a>).</p>
Wir suchen: Softwareentwicklerin/ Softwareentwickler (m/w/d)2020-05-19T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2020/05/19/stellenausschreibung-dev<hr />
<p><em>Die Original-Stellenangebot (PDF) findet sich bis zum <strong>Ende der Ausschreibungsfrist am 14.6.2020</strong> unter <a href="https://www.hbz-nrw.de/ueber-uns/stellenangebote/20oidev">https://www.hbz-nrw.de/ueber-uns/stellenangebote/20oidev</a>.</em></p>
<hr />
<p><img style="float: right; width:150px !important;" src="https://lobid.org/images/hbz.png" />
Das Hochschulbibliothekszentrum des Landes Nordrhein-Westfalen in Köln (hbz) ist eine zentrale Dienstleistungs- und Entwicklungseinrichtung für die Hochschulbibliotheken in NRW. Das hbz ist Mitglied des W3C. Es setzt sich für die Etablierung einer offenen Dateninfrastruktur in der Bibliothekswelt und der Wissenschaft ein und entwickelt aktiv Open-Source-Software.</p>
<p>Zur Verstärkung der Gruppe „Offene Infrastruktur“ suchen wir zum nächstmöglichen Zeitpunkt eine/einen</p>
<h2 style="text-align: center;">Softwareentwicklerin/ Softwareentwickler (m/w/d)</h2>
<h3 style="text-align: center;">(bis Entgeltgruppe 13 TV-L bei Vorliegen der tariflichen Voraussetzung, zunächst auf zwei Jahre befristet)</h3>
<h3 id="ihre-aufgaben">Ihre Aufgaben</h3>
<ul>
<li>Entwurf, Implementation, Tests und Dokumentation von Softwarekomponenten</li>
<li>Entwicklung einer Rechercheoberfläche für Open Educational Resources (OER) im Bereich Hochschule</li>
<li>Entwicklung einer Oberfläche zum Konfigurieren und Teilen von ETL-Prozessen</li>
</ul>
<h3 id="ihre-qualifikationen">Ihre Qualifikationen</h3>
<ul>
<li>Abgeschlossenes Hochschulstudium der Informatik oder vergleichbarer Studiengänge</li>
<li>Praktische Erfahrung in der Softwareentwicklung</li>
<li>Praktische Erfahrung und hohe Identifikation mit offenen Ansätzen (Open Source, Open Data, Open Access, Open Educational Resources, Open Web)</li>
<li>Bereitschaft und Fähigkeit, sich in technische Standards und/oder Frameworks einzuarbeiten</li>
<li>Sehr gute analytische und kommunikative Fähigkeiten sowie eine selbstständige Arbeitsweise</li>
<li>Gute Englischkenntnisse</li>
</ul>
<h3 id="wir-bieten-ihnen">Wir bieten Ihnen</h3>
<ul>
<li>Mitarbeit an spannenden und innovativen Entwicklungen im Umfeld von Open Educational Resources (OER), basierend auf einem Tech-Stack aus Git, GitHub, Elasticsearch, Java, Metafacture, Play, JSON, react.js, Linux</li>
<li>Eine abwechslungsreiche und herausfordernde Tätigkeit in einer zukunftsgerichteten, hochschulnahen und IT-orientierten Dienstleistungseinrichtung im Herzen von Köln</li>
<li>Möglichkeit zur Teilnahme an nationalen und internationalen Konferenzen</li>
<li>Eine familienfreundliche Arbeitsumgebung (beispielsweise Teilzeit, Gleitzeit, Telearbeit)</li>
<li>Vielfältige Möglichkeiten zur Fort- und Weiterbildung</li>
<li>Möglichkeit zum Erwerb eines Jobtickets für den Verkehrsverbund Rhein-Sieg</li>
</ul>
<p>Die Eingruppierung erfolgt in Entgeltgruppe 13 des Tarifvertrages für den öffentlichen Dienst der Länder (TV-L). Eine endgültige Stellenbewertung bleibt vorbehalten.</p>
<p>Bewerbungen geeigneter schwerbehinderter Menschen und gleichgestellter behinderter Menschen gem. § 2 Abs. 3 SGB IX sind ausdrücklich erwünscht.</p>
<p>Das Land Nordrhein-Westfalen fördert die berufliche Entwicklung von Frauen. Bewerbungen von Frauen werden daher besonders begrüßt. In den Bereichen, in denen Frauen noch unterrepräsentiert sind, werden sie bei gleicher Eignung, Leistung und Befähigung nach Maßgabe des Landesgleichstellungsgesetzes bevorzugt berücksichtigt.</p>
<p>Die Ausschreibung wendet sich ausdrücklich auch an Menschen mit Migrationshintergrund.</p>
<p>Die Wahrnehmung der Aufgaben ist auch im Wege einer Teilzeitbeschäftigung möglich.</p>
<p><strong>Ansprechpartner</strong>
Für weitere Rückfragen steht Ihnen Herr Pohl gerne zur Verfügung (Telefon 0221/400 75-235, E-Mail: pohl@hbz-nrw.de). Allgemeine Informationen über das Hochschulbibliothekszentrum sind unter der Internetadresse <a href="http://www.hbz-nrw.de">www.hbz-nrw.de</a> einzusehen.</p>
<p><strong>Verfahren</strong>
Ihre Bewerbung mit den üblichen Unterlagen richten Sie bitte mit dem Kennwort “20oiDEV” bis zum <strong>14.06.2020</strong> an das</p>
<p style="text-align:center;">
<b>
Hochschulbibliothekszentrum des Landes NRW<br />
Personalservice<br />
Postfach 27 04 51<br />
50510 Köln
</b>
</p>
<p>oder digital per E-Mail an: <strong>bewerbung@hbz-nrw.de</strong>.</p>
<p><strong>Hinweis</strong>: Die üblichen Bewerbungsunterlagen bitte nur in Kopie einreichen. Es erfolgt keine Rücksendung. Die Unterlagen werden nach einer Aufbewahrungsfrist von fünf Monaten vernichtet. Bei einem beigefügten Freiumschlag erfolgt eine Rücksendung der Unterlagen. Bei einer digitalen Bewerbung bitte möglichst alle Dokumente in einer *.pdf-Datei oder in einem komprimierten Ordner versenden. Eine Bewerbung per E-Mail ist datenschutzmäßig bedenklich. Der Versender trägt dafür die volle Verantwortung.</p>
<p>Bitte beachten Sie unsere Datenschutzerklärung unter <a href="https://www.hbz-nrw.de/datenschutz-bewerbung">https://www.hbz-nrw.de/datenschutz-bewerbung</a>.</p>
<p>Vor Übersendung Ihrer Bewerbung werden Sie gebeten, Ihre Gehaltsvorstellung mit den durch den TV-L vorgegebenen Möglichkeiten abzugleichen (siehe hierzu <a href="https://www.tdl-online.de">www.tdl-online.de</a>).</p>
Gemeinfreie Werke in lobid finden2020-04-27T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2020/04/27/gemeinfreie-titel-finden<p>Wir haben ein Anfrage bekommen, ob lobid benutzt werden könnte, um eine Liste von Titeln im Bestand einer bestimmten Bibliothek zu generieren, die mit hoher Wahrscheinlichkeit gemeinfrei sind. In diesem Beitrag werden zunächst die einzelnen Schritte ohne weitere Erklärung aufgezeigt und im Anschluss der Aufbau einer entsprechenden Abfrage erläutert.</p>
<hr />
<h2 id="kurzanleitung">Kurzanleitung</h2>
<p>Dies sind die Schritte, wenn ich im Bestand einer bestimmten Bibliothek eine Liste von Titeln browsen möchte, die mit recht hoher Wahrscheinlichkeit gemeinfrei sind (weil alle verzeichneten Beteiligten vor dem 1.1.1950 gestorben sind) und nicht schon in einer Online-Version vorliegen:</p>
<ol>
<li>Zu <a href="https://lobid.org/resources/">lobid-resources</a> gehen und in das Suchfenster folgendes einfügen bzw. einfach den Link klicken: <a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D+AND+contribution.agent.dateOfDeath%3A*+AND+NOT+medium.id%3A%22http%3A%2F%2Frdaregistry.info%2FtermList%2FRDACarrierType%2F1018%22"><code class="language-plaintext highlighter-rouge">NOT contribution.agent.dateOfDeath:[1950-01-01 TO *] AND contribution.agent.dateOfDeath:* AND NOT medium.id:"http://rdaregistry.info/termList/RDACarrierType/1018"</code></a></li>
<li>Nach Bedarf Filter anwenden (Erscheinungsjahr, Publikationstyp, Medientyp etc.) oder die Abfrage durch eine Volltextsuche in den Metadaten erweitern durch Voranstellen des Suchworts und eines <code class="language-plaintext highlighter-rouge">AND</code>, z.B.:
<a href="https://lobid.org/resources/search?q=seuche+AND+NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D+AND+contribution.agent.dateOfDeath:*+AND+NOT+medium.id%3A%22http%3A%2F%2Frdaregistry.info%2FtermList%2FRDACarrierType%2F1018%22"><code class="language-plaintext highlighter-rouge">seuche AND NOT contribution.agent.dateOfDeath:[1950-01-01 TO *] AND contribution.agent.dateOfDeath:* AND NOT medium.id:"http://rdaregistry.info/termList/RDACarrierType/1018"</code></a></li>
<li>Im Bestandsfilter meine Bibliothek wählen, z.B. UB Wuppertal: <img src="/images/gemeinfreie-titel-finden/bestandsfilter.png" alt="Bestandsfacette mit Auswahl der Bibliothek 'Wuppertal UB'" style="width:250px" /></li>
</ol>
<hr />
<h2 id="die-abfrage-im-detail">Die Abfrage im Detail</h2>
<p>Die Gemeinfreiheit eines Werkes beginnt jeweils in dem Jahr, das auf den 70. Todestag der Urheber*innen folgt. Das heißt, 2020 sind alle Werke gemeinfrei geworden, deren Urheber*innen 1949 gestorben sind. In der Wikipedia gibt es etwa zu Beginn jedes Jahres eine neue Liste der Urheber*innen, deren Werke gemeinfrei geworden sind. Mittlerweile wird diese Liste aus einer Wikidata-Anfrage automatisch generiert, siehe z.B. die <a href="https://de.wikipedia.org/wiki/Wikipedia:Public_Domain_Day/2020_in_Public_Domain">Liste von Urheberinnen und Urhebern, deren Werke am 1. Januar 2020 in Public Domain übergingen</a>. Etwas ähnliches wollen wir also auf Basis von lobid machen, nur, dass nicht Urheber*innen, sondern deren Werke (bzw. Druckausgaben) gelistet sind.</p>
<p>Das heißt, wir müssen die Titel in lobid-resources danach filtern, ob die dazu Beitragenden vor oder in 1949 gestorben sind. Da wir die Lebensdaten aus der GND übernehmen, ist dies mit einer einzelnen Abfrage möglich. Wir nutzen für unsere Abfragen die <a href="https://lucene.apache.org/core/5_5_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description">Lucene query string syntax</a>.</p>
<p>Zunächst schauen wir uns ein Beispiel an, um herauszufinden, wie wir unsere Abfrage formulieren müssen: <a href="https://lobid.org/resources/HT015046968">“Gone with the Wind”</a> von Margaret Mitchell, die am 16.8.1949 starb. Dort findet sich Angaben zum Sterbedatum wie folgt in den <a href="https://lobid.org/resources/HT015046968.json">JSON-Daten</a>.</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"contribution"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Contribution"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"agent"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/118734202"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Person"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Mitchell, Margaret"</span><span class="p">,</span><span class="w">
</span><span class="nl">"altLabel"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Mičel, Margaret"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Marsh, Margaret Mitchell"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Митчелл, Маргарет"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Mitchell, Margret"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Miqier, ..."</span><span class="p">,</span><span class="w">
</span><span class="s2">"Mitčell, Margaret"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Mitchel Marsh, Margaret Munnerlyn"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Mitchell, Margaret Munnerlyn"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"dateOfBirth"</span><span class="p">:</span><span class="s2">"1900"</span><span class="p">,</span><span class="w">
</span><span class="nl">"dateOfDeath"</span><span class="p">:</span><span class="s2">"1949"</span><span class="p">,</span><span class="w">
</span><span class="nl">"gndIdentifier"</span><span class="p">:</span><span class="s2">"118734202"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"role"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://id.loc.gov/vocabulary/relators/cre"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Autor/in"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Wie man sieht findet sich das Todesjahr im Feld <code class="language-plaintext highlighter-rouge">contribution.agent.dateOfDeath</code>. Wir müssten also alle Titel rausfiltern, die dort einen Wert größer als 1949 stehen haben. Die entsprechende Abfrage sieht wie folgt aus, wobei wir <a href="https://lucene.apache.org/core/5_5_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description">Range Searches</a> verwenden:</p>
<p><a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D"><code class="language-plaintext highlighter-rouge">NOT contribution.agent.dateOfDeath:[1950-01-01 TO *]</code></a></p>
<p>Das sind über 19 Millionen Titel und der gesamte hbz-Verbundkatalog beinhaltet gut 21 Millionen Titel. Da scheint also etwas mit unserer Abfrage nicht zu stimmen. Das zugrundeliegende Problem ist, dass in <a href="http://lobid.org/resources/search?q=NOT+_exists_%3Acontribution.agent.dateOfDeath">17 Millionen Titeln</a> das entsprechende Feld gar nicht vorhanden ist (und dementsprechend bei einer <code class="language-plaintext highlighter-rouge">NOT</code>-Abfrage in der Ergebnisliste auftauchen). Also sollten wir unsere gesamte Analyse also nur auf jene gut 4 Millionen Titel anwenden, bei denen sich überhaupt eine Angabe zum Sterbedatum der beteiligten Personen findet. Mit einer <code class="language-plaintext highlighter-rouge">*</code>-Abfrage kann ich auf alle Titel einschränken, in denen ein bestimmtes Feld gegeben ist:</p>
<p><a href="https://lobid.org/resources/search?q=contribution.agent.dateOfDeath%3A*"><code class="language-plaintext highlighter-rouge">contribution.agent.dateOfDeath:*</code></a></p>
<p>Mit dieser Einschränkung kann ich nun Titel identifizieren, die mit großer Wahrscheinlichkeit gemeinfrei sind, weil das Todesdatum der Beitragenden vor dem 1. Januar 1950 liegt. Das sind gut zwei Millionen Titel:</p>
<p><a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D+AND+contribution.agent.dateOfDeath%3A*"><code class="language-plaintext highlighter-rouge">NOT contribution.agent.dateOfDeath:[1950-01-01 TO *] AND contribution.agent.dateOfDeath:*</code></a></p>
<h2 id="bereits-digitalisierte-titel-herausfiltern">Bereits digitalisierte Titel herausfiltern</h2>
<p>Wenn man auf der Suche ist nach gemeinfreien Werken, die es sich zu digitalisieren lohnt, kann es sinnvoll sein, die online zugänglichen Ressourcen herauszufiltern, weil es sich dabei in der Regel um bereits digitalisierte gemeinfreie Titel handelt:</p>
<p><a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D+AND+contribution.agent.dateOfDeath%3A*+AND+NOT+medium.id%3A%22http%3A%2F%2Frdaregistry.info%2FtermList%2FRDACarrierType%2F1018%22"><code class="language-plaintext highlighter-rouge">NOT contribution.agent.dateOfDeath:[1950-01-01 TO *] AND contribution.agent.dateOfDeath:* AND NOT medium.id:"http://rdaregistry.info/termList/RDACarrierType/1018"</code></a></p>
<h2 id="filtern-nach-bestand">Filtern nach Bestand</h2>
<p>Das sind also gut 2 Millionen Titel im gesamten hbz-Verbundkatalog, die man sich nun genauer anschauen kann. Zum Beispiel kann diese Abfrage jetzt weiter nach Bestand gefiltert werden. Dies geht am bequemsten über den Bestandsfilter in der Benutzeroberfläche mit dem <code class="language-plaintext highlighter-rouge">owner</code>-Parameter, z.B. <a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D+AND+contribution.agent.dateOfDeath%3A*+AND+NOT+medium.id%3A%22http%3A%2F%2Frdaregistry.info%2FtermList%2FRDACarrierType%2F1018%22&owner=DE-468">gemeinfreie Titel im Bestand der UB Wuppertal</a>. Ich kann auch einfach nach Bestand in mehreren Bibliotheken filtern, indem ich in der Benutzeroberfläche mehrere Filter setze oder im <code class="language-plaintext highlighter-rouge">owner</code>-Parameter durch Komma getrennt mehrere ISILs angebe, z.B. <a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D+AND+contribution.agent.dateOfDeath%3A*+AND+NOT+medium.id%3A%22http%3A%2F%2Frdaregistry.info%2FtermList%2FRDACarrierType%2F1018%22&owner=DE-464,DE-465M,DE-465"><code class="language-plaintext highlighter-rouge">owner=DE-464,DE-465M,DE-465</code></a> (oder z.B. <a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A[1950-01-01+TO+*]+AND+contribution.agent.dateOfDeath%3A*+AND+NOT+medium.id%3A%22http%3A%2F%2Frdaregistry.info%2FtermList%2FRDACarrierType%2F1018%22&owner=DE-832,DE-Dm13"><code class="language-plaintext highlighter-rouge">DE-832,DE-Dm13</code></a>, wenn ich an Beständen in Fachhochschulbibliotheken interessiert bin.)</p>
<p>Komplizierter wird es, wenn ich den Bestand nach ISIL mit einer Wildcard filtern muss, z.B. um den Bestand in <a href="http://lobid.org/organisations/search?q=isil%3ADE-6-*">allen Instituts- und Fachbereichsbibliotheken der WWU Münster</a> abzudecken. Da der <code class="language-plaintext highlighter-rouge">owner</code>-Parameter nicht mit Wildcard funktioniert, muss ich eine Query auf das entsprechend Feld machen. Hier die Bestandsangabe aus einem <a href="https://lobid.org/resources/HT016153937">Beispieltitel</a>:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"hasItem"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://lobid.org/items/HT016153937:DE-6-015:Ks%201488%2F11#!"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Item"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"heldBy"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://lobid.org/organisations/DE-6-015#!"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"lobid Organisation"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"note"</span><span class="p">:</span><span class="s2">"00017001"</span><span class="p">,</span><span class="w">
</span><span class="nl">"callNumber"</span><span class="p">:</span><span class="s2">"Ks 1488/11"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Ks 1488/11"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Die entsprechende Abfrage aller der Universität Münster zugeordneten Bibliotheken sieht wie folgt aus:</p>
<p><a href="https://lobid.org/resources/search?q=hasItem.heldBy.id%3Ahttp%5C%3A%5C%2F%5C%2Flobid.org%5C%2Forganisations%5C%2FDE-6-*"><code class="language-plaintext highlighter-rouge">hasItem.heldBy.id:http\:\/\/lobid.org\/organisations\/DE-6-*</code></a></p>
<p>Allerdings fehlt darin noch die ULB Münster selbst (DE-6). Sie kann wie folgt ergänzt werden:</p>
<p><a href="https://lobid.org/resources/search?q=hasItem.heldBy.id%3A%28http%5C%3A%5C%2F%5C%2Flobid.org%5C%2Forganisations%5C%2FDE-6-*+OR+%22http%3A%2F%2Flobid.org%2Forganisations%2FDE-6%23%21%22%29"><code class="language-plaintext highlighter-rouge">hasItem.heldBy.id:(http\:\/\/lobid.org\/organisations\/DE-6-* OR "http://lobid.org/organisations/DE-6#!")</code></a></p>
<p>Hier die komplette Abfrage nach gemeinfreien Werken, eingeschränkt auf die ULB Münster und die der Universität Münster zugeordneten Bibliotheken:</p>
<p><a href="https://lobid.org/resources/search?q=NOT+contribution.agent.dateOfDeath%3A%5B1950-01-01+TO+*%5D+AND+contribution.agent.dateOfDeath%3A*+AND+NOT+medium.id%3A%22http%3A%2F%2Frdaregistry.info%2FtermList%2FRDACarrierType%2F1018%22+AND+hasItem.heldBy.id%3A%28http%5C%3A%5C%2F%5C%2Flobid.org%5C%2Forganisations%5C%2FDE-6-*+OR+%22http%3A%2F%2Flobid.org%2Forganisations%2FDE-6%23%21%22%29"><code class="language-plaintext highlighter-rouge">NOT contribution.agent.dateOfDeath:[1950-01-01 TO *] AND contribution.agent.dateOfDeath:* AND NOT medium.id:"http://rdaregistry.info/termList/RDACarrierType/1018" AND hasItem.heldBy.id:(http\:\/\/lobid.org\/organisations\/DE-6-* OR "http://lobid.org/organisations/DE-6#!")</code></a></p>
Verbesserte Metadaten zur Zugehörigkeit von Titeln zu E-Book-Paketen2020-04-15T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2020/04/15/ebook-packages<p>Kürzlich haben wir auf <a href="https://github.com/hbz/lobid-resources/issues/1052">Anfrage der UB Dortmund</a> Angaben zu E-Books in lobid-resources ergänzt, auch wenn das entsprechende E-Book-Paket nicht im ISIL-Verzeichnis enthalten ist. Im hbz-Wiki findet sich eine <a href="https://service-wiki.hbz-nrw.de/display/VDBE/Produktsigel+und+interne+Selektionskennzeichen">Übersicht über alle E-Book-Pakete im hbz-Verbundkatalog</a> mit Angabe ihrer ID – sei es eine ISIL oder eine interne ID.</p>
<p>Schon vorher gab es in Titeln, die einem E-Book-Paket mit ISIL zugehören, einen Verweis auf das jeweilige Paket. Zum Beispiel zeigt sich in den Metadaten zum E-Book “Gottlob Frege: Schriften zur Logik und Sprachphilosophie” (<a href="https://lobid.org/resources/HT020405841">https://lobid.org/resources/HT020405841</a>), dass es zu zwei E-Book-Paketen gehört:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"inCollection"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://lobid.org/organisations/ZDB-196-MPB#!"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Collection"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"eResource package"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://lobid.org/organisat<ions/ZDB-196-MEL#!"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Collection"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"eResource package"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Die neuen Angaben zu Paketen, die keine ISIL haben, sehen entsprechend aus. Ein Beispieltitel ist <a href="https://lobid.org/resources/HT020045788">https://lobid.org/resources/HT020045788</a> (<a href="https://lobid.org/resources/HT020045788.json">JSON</a>) mit diesen Angaben:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"inCollection"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://lobid.org/collections#wbv"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"W. Bertelsmann Verlag E-Books"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>In diesem Beispiel sind die Metadaten sogar deskriptiver als im obigen Beispiel, weil der Kollektionsname angezeigt wird. Allerdings haben wir nicht alle Namen konfigurieren können, so dass es manchmal aussieht wie in diesem <a href="https://lobid.org/resources/CT007001558">Beispiel</a> (<a href="https://lobid.org/resources/CT007001558.json">JSON</a>):</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"inCollection"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://lobid.org/collections#ldd"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"collections#ldd"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://lobid.org/collections#vl-ddbk"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"collections#vl-ddbk"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Die <code class="language-plaintext highlighter-rouge">label</code>-Angabe sollte allerdings ohnehin nie zu Query-Zwecken benutzt werden, sondern allein für die Anzeige. Zuverlässig ist in Abfragen allein die Nutzung von URIs (<code class="language-plaintext highlighter-rouge">id</code>).</p>
<h2 id="beispielsuche">Beispielsuche</h2>
<p>Mit den neuen Angaben ist es möglich, jedes E-Book-Paket einzeln zu durchsuchen, hier z. B. eine Suche nach “Bibliothek” in allen über die Nationallizenzen erworbenen Paketen:</p>
<p><a href="http://lobid.org/resources/search?q=inCollection.id%3A%22https%3A%2F%2Flobid.org%2Fcollections%23NLZ%22+AND+bibliothek"><code class="language-plaintext highlighter-rouge">inCollection.id:"https://lobid.org/collections#NLZ" AND bibliothek</code></a></p>
Presenting the SkoHub Editor2020-03-31T00:00:00+00:00Adrian Pohl, Felix Ostrowskihttp://blog.lobid.org/2020/03/31/skohub-editor<p>In a <a href="http://blog.lobid.org/2019/09/27/presenting-skohub-vocabs.html">previous blog post</a> we presented a first SkoHub module: <em>SkoHub Vocabs</em>. Before talking about another module, first a short summary of the features SkoHub Vocabs offers. Basically, it provides an editorial workflow to publish a SKOS vocabulary on the web which can then be consumed by humans and applications. It builds on git-based online software development platforms (currently GitHub and GitLab are supported) where you maintain a SKOS vocabulary as a Turtle file. This allows you to use all the associated features such as branches and pull requests for a full-fledged review process. With every new commit in a branch, triggered by a webhook, SkoHub Vocabs will build a static site for the vocab – with HTML for human consumption and JSON-LD for consumption by applications.</p>
<p>In this post, we present <em>SkoHub Editor</em> (<a href="https://skohub.io/editor/">demo</a>, <a href="https://github.com/hbz/skohub-editor">code</a>) that is accompanied by a browser extension. In a nutshell, SkoHub Editor enables the automatic generation of a web form based on a JSON schema, along with the possibility to look up terms in a controlled vocabulary that is published with SkoHub Vocabs. Additionally, metadata generated by the editor can be published using SkoHub PubSub, which we will describe in an upcoming post. Let’s take a look at the specifics by configuring an editor that lets you create JSON-LD describing an open educational resource (OER) on the web.</p>
<h2 id="describing-a-resource-with-the-browser-extension">Describing a resource with the browser extension</h2>
<p>Let’s start with actually using SkoHub Editor. You will have the most comfortable experience when using the SkoHub browser extension that wraps the SkoHub Editor and pre-populates some field in the web form. The browser extension is available both for <a href="https://addons.mozilla.org/en-US/firefox/addon/skohub-extension/">Firefox</a> and <a href="https://chrome.google.com/webstore/detail/skohub/ghalhmcgaicdcpmdicinaegnoanfmggd">Chrome</a>. Just add the extension to your browser and a little icon will be shown on the right-hand side of your navigation bar:</p>
<p><img src="/images/skohub-editor/extension-icon.png" alt="The SkoHub extension icon in between other extensions in the Firefox nav bar" style="width:600px" /></p>
<p>While having any web page open, you can now open the SkoHub editor in your browser to describe that web resource. Let’s use as an example the YouTube video <a href="https://www.youtube.com/watch?v=ZaiDDOZcaqc">“COVID-19 – 6 Dangerous Coronavirus Myths, Busted by World Health Organization”</a> published recently by the World Economic Forum under a CC-BY license. Open the video in your browser, click on the extension and you will see that several fields are automatically filled out.</p>
<p><img src="/images/skohub-editor/prepopulated-webform.png" alt="SkoHub extension in the sidebar of the browser with fields 'URL', 'Title' and 'Description' being pre-populated" style="width:600px" /></p>
<p>We can now add additional metadata by selecting a type (<code class="language-plaintext highlighter-rouge">VideoObject</code> in this case), add a creator, creation date, language etc. As we mentioned, you can look up a subject from a controlled vocabulary for some fields in the web form. You will experience this when inputting content into the fields “Subject”, “License”, “Learning Resource Type”, and “Intended Audience”. For those fields you will get a drop down with suggestions from a controlled vocabulary, e.g. for “Subject” from a German <a href="https://w3id.org/kim/hochschulfaechersystematik/scheme">classification</a> of subjects in Higher education that is published with SkoHub Vocabs.</p>
<p><img src="/images/skohub-editor/auto-suggestion-from-skos-vocab.png" alt="The string 'gesundh' is input in the subject field and several entries with this string from a controlled vocabulary are suggested." style="width:420px" /></p>
<p>Currently, only the fields “URL”, “Type” and “Title” are obligatory, all other fields are optional. When you think you have described the resource sufficiently, you can click on “Show Preview” in the extension, copy & paste the JSON-LD to the clipboard and include it in the HTML of any web page within a <code class="language-plaintext highlighter-rouge"><script type="application/ld+json"></code> tag.</p>
<p><img src="/images/skohub-editor/json-preview.png" alt="Preview of the structured JSON data in the SKoHub extension" style="width:420px" /></p>
<p>Using the <a href="http://blog.lobid.org/2019/05/17/skohub.html#subject-specific-subscription-to-web-resources">content subscription & publication features of SkoHub</a>, you can furthermore publish the resource via SkoHub PubSub (to be covered in detail in an upcoming post).</p>
<h2 id="configuring-the-web-form-with-json-schema">Configuring the web form with JSON Schema</h2>
<p>As said above, the SkoHub Extension wraps the SkoHub Editor running at <a href="https://skohub.io/editor/">https://skohub.io/editor/</a>. SkoHub Editor is configured with a <a href="https://json-schema.org/understanding-json-schema/">JSON schema</a> document that is used both to generate appropriate form inputs and to validate the entered content. Thus, the JSON Schema is the central, most crucial part when working with SkoHub Editor. Currently, we are using as default schema a <a href="https://dini-ag-kim.github.io/lrmi-profile/draft/schemas/schema.json">draft schema for OER</a> we created using relevant properties and types from <a href="https://schema.org">schema.org</a>. With the JSON schema URL, we can now load the <a href="https://skohub.io/editor/?schema=https://dini-ag-kim.github.io/lrmi-profile/draft/schemas/schema.json">web form</a> you already know from the browser extension by providing the link to the schema. Of course, you can just write your own schema to build a web form for your use case.</p>
<p>Let’s take a short look at the underlying schema, which we tried to keep as straightforward as possible. Generally, with JSON schema you can specify a number of optional or mandatory properties and what type of input each expects. The <code class="language-plaintext highlighter-rouge">"title"</code> of each property will be used as the label for the field in the web form.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"properties": {
"name": {
"title": "Title",
"type": "string"
}
}
}
</code></pre></div></div>
<p>It is also possible to allow only values from a predefined list (an <code class="language-plaintext highlighter-rouge">enum</code>), which the editor will render as a drop down:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"type": {
"title": "Type",
"type": "string",
"enum": [
"AudioObject",
"Book",
"Course",
"CreativeWork",
"DataDownload",
"ImageObject",
"PresentationDigitalDocument",
"SoftwareApplication",
"VideoObject"
]
}
}
</code></pre></div></div>
<p>Such lists of allowed values can be considered controlled vocabularies, and ideally they should be shared across many data sources. This is where SkoHub Vocabs comes into play. Instead of embedding the list of allowed values into our schema, we can reference a SKOS vocabulary on the web:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"about": {
"title": "Subject",
"type": "array",
"items": {
"type": "object",
"properties": {
"inScheme": {
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"https://w3id.org/kim/hochschulfaechersystematik/scheme"
]
}
}
}
},
"_widget": "SkohubLookup"
}
}
}
</code></pre></div></div>
<p>Notice the custom key <code class="language-plaintext highlighter-rouge">_widget</code> in the JSON schema. This will configure the editor to use the specified UI element for the given field. In our example, the <code class="language-plaintext highlighter-rouge">SkohubLookup</code> widget is used, which works with all controlled vocabularies that are published with SkoHub Vocabs. All custom JSON schema extensions start with an underscore <code class="language-plaintext highlighter-rouge">_</code> and are used to control the look and feel of the editor; see below for an example for how to hide a field on the form.</p>
<p>Finally, to make our data JSON-LD, we also set a mandatory <code class="language-plaintext highlighter-rouge">@context</code> property and a default object value for the <code class="language-plaintext highlighter-rouge">@context</code>. This makes the editor add it to the document without any user interaction needed.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "OER",
"description": "This is a generic JSON schema for describing an Open Educational Resource with schema.org",
"type": "object",
"default": {
"@context": {
"id": "@id",
"type": "@type",
"@vocab": "http://schema.org/",
"skos": "http://www.w3.org/2004/02/skos/core#",
"prefLabel": "skos:prefLabel",
"inScheme": "skos:inScheme",
"Concept": "skos:Concept"
}
},
"properties": {
"@context": {
"type": "object",
"additionalProperties": true,
"_display": {
"className": "hidden"
}
}
}
</code></pre></div></div>
<h2 id="implementation">Implementation</h2>
<p>Of course you can also poke around the editor while running it locally:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ git clone https://github.com/hbz/skohub-editor.git
$ cd skohub-editor
$ npm install
</code></pre></div></div>
<p>As is the case with SkoHub Vocabs, the editor is implemented in <a href="https://reactjs.org/">React</a>. The form components are located in <code class="language-plaintext highlighter-rouge">src/components/JSONSchemaForm</code>. In a nutshell, a <code class="language-plaintext highlighter-rouge">Form</code> provides data to the various input components:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><Form
data={{title: 'A title'}}
onSubmit={console.log}
>
<Input property="title" />
<Textarea property="description" />
<button type="submit">Publish</button>
</Form>
</code></pre></div></div>
<p>Obviously it would be tedious to manually code all the inputs for a given schema. This is where the <code class="language-plaintext highlighter-rouge">Builder</code> comes into play. It reads a schema and creates all necessary input components:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><Form
data={{title: ''}}
onSubmit={console.log}
>
<Builder schema={{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "My JSON schema",
"type": "object",
"properties": {
"title": {
"type": "string",
"title": "Title"
},
"description": {
"type": "string",
"title": "Description",
"_widget": "Textarea"
}
}
}} />
<button type="submit">Publish</button>
</Form>
</code></pre></div></div>
<p>The browser extension is essentially a simple wrapper for the editor running at <a href="https://skohub.io/editor/">https://skohub.io/editor/</a>, which the extension injects as an <code class="language-plaintext highlighter-rouge">iframe</code> into the current page. Additionally, before the iframe is injected, some metadata is scraped from that page. This data is used to pre-populate the editor. This process obviously depends both on the data found in the web page and on the schema the editor is configured to use. YouTube for example uses <code class="language-plaintext highlighter-rouge">meta name="description"</code> for data about YouTube itself rather than the actual video, which is described in <code class="language-plaintext highlighter-rouge">meta property="og:description"</code>. Even if the correct metadata is extracted, there is no guarantee that the schema used to configure the editor even has a <code class="language-plaintext highlighter-rouge">description</code> field. In the future, it would be nice to find a possibility to somehow map page metadata to properties in the schema itself.</p>
<h2 id="outlook">Outlook</h2>
<p>SkoHub Editor already works very well and can be extremely useful. However, some things are still work in progress and will need some future effort to be improved:</p>
<ul>
<li><strong>Using schema.org markup for pre-population</strong>: This might sound obvious but we have not implemented it yet, see <a href="https://github.com/hbz/skohub-extension/issues/17">#17</a>.</li>
<li><strong>Further issues</strong>: See also the issues at <a href="https://github.com/hbz/skohub-editor/issues">https://github.com/hbz/skohub-editor/issues</a> for further ideas for improvement.</li>
</ul>
<p>Furthermore, some work will have to be put into the current default schema and the controlled vocabularies it uses:</p>
<ul>
<li><strong>Develop JSON Schema</strong>: The JSON Schema definitely is not finished yet. For example, it makes sense to include <code class="language-plaintext highlighter-rouge">http://schema.org/keywords</code> in the future for adding arbitrary tags to describe a resource. We plan to develop the schema within the common <a href="https://oerworldmap.org/resource/urn:uuid:fd06253e-fe67-4910-b923-51db9d27e59f">OER metadata group</a> of DINI AG KIM & Jointly with a focus on describing OER in the German-speaking world.</li>
<li><strong>Improve Vocabularies</strong>: For “Learning Resource Type” and “Intended Audience” we are using controlled vocabularies that are not nearly finished but in development at the <a href="https://www.dublincore.org/groups/lrmi-task-group/">LRMI Task Group</a> of the Dublin Core Metadata Initiative (DCMI). Trying out the browser extension, you will for instance see that the educational resources types are missing some options. However, we assume that the combination of SkoHub Editor & SkoHub Vocabs makes a pretty nice environment for the development of these vocabularies in an open and transparent process on GitHub or GitLab.</li>
</ul>
<h2 id="get-involved">Get involved</h2>
<p>Please try it out and let us know what doesn’t work or which feature you are missing and also what you like about SkoHub. We are happy about every bug report, suggestion and feature requests for the production version. Get in <a href="https://lobid.org/team-en/">contact</a> with us via a hypothes.is annotation, GitHub, Email, Twitter or IRC.</p>
SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub2020-01-29T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2020/01/29/skohub-talk-at-swib19<p>On November 27th 2019, Adrian Pohl and Felix Ostrowski (graphthinking) presented SkoHub at the “Semantic Web in Libraries” conference in Hamburg (<a href="http://swib.org/swib19/">SWIB19</a>). Here are the <a href="https://pad.gwdg.de/p/BJvl5sFiB">slides</a>.</p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/9cmkKPC3jlo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
GND: Umstellung auf HTTPS-URIs2019-11-29T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2019/11/29/lobid-gnd-https-change<p>Die Deutsche Nationalbiliothek (DNB) hat bereits im Oktober die URIs in verschiedenen Vokabularen und in der GND auf HTTPS umgestellt. Aus der <a href="https://www.dnb.de/SharedDocs/Downloads/DE/Professionell/Metadatendienste/Rundschreiben/rundschreiben20190703AenderungFormatRdf20193.pdf?__blob=publicationFile&v=3">Ankündigung der DNB</a> (Hervorhebungen von mir):</p>
<blockquote>
<p>“In allen Komponenten des Linked-Data-Services der ZDB und der DNB wird das Protokoll HTTP durch HTTPS ersetzt. Hintergründe zu dieser Entscheidung im <a href="https://wiki.dnb.de/display/DINIAGKIM/HTTP+vs.+HTTPS+in+resource+identification">WIKI der DINI-AG Kompetenzzentrum Interoperable Metadaten</a>.</p>
<p>Betroffen sind im einzelnen:</p>
<ul>
<li>DNB-Titel Profil „DINI-AG KIM-Empfehlungen“</li>
<li>ZDB-Titel Profil „DINI-AG KIM-Empfehlungen“</li>
<li>ISIL- und Sigelverzeichnis</li>
<li><strong>GND Profil „GND-Ontology“</strong></li>
<li><strong>Entity Facts</strong></li>
<li><strong>Alle RDF-Elementsets (GND-Ontology, DNB-Metadata-Terms, Agent
Relationship Ontology)</strong></li>
<li><strong>Alle RDF-Value-Vocabularies (GND-Geschlecht, GND-Ländercodes, GNDSystematik, GND-Koordinatentyp)</strong></li>
</ul>
<p>Ausgenommen ist vorerst nur der BIBFRAME-Prototyp, da er im nächsten Release grundlegend überarbeitet wird.”</p>
</blockquote>
<p>lobid-gnd basiert maßgeblich auf den von der DNB bereitgestellten RDF-Daten der GND. Deshalb werden auch in lobid die URIs auf HTTPS umgestellt. Uns ist bewusst, dass dies für lobid-basierte Anwendungen Probleme bereiten kann, weshalb wir Zeit für Anpassungen lassen. Unter <a href="https://test.lobid.org/gnd">https://test.lobid.org/gnd</a> findet sich bereits die neue Version zum Testen (dort werden allerdings keine täglichen Updates eingespielt).</p>
<p><strong>Wir planen, die Umstellung am Donnerstag, den 12.12.2019 durchzuführen.</strong></p>
Ideen: NRW-Quiz auf Grundlage der NWBib-Daten für Coding da Vinci2019-10-22T00:00:00+00:00Pascal Christophhttp://blog.lobid.org/2019/10/22/nrw-quiz-idee<p>Nach dem Besuch des <a href="https://codingdavinci.de/events/westfalen-ruhrgebiet/">“Coding da Vinci Westfalen-Ruhrgebiet 2019”</a> entstand die Idee, auf Grundlage des von uns zur Verfügung gestellten <a href="https://codingdavinci.de/daten/#hochschulbibliothekszentrum-des-landes-nordrhein-westfalen">Datensets</a> ein NRW-Quiz zu machen. Die Daten sind die Grundlage für die <a href="https://nwbib.de">Nordrhein-Westfälische Bibliographie (NWBib)</a>.</p>
<p>Die Möglichkeiten zur Nutzung der NWBib-Daten haben wir in <a href="http://blog.lobid.org/2019/10/08/nwbib-at-cdv.html">“NWBib-Daten für Coding da Vinci”</a> beschrieben.</p>
<h1 id="die-ideen">Die Idee(n)</h1>
<p>Es sind eigentlich mehrere Ideen. Je nach Aufwand und Lust zur Umsetzung reicht es, auch nur eine davon umzusetzen.</p>
<p>Der Knackpunkt ist, dass alle Antworten des Quiz automatisiert erzeugbar sind, aufgrund von explizitem Wissen in einem Datensatz
oder aufgrund von statistischen Auswertungen über das gesamte Datenset. Die anderen, “falschen” Antworten lassen sich ebenfalls automatisch erzeugen.</p>
<p>Hier ein paar Ideen:</p>
<p>Auf einer Karte von Nordrhein-Westfalen werden die größeren Städte mit einem Marker versehen, je nach Spiel randomisiert oder alle auf einmal. Wenn auf einen Marker
geklickt wird, erscheint eine Quizfrage, die auf Basis der Daten erzeugt wird (technische Details später). Zum Beispeil könnte eine Frage zu “Köln” heißen:</p>
<p>“Für was ist Köln am bekanntesten?”</p>
<ol>
<li>Freilichtbühne</li>
<li>Zeche Zollern II/IV</li>
<li>Dom</li>
<li>Technische Universität</li>
<li>Westfälischer Frieden</li>
</ol>
<p>Nach 10 Fragen ist das Spiel zu Ende => Eintrag in die Highscore-Liste.</p>
<p>Mögliche Variationen:</p>
<ul>
<li>es sind zwei Modi möglich: 1. der Ort ist auf der Karte anzuklicken (der Expertenmodus) oder 2. Multiple-Choice (der leichte Modus)</li>
<li>auch kleinere Städte mit einbeziehen</li>
<li>eingrenzen auf “die bekannteste Person/Bauwerke/…” (hierzu lassen sich zumeist auch Bilder anzeigen. Eine weitere Variante wäre, nur die Portraits zu zeigen statt der Namen.)</li>
<li>reverse, also die Antwort wird gezeigt, und die Spielerin muss den passenden Ort aussuchen</li>
<li>Ende des Spiels nach zwei falsche Antworten. Wer kommt am weitesten?</li>
<li>…</li>
</ul>
<p>Ein guter Einstieg wäre, nur Ortsbegriffe zu verwenden und dazu ein Bild aus der Wikidata zu der Stadt einzublenden.
Die beiden oben erwähnenten Modi würde also so aussehen:</p>
<ol>
<li>Einsteigermodus: eine Liste von Städten ist zum Aussuchen vorgegeben (Multiple-Choice)</li>
<li>Expertenmodus: die ungefähre Lokalisation muss durch einen Klick auf der Karte ausgesucht werden</li>
</ol>
<p>Die Daten für dieses Einstiegsszenario lassen sich komplett aus der Wikidata holen, da alle Orte in Wikidata eine NWBib Property haben (z.B. <a href="https://www.wikidata.org/wiki/Q586">Bonn</a>, such dort nach “NWBib ID).</p>
<p>Hier ein Beispiel für Dortmund:
<a href="https://www.wikidata.org/wiki/Q1295"><img src="/images/nrw-quiz-idee/1043px-North_Rhine-Westphalia_topographic_map_01V_Photo-Dortmund.svg.png" alt="Photozuordnung" title="Photozuordnung auf der Karte für Dortmund" /></a></p>
<p>Das Quizfenster rechts unten impliziert die zweite Variante, d.h. es sind eigentlich zwei Spielideen verknüpft:
der Multiple-Choice Test ist sicherlich einfacher zu lösen, und würde in dieser komplexen Quizidee mit nur der Hälfte der Punkte belohnt
bei richtiger Antwort.</p>
<p>Für spannendere, weitere Fragen muss auf die lobid-API mit den NWBib-Daten zugegriffen werden.
Das wird im Folgenden beschrieben.</p>
<p>Die Kartenvisualisierungen sähen dabei ähnlich aus wie das “Dortmund”-Beispiel.</p>
<h2 id="technische-details">Technische Details</h2>
<p>Hier einige Details zum Einstieg, teilweise entnommen aus dem <a href="http://blog.lobid.org/2019/10/08/nwbib-at-cdv.html">voherigen Beitrag</a>. Bei Bedarf können wir das noch ausführlicher dokumentieren mit Queries und Programmschnippseln zum Filtern der Ergebnisse.</p>
<h3 id="nwbib-ortssystematik-und-wikidata">NWBib-Ortssystematik und Wikidata</h3>
<p><a href="https://lobid.org/resources/search?q=_exists_%3Aspatial+AND+inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014176012%23%21%22">96% aller NWBib-Titel haben einen Bezug zu einem Ort</a>, d.h. sie behandeln als Thema einen Landkreis, einen Stadtteil, einen Kirchenkreis, eine Grafschaft etc. Der Ortsbezug eines Eintrags findet sich im <code class="language-plaintext highlighter-rouge">spatial</code>-Objekt, siehe z.B. <a href="https://lobid.org/resources/HT019559235.json">https://lobid.org/resources/HT019559235.json</a>:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"spatial"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"focus"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://www.wikidata.org/entity/Q1295"</span><span class="p">,</span><span class="w">
</span><span class="nl">"geo"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"lat"</span><span class="p">:</span><span class="mf">51.513888888889</span><span class="p">,</span><span class="w">
</span><span class="nl">"lon"</span><span class="p">:</span><span class="mf">7.4652777777778</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q22865"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q1549591"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q253030"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q707813"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q42744322"</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://nwbib.de/spatial#Q1295"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Concept"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Dortmund"</span><span class="p">,</span><span class="w">
</span><span class="nl">"notation"</span><span class="p">:</span><span class="s2">"05913000"</span><span class="p">,</span><span class="w">
</span><span class="nl">"source"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://nwbib.de/spatial"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Raumsystematik der Nordrhein-Westfälischen Bibliographie"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Die <code class="language-plaintext highlighter-rouge">id</code> im <code class="language-plaintext highlighter-rouge">spatial</code>-Objekt (im Beispiel <code class="language-plaintext highlighter-rouge">https://nwbib.de/spatial#Q1295</code>) verweist auf einen Eintrag in der <a href="https://nwbib.de/spatial">NWBib-Raumsystematik</a>, die alle Orte hierarchisch gliedert, auf die NWBib-Titel Bezug nehmen. Mit <code class="language-plaintext highlighter-rouge">spatial.focus.id</code> wird der entsprechende Wikidata-Eintrag zu dem Ort angegeben (hier <code class="language-plaintext highlighter-rouge">http://www.wikidata.org/entity/Q1295</code>).* Zudem finden sich im <code class="language-plaintext highlighter-rouge">spatial.focus</code>-Objekt Geokoordinaten aus Wikidata und die Klassen, denen das Wikidata-Objekt zugeordnet wurde. Über die Links können weitere Informationen bei Wikidata geholt werden.</p>
<h3 id="kartenvisualisierung-auf-basis-der-orts--und-geodaten-aus-wikidata">Kartenvisualisierung auf Basis der Orts- und Geodaten aus Wikidata</h3>
<h4 id="beispiel-wofür-ist-gelsenkirchen-am-bekanntesten">Beispiel: Wofür ist “Gelsenkirchen am bekanntesten?”</h4>
<p>Die Karte wird gezeigt mit Fokus auf Gelsenkirchen. Die Antwort auch die Frage “Wofür ist Gelsenkirchen am bekanntesten?” lässt sich automatisch aus der <a href="https://nwbib.de/search?location=&q=spatial.id%3A%22https%3A%2F%2Fnwbib.de%2Fspatial%23Q2765%22">raumbezogene Abfrage</a> ableiten: das
Schlagworte “FC Schalke 04” steht ganz oben (in den Query-Results müssen die herausgefiltert werden, die sich selbst zum Gegenstand haben, z.B. hier also “Gelsenkirchen”). Die entsprechende API-Abfrage, um an die häufigsten Schlagworte zu gelangen, die in den Metadadten der Publikationen über “Gelsenkirchen” stehen, ist:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -L 'lobid.org/resources/search?q=spatial.id%3A"https%3A%2F%2Fnwbib.de%2Fspatial%23Q2765"&format=json&aggregations=subject.id%2Csubject.componentList.id&size=1' |jq .aggregation
</code></pre></div></div>
<p>Das Ergebnis sieht wie folgt aus:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"subject.componentList.id": [
{
"doc_count": 641,
"key": "https://d-nb.info/gnd/4019947-2"
},
{
"doc_count": 105,
"key": "https://d-nb.info/gnd/2037491-4"
},
{
"doc_count": 54,
"key": "https://d-nb.info/gnd/4069716-2"
},
</code></pre></div></div>
<p>Wenn nun den gnd-IDs gefolgt wird, zeigt sich, dass der erste Eintrag für “Gelsenkirchen” steht (und folglich ignoriert werden muss, da es der Suchbegriff selbst ist)
und am zweithäufigsten mit 105 Treffern der Begriff “FC Schalke 04”.
(Hier bestünde ebenfalls die Möglichkeit, ein Bild zu erhalten, das für diesen Sportverein steht:
Die GND-ID gibt es auch in Wikidata, und somit auch in der API der lobid-gnd. Um ein Bild zum Begriff zu bekommen kann diese ID einfach an diese API angehangen werden: <a href="https://lobid.org/gnd/2037491-4">https://lobid.org/gnd/2037491-4</a>. Dort ist, ebenfalls in JSON serialisiert, die URL zur Grafik hinterlegt, einmal also große Datei (<code class="language-plaintext highlighter-rouge">depiction.id</code>) und sogar als thumbnail (<code class="language-plaintext highlighter-rouge">depiction.thumbnail</code>). Ob für alle resp. für wie viele möglichen Begriffe im Quiz auch Bilder vorhanden sind, wäre zu untersuchen.)</p>
<h4 id="beispiel-suchwort-erraten">Beispiel: “Suchwort Erraten”</h4>
<p>Mit den oben beschriebenen Wikidata-Ortsdaten in der NWBib lassen sich mit wenig Aufwand Visualisierungen erstellen, z.B. eine <a href="http://blog.lobid.org/data/nwbib-at-cdv.html">Karte mit Raumbezügen</a> zu bestimmten Suchanfragen (die HTML-Datei enthält die komplette Umsetzung und kann als Ausgangsbasis für eigene Ideen verwendet werden). Als Quiz würde dann gefragt:</p>
<p>“Um was für ein Suchwort hat es sich wohl gehandelt?”</p>
<ol>
<li>FC Schalke</li>
<li>Tagebau</li>
<li>Malerei</li>
<li>Beethoven</li>
<li>Heimatmuseum</li>
</ol>
<h4 id="beispiel-reverse-quiz">Beispiel Reverse-Quiz</h4>
<p>Welche Stadt ist am bekanntesten für “Malerei”?
Dabei muss auf das <a href="https://nwbib.de/search?q=subject.componentList.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4037220-0%22">Schlagwort “Malerei” eingegrenzt</a> werden. Auf der rechten Seite der Trefferliste steht unter “Regionen” mit 601 Treffer “Düsseldorf” ganz oben.</p>
<h3 id="probleme">Probleme</h3>
<p>Es ist so: die Datengrundlage entscheidet. Die Fragen müssten also korrekterweise nicht lauten “Für was ist diese Stadt am bekanntesten?”
sondern “Welches Schlagwort zu Publikationen über diese Stadt kommt am häufigsten in der NWBib vor?”.</p>
<p>Durch mehr Erfahrungen mit den Daten lässt sich, konsekutiv, das Quiz verbessern:
In einer Alpha-Version erscheinen oft unpassende Schlagworte. Vielen ist gemeinsam, das sie recht abstrakt sind und somit zu vielen Orten passt,
z.B. “Siegerland” oder “Rheinland”. Diese Antworten lassen sich aber durch geeignete qualifizierte Queries rausfiltern: Begriffe, die insgesamt in den Daten
häufig vorkommen sind niedriger zu gewichten als solche, die nur bei wenigen Orten auftauchen.
In einer Beta-Version sind dann die erzeugten, richtigen Antworten besser.</p>
<p>Es ist davon auszugehen, dass trotzdem nicht alle automatisch generierten “richtige” Antworten auch “gute” Antworten sind.
Wenn die Grundlage keine on-the-fly Abfrage der Daten wäre, sondern eine statisch erzeugte geojson-Datei, so könnten
dort die Antworten händisch verbessert werden.</p>
<h1 id="kontaktieren-sie-das-lobid-team">Kontaktieren Sie das lobid-Team</h1>
<p>Bei Unklarheiten, Bugs und Fragen jeglicher Art stehen wir gerne zur Verfügung: <a href="https://openbiblio.social/@lobid">Mastodon</a>, <a href="https://twitter.com/lobidOrg">Twitter</a>, <a href="irc://irc.freenode.net/lobid">IRC</a>, <a href="semweb@hbz-nrw.de">E-Mail</a>.</p>
<hr />
<p>*<small> Tatsächlich wird die Ortssystematik zum größten Teil aus Wikidata generiert und dort entsprechend gepflegt.</small></p>
NWBib-Daten für Coding da Vinci2019-10-08T00:00:00+00:00Adrian Pohl, Fabian Steeg, Pascal Christophhttp://blog.lobid.org/2019/10/08/nwbib-at-cdv<p>Der Hackathon “<a href="https://codingdavinci.de/">Coding da Vinci (CdV)</a>” wird seit 2014 jährlich in Deutschland ausgerichtet. Ziel von CdV ist es, Entwickler*innen zu motivieren, Anwendungen zu erarbeiten, in denen offene Daten aus Kultureinrichtungen nutzbar gemacht werden. Wir haben über die Jahre die verschiedenen <a href="https://codingdavinci.de/dokumentation/">CdV Hackathons</a> beobachtet und immer wieder überlegt, Daten beizutragen. Jetzt ist es endlich so weit: Zum Hackathon <a href="https://codingdavinci.de/events/westfalen-ruhrgebiet/">“Coding da Vinci Westfalen-Ruhrgebiet”</a> bieten wir die <a href="https://nwbib.de">Nordrhein-Westfälische Bibliographie (NWBib)</a> als <a href="https://codingdavinci.de/daten/#hochschulbibliothekszentrum-des-landes-nordrhein-westfalen">Datenset</a> an, das die Teilnehmer*innen für ihe Anwendungen verwenden können. Die Möglichkeiten zur Nutzung der NWBib-Daten sind leider bisher nicht optimal dokumentiert. Dieser Beitrag soll die Situation verbessern.</p>
<h2 id="die-nwbib">Die NWBib</h2>
<p>Die NWBib ist eine Landesbibliographie.</p>
<blockquote>
<p>“Als Regionalbibliografie oder Landesbibliografie versteht man die systematische bibliografische Erfassung der Publikationen (vorrangig Bücher und Aufsätze) über eine Region. Der Begriff Landesbibliographie bezieht sich meist auf ein deutsches Bundesland, während Regionalbibliographien für Teile eines Bundeslandes oder sogar grenzübergreifend (beispielsweise die Bodenseebibliographie) erstellt werden.”</p>
</blockquote>
<p><small>Quelle: <a href="https://de.wikipedia.org/wiki/Regionalbibliografie">https://de.wikipedia.org/wiki/Regionalbibliografie</a></small></p>
<p>Da die NWBib die Landesbibliographie für Nordrhein-Westfalen ist, verzeichnet sie Literatur über das Land Nordrhein-Westfalen, seine Regionen, Orte und Persönlichkeiten. Neben Büchern werden vor allem Aufsätze erfasst sowie Landkarten, DVDs und viele andere Medientypen. Sie existiert seit 1983 und weist Literatur seit eben diesem Erscheinungsjahr nach. Das heißt, Publikationen, die vor 1983 erschienen sind, lassen sich dort nicht finden. Derzeit umfasst die Bibliographie etwa 420.000 Einträge.</p>
<p><strong>Nur Metadaten, keine Objekte</strong></p>
<p>Eine Bibliographie ist ein Nachweisinstrument. Das heißt, sie sammelt lediglich die Beschreibungen von Publikationen und keine Volltexte.</p>
<h2 id="die-nwbib-als-teil-des-hbz-verbundkatalogs">Die NWBib als Teil des hbz-Verbundkatalogs</h2>
<p>Die Redaktion der NWBib in den Universitäts- und Landesbibliotheken Düsseldorf und Münster (mit Unterstützung der Universitäts- und Landesbibliothek Bonn) nutzt gängige bibliothekarische Erschließungsstandards (Resource Description and Access, RDA) zur Erfassung der Titel. Die Daten werden als Teil des <a href="https://de.wikipedia.org/wiki/Hbz-Verbunddatenbank">hbz-Verbundkatalogs</a> gepflegt. Mit <a href="https://lobid.org/resources">lobid-resources</a> stellt das Hochschulbibliothekszentrum des Landes-Nordrhein-Westfalen (hbz) den Verbundkatalog unter einer CC0-Lizenz als Linked Open Data u.a. über eine Web-API bereit. Im folgenden zeigen wir, welche Informationen in der NWBib verzeichnet sind und wie die Daten über die lobid-resources-API abgefragt werden können.</p>
<h2 id="abfragen-der-nwbib-daten-die-weboberfläche">Abfragen der NWBib-Daten: die Weboberfläche</h2>
<p>Vor dem direkten Einstieg in die JSON-Daten, ist es sinnvoll, sich zunächst ein bisschen mit der NWBib über die Weboberfläche vertraut zu machen. Diese gibt einen guten ersten Einblick in die zugrundeliegenden Metadaten und was damit alles möglich ist.</p>
<p>Die Startseite des Webauftritts unter <a href="https://nwbib.de">nwbib.de</a> bietet ein Suchfeld für den einfachen Einstieg, eine Beschreibung der NWBib sowie eine Karte für die direkte Eingrenzung der NWBib-Titel nach Ortsbezug, bei der zwischen Kreis- oder Gemeindeebene gewählt werden kann:</p>
<p><a href="https://nwbib.de"><img src="/images/nwbib-at-cdv/nwbib-startseite.png" alt="Startseite" title="Startseite" /></a></p>
<p>Ein Klick auf die Stadt “Essen” in der Karte gibt zum Beispiel alle NWBib-Titel zurück, die über Orte, Personen, Veranstaltungen etc. innerhalb der Grenzen Essens handeln. Eine <a href="https://nwbib.de/search?q=essen">Suche nach “Essen”</a> ist da unspezifischer und gibt beispielsweise auch – aufgrund von <a href="https://de.wikipedia.org/wiki/Stemming">Stemming</a> im zugrundeliegenden Suchmaschinenindex – Artikel von “Wolfgang Esser” zurück.</p>
<p><a href="https://nwbib.de/search?q=essen"><img src="/images/nwbib-at-cdv/suche.png" alt="Einfache Suche" title="Einfache Suche in der NWBib nach 'Essen'" /></a></p>
<p>Ein Suchergebnis lässt sich auf der rechten Seite über verschiedene Filter eingrenzen: nach Erscheinungsjahr, nach Raumbezug über eine Karte oder über Ortsnamen aus der <a href="https://nwbib.de/spatial">NWBib-Raumsystematik</a>, nach Sachgebieten aus der <a href="https://nwbib.de/subjects">NWBib-Sachsystematik</a> , nach Schlagwörtern der <a href="http://lobid.org/gnd">Gemeinsamen Normdatei</a>, nach Medien- und Publikationstypen sowie nach Bestand in bestimmten Bibliotheken.</p>
<p>Bei einem Einzeltreffer werden die wichtigsten Metadaten angezeigt. Auf einer Karte wird angezeigt, welche Bibliotheken die Ressource in ihrem Bestand haben.</p>
<p><a href="https://nwbib.de/BT000063880"><img src="/images/nwbib-at-cdv/einzeltreffer.png" alt="Einzeiltreffer" title="Einzeltrefferanzeige in der NWBib" /></a></p>
<p>Wir laden dazu ein, einfach mal mit der Oberfläche herumzuspielen und die NWBib-Titel ein wenig zu erkunden.</p>
<h2 id="abfragen-der-nwbib-über-die-lobid-api">Abfragen der NWBib über die lobid-API</h2>
<p>Jeder NWBib-Titel verlinkt auf seine lobid-Entsprechung mit einem kleinen “Link”-Symbol in der oberen rechten Ecke der Beschreibung:</p>
<p><img src="/images/nwbib-at-cdv/lobid-link.png" alt="lobid-Link" title="Einzeltrefferanzeige in der NWBib mit Hervorherbung des Links zu lobid" /></p>
<p>In lobid wiederum kann sich – durch Ergänzen von <code class="language-plaintext highlighter-rouge">.json</code> oder Klick auf das JSON-LD-Icon – das zugrundeliegende JSON (hier <a href="https://lobid.org/resources/BT000063880.json">https://lobid.org/resources/BT000063880.json</a>) angeschaut werden. Dieses JSON kann über die API abgefragt werden.</p>
<p><img src="/images/nwbib-at-cdv/lobid-einzeltreffer.png" alt="lobid-Einzeltreffer" title="Einzeltrefferanzeige inlobid-resources mit Hervorherbung des Links zum JSON" /></p>
<p>Im Folgenden werden die grundlegenden Möglichkeiten zur Abfrage der NWBib-Daten gezeigt.</p>
<h3 id="eingrenzen-auf-nwbib">Eingrenzen auf NWBib</h3>
<p>Die lobid-resources-API ist hier dokumentiert: <a href="https://lobid.org/resources/api">https://lobid.org/resources/api</a>. Wir wollen aber nicht in den mehr als 20 Millionen Verbunddaten suchen, sondern lediglich auf die NWBib-Daten zugreifen. Wie funktioniert das?</p>
<p>Jeder NWBib-Titel hat folgende Informationen im JSON, siehe etwa das <a href="https://lobid.org/resources/BT000063880.json">Beispiel</a>:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"inCollection"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://lobid.org/resources/HT014176012#!"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Collection"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Nordrhein-Westfälische Bibliographie (NWBib)"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Wir können fast jedes Feld abfragen. Ist das Feld tiefer geschachtelt, geben wir den Pfad per Punktnotation an, im Beispiel <code class="language-plaintext highlighter-rouge">inCollection.id</code>. Für die Eingrenzung einer Suche auf NWBib-Titel müssen wir also folgendes ergänzen: <a href="http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014176012%23%21%22"><code class="language-plaintext highlighter-rouge">inCollection.id:"http://lobid.org/resources/HT014176012#!"</code></a></p>
<h3 id="inhaltstypen-paging-bulk-download">Inhaltstypen, Paging, Bulk Download</h3>
<p>Die oben genannte Abfrage gibt über den Browser eine HTML-Sicht zurück. Ohne <code class="language-plaintext highlighter-rouge">Accept</code> Header wird über cURL o.ä. automatisch JSON(-LD) geliefert. Durch Ergänzung von <code class="language-plaintext highlighter-rouge">format=json</code> (bei Einzeltrefferen wie bereits erwähnt auch <code class="language-plaintext highlighter-rouge">.json</code>) lässt sich die Rückgabe von JSON auch im Browser erzwingen, z.B. <a href="http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014176012%23%21%22&format=json"><code class="language-plaintext highlighter-rouge">inCollection.id:"http://lobid.org/resources/HT014176012#!"&format=json</code></a></p>
<p>Ergebnislisten werden per default auf mehreren Seiten geliefert. Hier lässt sich mit dem <code class="language-plaintext highlighter-rouge">size</code>-Parameter die Anzahl der Treffer pro Seite setzen (default: 10 Treffer) und über den <code class="language-plaintext highlighter-rouge">from</code>-Parameter die Nummer des Treffers, ab dem die Liste beginnen soll. Wir können uns aber auch die gesamte Ergebnisliste als <a href="http://jsonlines.org/">JSON Lines</a> ausgeben lassen, indem wir den Parameter <code class="language-plaintext highlighter-rouge">format=jsonl</code> verwenden.</p>
<p>Das heißt, mit folgendem Query-String können wir die gesamten NWBib-Daten (1,9 GB) abziehen: <code class="language-plaintext highlighter-rouge">q=inCollection.id:"http://lobid.org/resources/HT014176012#!"&format=jsonl</code></p>
<p>Bei dem Umfang lohnt es sich, die Daten gepackt (223 MB) herunterzuladen. Dies geht über cURL wie folgt (die Sonderzeichen in der URL müssen in diesem Fall vollständig escapet werden):</p>
<p><code class="language-plaintext highlighter-rouge">$ curl --header "Accept-Encoding: gzip" "http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014176012%23%21%22&format=jsonl" > nwbib.gz</code></p>
<h2 id="lobid-datenmodell">lobid-Datenmodell</h2>
<p>Das Datenmodell der bibliographischen Daten in lobid ist mittlerweile recht komplex. Wir nutzen ein lobid-spezifisches Applikationsprofil aus DC Terms, Bibframe, Bibliographic Ontology und anderen Vokabularen (wer sich für so etwas interessiert, siehe <a href="http://blog.lobid.org/2017/04/19/vocabulary-choices.html">diesen Beitrag</a>). Die wichtigsten Felder für eine elementare Anzeige eines Titels seien im Folgenden genannt, am Beispiel eines Aufsatzes <a href="http://lobid.org/resources/HT014198549">“Notwendiges Übel – das Abortgebäude der Zeche Zollern II/IV”</a>. Bei Fragen zu weiteren Feldern sei auf die <a href="https://lobid.org/resources/api#jsonld">lobid-API-Dokumentation</a> verwiesen. Wir beantworten auch gerne Fragen zum Datenmodell.</p>
<h3 id="titel--title">Titel / <code class="language-plaintext highlighter-rouge">title</code></h3>
<p>Das ist der Hauptitel eines bibliographischen Eintrags, im Beispiel “Notwendiges Übel”. Eine Suche nach Titel (inklusive Eingrenzung auf die NWBib-Daten) sieht zum Beispiel so aus: <a href="https://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014176012%23%21%22+AND+title%3A%22Notwendiges+%C3%9Cbel%22"><code class="language-plaintext highlighter-rouge">inCollection.id:"http://lobid.org/resources/HT014176012#!" AND title:"Notwendiges Übel"</code></a>.</p>
<p>Beispiel:</p>
<p><code class="language-plaintext highlighter-rouge">"title": "Notwendiges Übel"</code></p>
<h3 id="titelzusatz--othertitleinformation">Titelzusatz / <code class="language-plaintext highlighter-rouge">otherTitleInformation</code></h3>
<p>Das ist ein Zusatz zum Titel, den viele Publikationen haben, oft eine Art Untertitel.</p>
<p>Beispiel:</p>
<p><code class="language-plaintext highlighter-rouge">"otherTitleInformation":[
"das Abortgebäude der Zeche Zollern II/IV"
]</code></p>
<h3 id="beitragende--contribution">Beitragende / <code class="language-plaintext highlighter-rouge">contribution</code></h3>
<p>Ein Array mit den Beiträgen von Personen oder Körperschaften (Organisationen) zu der Ressource und den jeweiligen Rollen. In jedem <code class="language-plaintext highlighter-rouge">contribution</code>-Objekt findet sich ein <code class="language-plaintext highlighter-rouge">agent</code>-Objekt, das den Akteur spezifiziert (meist inklusive Link auf die Gemeinsame Normdatei, GND) plus ein <code class="language-plaintext highlighter-rouge">role</code>-Objekt mit der Rolle. Der Name von beitragenden Akteuren findet sich in <code class="language-plaintext highlighter-rouge">contribution.agent.label</code>. Im Beispiel haben wir zwei Personen, die als Autor*innen agieren.</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"contribution"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Contribution"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"agent"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/114263221"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Person"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"gndIdentifier"</span><span class="p">:</span><span class="s2">"114263221"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Gärtner, Ulrike"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"role"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://id.loc.gov/vocabulary/relators/cre"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Autor/in"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Contribution"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"agent"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/112181201"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Person"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"dateOfBirth"</span><span class="p">:</span><span class="s2">"1954"</span><span class="p">,</span><span class="w">
</span><span class="nl">"gndIdentifier"</span><span class="p">:</span><span class="s2">"112181201"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Kift, Dagmar"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"role"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://id.loc.gov/vocabulary/relators/cre"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Autor/in"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Weitere mögliche Rollen sind etwa Herausgeber oder Illustrator, siehe für einen Eintrag mit vielen unterschiedlichen Rollen z.B. <a href="https://lobid.org/resources/HT020116943">https://lobid.org/resources/HT020116943</a>.</p>
<h3 id="publikationsjahr--publicationstartdate">Publikationsjahr / <code class="language-plaintext highlighter-rouge">publication.startDate</code></h3>
<p>Im Feld <code class="language-plaintext highlighter-rouge">publication.startDate</code> findet sich das Erscheinungsdatum einer Ressource.</p>
<p>Beispiel:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"publication"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"PublicationEvent"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"startDate"</span><span class="p">:</span><span class="s2">"2004"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Bei einer Abfrage des Publikationsjahrs können wir auch Zeiträume eingrenzen, z.B. eine Suche nach Titeln zum Thema <a href="https://nwbib.de/subjects#N543480">Gewerkschaften</a> aus dem Zeitraum 2000 bis 2009: <a href="http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014176012%23%21%22+AND+subject.id%3A%22https%3A%2F%2Fnwbib.de%2Fsubjects%23N543480%22+AND+publication.startDate%3A%5B2000+TO+2009%5D"><code class="language-plaintext highlighter-rouge">inCollection.id:"http://lobid.org/resources/HT014176012#!" AND subject.id:"https://nwbib.de/subjects#N543480" AND publication.startDate:[2000 TO 2009]</code></a></p>
<h3 id="quellenangabe-bei-aufsätzen--bibliographiccitation">Quellenangabe bei Aufsätzen / <code class="language-plaintext highlighter-rouge">bibliographicCitation</code></h3>
<p>Bei Aufsätzen ist die Angabe der Publikation sinnvoll, in der der Aufsatz erschienen ist. Die entsprechenden Informationen finden sich im Feld <code class="language-plaintext highlighter-rouge">bibliographicCitation</code>.</p>
<p>Beispiel:</p>
<p><code class="language-plaintext highlighter-rouge">"bibliographicCitation":"Forum Industriedenkmalpflege und Geschichtskultur. - 2004, 2, S. 44-45 : Ill."</code></p>
<h2 id="nwbib-ortssystematik-und-wikidata">NWBib-Ortssystematik und Wikidata</h2>
<p><a href="https://lobid.org/resources/search?q=_exists_%3Aspatial+AND+inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014176012%23%21%22">96% aller NWBib-Titel haben einen Bezug zu einem Ort</a>, d.h. sie behandeln als Thema einen Landkreis, einen Stadtteil, einen Kirchenkreis, eine Grafschaft etc. Der Ortsbezug eines Eintrags findet sich im <code class="language-plaintext highlighter-rouge">spatial</code>-Objekt, siehe z.B. <a href="https://lobid.org/resources/HT019559235.json">https://lobid.org/resources/HT019559235.json</a>:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"spatial"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"focus"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://www.wikidata.org/entity/Q1295"</span><span class="p">,</span><span class="w">
</span><span class="nl">"geo"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"lat"</span><span class="p">:</span><span class="mf">51.513888888889</span><span class="p">,</span><span class="w">
</span><span class="nl">"lon"</span><span class="p">:</span><span class="mf">7.4652777777778</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q22865"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q1549591"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q253030"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q707813"</span><span class="p">,</span><span class="w">
</span><span class="s2">"http://www.wikidata.org/entity/Q42744322"</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://nwbib.de/spatial#Q1295"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Concept"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Dortmund"</span><span class="p">,</span><span class="w">
</span><span class="nl">"notation"</span><span class="p">:</span><span class="s2">"05913000"</span><span class="p">,</span><span class="w">
</span><span class="nl">"source"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://nwbib.de/spatial"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Raumsystematik der Nordrhein-Westfälischen Bibliographie"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Die <code class="language-plaintext highlighter-rouge">id</code> im <code class="language-plaintext highlighter-rouge">spatial</code>-Objekt (im Beispiel <code class="language-plaintext highlighter-rouge">https://nwbib.de/spatial#Q1295</code>) verweist auf einen Eintrag in der <a href="https://nwbib.de/spatial">NWBib-Raumsystematik</a>, die alle Orte hierarchisch gliedert, auf die NWBib-Titel Bezug nehmen. Mit <code class="language-plaintext highlighter-rouge">spatial.focus.id</code> wird der entsprechende Wikidata-Eintrag zu dem Ort angegeben (hier <code class="language-plaintext highlighter-rouge">http://www.wikidata.org/entity/Q1295</code>).* Zudem finden sich im <code class="language-plaintext highlighter-rouge">spatial.focus</code>-Objekt Geokoordinaten aus Wikidata und die Klassen, denen das Wikidata-Objekt zugeordnet wurde. Über die Links können weitere Informationen bei Wikidata geholt werden.</p>
<p>Wikidata wiederum beinhaltet Verknüpfungen zur NWBib. Alle Wikidata-Ortseinträge, die sich auch in der NWBib-Ortssystematik wiederfinden, verlinken mit der Property <a href="https://www.wikidata.org/wiki/Property:P6814">P6814 “NWBib ID”</a> auf den jeweiligen Systematikeintrag, siehe z.B. den Wikidata-Eintrag zu <a href="https://www.wikidata.org/wiki/Q1250595">Dortmund-Bövinghausen</a>. Da <a href="https://codingdavinci.de/daten/#wikidata">Wikidata</a> ein weiteres Datenset ist, das im CdV Westfalen-Ruhrgebiet genutzt wird, ergeben sich hier einige Möglichkeiten der gegenseitigen Anreicherung.</p>
<h2 id="beispiele--ideen">Beispiele & Ideen</h2>
<p>Zum besseren Verständnis zeigen wir hier anhand einiger Beispiele und Ideen, was mit den NWBib-Daten alles möglich ist.</p>
<h3 id="kartenvisualisierung-auf-basis-der-orts--und-geodaten-aus-wikidata">Kartenvisualisierung auf Basis der Orts- und Geodaten aus Wikidata</h3>
<p>Mit den oben beschriebenen Wikidata-Ortsdaten in der NWBib lassen sich mit wenig Aufwand Visualisierungen erstellen, z.B. eine <a href="/data/nwbib-at-cdv.html">Karte mit Raumbezügen</a> zu bestimmten Suchanfragen (die HTML-Datei enthält die komplette Umsetzung und kann als Ausgangsbasis für eigene Ideen verwendet werden) oder eine <a href="http://lobid.org/download/heatTest1.html">Heatmap</a> aller Ortsbezüge (siehe hier die im Beispiel verlinkte allgemeine Dokumentation zur Erstellung vergleichbarer Heatmaps).</p>
<h3 id="orte-und-personen">Orte und Personen</h3>
<p>In den anderen CdV-Datensets tauchen immer wieder Orte und Personen auf, die auch in der NWBib behandelt werden. Hier ein paar Beispiele:</p>
<ul>
<li>Im <a href="https://codingdavinci.de/daten/#volkskundliche-kommission-fur-westfalen-landschaftsverband-westfalen-lippe">Volksliedarchiv zu Westfalen</a> tauchen in den Liednamen etwa folgende Orte auf:
<ul>
<li>Espelkamp: <a href="https://nwbib.de/spatial#Q182691">https://nwbib.de/spatial#Q182691</a></li>
<li>Natzungen: <a href="https://nwbib.de/spatial#Q1971675">https://nwbib.de/spatial#Q1971675</a></li>
<li>Vreden: <a href="https://nwbib.de/spatial#Q200528">https://nwbib.de/spatial#Q200528</a></li>
</ul>
</li>
<li>In <a href="https://codingdavinci.de/daten/#euregiohistory">euregio-history.net</a> gibt es die Spalten ‘field_place’ und ‘field_regions’. Die dort eingetragenen Orte finden sich häufig in der NWBib-Raumsystematik/in Wikidata.</li>
<li>Über das <a href="https://codingdavinci.de/daten/#lwl-freilichtmuseum-detmold">Freilichtmuseum Detmold</a> und die Gebäude dort gibt es <a href="https://nwbib.de/search?subject=https%3A%2F%2Fd-nb.info%2Fgnd%2F605200-9">176 Einträge</a> in der NWBib.</li>
</ul>
<p>Was lässt sich aus der Anschlussfähigkeit der NWBib an die anderen Datensets machen? Zum Beispiel kann die NWBib herangezogen werden, um in einer Anwendung auf weiterführende Literatur zu einem Ort oder einer Person zu verweisen.</p>
<h2 id="kontaktieren-sie-das-lobid-team">Kontaktieren Sie das lobid-Team</h2>
<p>Bei Unklarheiten, Bugs und Fragen jeglicher Art stehen wir gerne zur Verfügung: <a href="https://openbiblio.social/@lobid">Mastodon</a>, <a href="https://twitter.com/lobidOrg">Twitter</a>, <a href="irc://irc.freenode.net/lobid">IRC</a>, <a href="semweb@hbz-nrw.de">E-Mail</a>.</p>
<hr />
<p>*<small> Tatsächlich wird die Ortssystematik zum größten Teil aus Wikidata generiert und dort entsprechend gepflegt.</small></p>
GND reconciliation for OpenRefine: using additional properties to improve matches2019-09-30T00:00:00+00:00Fabian Steeghttp://blog.lobid.org/2019/09/30/openrefine-examples<p>We have recently improved our GND reconciliation service for OpenRefine based on two real-world examples sent to us by users.* In this post we want to share these examples, focusing on using additional properties to improve matching. We will be reconciling persons using <a href="#birth-and-death-dates">birth and death dates</a> as well as <a href="#occupations-and-affiliations">occupations and affiliations</a>. For a simple example and general introduction check out our documentation on <a href="http://blog.lobid.org/2018/08/27/openrefine.html">GND reconciliation for OpenRefine</a>.</p>
<h2 id="birth-and-death-dates">Birth and death dates</h2>
<p>The first data set is a list of person names along with their birth and death dates. We want to match these names to GND entities, using the life dates to improve matches. To get started, import <a href="/data/persons.csv">persons.csv</a> into your OpenRefine instance:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-01-open.png" alt="persons-01-open" /></p>
<p>The preview should look like this:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-02-preview.png" alt="persons-02-preview" /></p>
<p>We can then create the project:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-03-project.png" alt="persons-03-project" /></p>
<p>To get a feeling for the matching quality, let’s just reconcile the names against type <code class="language-plaintext highlighter-rouge">DifferentiatedPerson</code> using our service at <code class="language-plaintext highlighter-rouge">https://lobid.org/gnd/reconcile</code>:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-04-reconcile.png" alt="persons-04-reconcile" /></p>
<p>If we look at the resulting facet, we see that we got matches for about two thirds of our entries (911 matched, 475 unmatched):</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-05-reconciled.png" alt="persons-05-reconciled" /></p>
<p>To improve the matches using the life dates, first let’s check how dates are represented in the GND. If we take a look at the data for <a href="https://lobid.org/gnd/1019841192.json">Ellen Frank</a>, we see that the dates are stored in ISO 8601 format:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"dateOfDeath": [
"1999-09-17"
],
"dateOfBirth": [
"1904-03-09"
]
</code></pre></div></div>
<p>Since the dates in our table are just years, we want to transform the values:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-06-transform.png" alt="persons-06-transform" /></p>
<p>In particular, we want to add an <code class="language-plaintext highlighter-rouge">*</code> to use our years as a prefix when matching, so we use <code class="language-plaintext highlighter-rouge">value + "*"</code> as our transformation expression:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-07-transform.png" alt="persons-07-transform" /></p>
<p>We perform these steps for both the <code class="language-plaintext highlighter-rouge">DateOfBirth</code> and <code class="language-plaintext highlighter-rouge">DateOfDeath</code> columns.</p>
<p>Before we reconcile again, passing the modified dates as additional properties, we <code class="language-plaintext highlighter-rouge">Remove All</code> facets and <code class="language-plaintext highlighter-rouge">Clear reconciliation data</code>:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-08-clear.png" alt="persons-08-clear" /></p>
<p>Now we reconcile again, passing the life dates as additional properties. Properties are suggested while typing into the text input box:</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-09-reconcile.png" alt="persons-09-reconcile" /></p>
<p>We check the results again, and see that we now have more than 90% matched (1277 matched, 109 unmatched):</p>
<p><img src="/images/2019-09-30-openrefine-examples/persons-10-reconciled.png" alt="persons-10-reconciled" /></p>
<p>The remaining entries can be matched manually using previews and entry suggestions, see <a href="http://blog.lobid.org/2018/08/27/openrefine.html">our general documentation</a> for details. You can download the <a href="/data/persons.json">complete workflow</a> to run it (<code class="language-plaintext highlighter-rouge">Undo / Redo</code> tab, <code class="language-plaintext highlighter-rouge">Apply...</code>) on the <a href="/data/persons.csv">input data</a> in a new project.</p>
<h2 id="occupations-and-affiliations">Occupations and affiliations</h2>
<p>The second data set is a list of politician names and their associated parties. We want to match these names to GND entities, using the parties to improve matches. To get started, import <a href="/data/politicians.csv">politicians.csv</a> into your OpenRefine instance:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-01-open.png" alt="politicians-01-open" /></p>
<p>The preview should look like this:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-02-preview.png" alt="politicians-02-preview" /></p>
<p>We can then create the project:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-03-project.png" alt="politicians-03-project" /></p>
<p>Again, to get a feeling for the matching quality, let’s just reconcile the names against type <code class="language-plaintext highlighter-rouge">DifferentiatedPerson</code> using our service at <code class="language-plaintext highlighter-rouge">https://lobid.org/gnd/reconcile</code>:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-04-reconcile.png" alt="politicians-04-reconcile" /></p>
<p>If we look at the resulting facet, we see that we got matches for a little more than half of our entries (185 matched, 173 unmatched):</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-05-reconciled.png" alt="politicians-05-reconciled" /></p>
<p>To improve that using the parties, first let’s check how political parties are represented in the GND. If we take a look at the data for <a href="http://lobid.org/gnd/11851444X.json">Willy Brandt</a>, we see that his party is stored in the <code class="language-plaintext highlighter-rouge">affiliation</code> field:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"affiliation": [
{
"id": "https://d-nb.info/gnd/2022139-3",
"label": "Sozialdemokratische Partei Deutschlands"
}
]
</code></pre></div></div>
<p>Since the label does not contain the abbreviated form used in our data (SPD), we should match based on the ID. To do so, we want to transform the abbreviations to their GND IDs:</p>
<ul>
<li>SPD → <code class="language-plaintext highlighter-rouge">https://d-nb.info/gnd/2022139-3</code></li>
<li>CDU → <code class="language-plaintext highlighter-rouge">https://d-nb.info/gnd/7230-8</code></li>
<li>GRUENE → <code class="language-plaintext highlighter-rouge">https://d-nb.info/gnd/2124337-2</code></li>
<li>FDP → <code class="language-plaintext highlighter-rouge">https://d-nb.info/gnd/37037-X</code></li>
<li>LINKE → <code class="language-plaintext highlighter-rouge">https://d-nb.info/gnd/10173685-X</code></li>
<li>PDS → <code class="language-plaintext highlighter-rouge">https://d-nb.info/gnd/5010217-5</code></li>
</ul>
<p>We can do this by opening a text facet for the abbreviations: <code class="language-plaintext highlighter-rouge">Facet</code> > <code class="language-plaintext highlighter-rouge">Text facet</code>:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-06-text-facet.png" alt="politicians-06-text-facet" /></p>
<p>If you hover over one of the entries, you get an “edit” link:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-07-facet-edit.png" alt="politicians-07-facet-edit" /></p>
<p>You can perform all these transformations at once. In the <code class="language-plaintext highlighter-rouge">Undo / Redo</code> tab, click <code class="language-plaintext highlighter-rouge">Apply...</code>:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-08-apply.png" alt="politicians-08-apply" /></p>
<p>Paste the following JSON (we first duplicate the original column to retain the original values):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[
{
"op": "core/column-addition",
"engineConfig": {
"facets": [],
"mode": "row-based"
},
"baseColumnName": "parliamentary_group",
"expression": "grel:value",
"onError": "set-to-blank",
"newColumnName": "affiliation",
"columnInsertIndex": 2,
"description": "Create column affiliation at index 2 based on column parliamentary_group using expression grel:value"
},
{
"op": "core/mass-edit",
"engineConfig": {
"facets": [],
"mode": "row-based"
},
"columnName": "affiliation",
"expression": "value",
"edits": [
{
"from": [
"GRUENE"
],
"fromBlank": false,
"fromError": false,
"to": "https://d-nb.info/gnd/2124337-2"
},
{
"from": [
"NA"
],
"fromBlank": false,
"fromError": false,
"to": ""
},
{
"from": [
"FDP"
],
"fromBlank": false,
"fromError": false,
"to": "https://d-nb.info/gnd/37037-X"
},
{
"from": [
"CDU"
],
"fromBlank": false,
"fromError": false,
"to": "https://d-nb.info/gnd/7230-8"
},
{
"from": [
"SPD"
],
"fromBlank": false,
"fromError": false,
"to": "https://d-nb.info/gnd/2022139-3"
},
{
"from": [
"LINKE"
],
"fromBlank": false,
"fromError": false,
"to": "https://d-nb.info/gnd/10173685-X"
},
{
"from": [
"PDS"
],
"fromBlank": false,
"fromError": false,
"to": "https://d-nb.info/gnd/5010217-5"
}
],
"description": "Mass edit cells in column affiliation"
}
]
</code></pre></div></div>
<p>Then click <code class="language-plaintext highlighter-rouge">Perform Operations</code>:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-09-perform.png" alt="politicians-09-perform" /></p>
<p>Again, before we reconcile with the additional affiliation IDs, we <code class="language-plaintext highlighter-rouge">Remove All</code> facets and <code class="language-plaintext highlighter-rouge">Clear reconciliation data</code>:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-10-clear.png" alt="politicians-10-clear" /></p>
<p>Now we reconcile again, passing the affiliation IDs as an additional property:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-11-reconcile.png" alt="politicians-11-reconcile" /></p>
<p>With this, we now get 247 matches:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-12-reconciled.png" alt="politicians-12-reconciled" /></p>
<p>To further improve reconciliation results, let’s use the fact that we know the profession of the people we’re trying to match: they are all politicians. To do so, we’ll add a column (<code class="language-plaintext highlighter-rouge">label</code> column > <code class="language-plaintext highlighter-rouge">Edit column</code> > <code class="language-plaintext highlighter-rouge">Add column based on this column...</code>), and use <code class="language-plaintext highlighter-rouge">"Politik*"</code> as the expression:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-13-add.png" alt="politicians-13-add" /></p>
<p>Using <code class="language-plaintext highlighter-rouge">Politik*</code> results in matching both male (<code class="language-plaintext highlighter-rouge">Politiker</code>) and female (<code class="language-plaintext highlighter-rouge">Politikerin</code>) forms, as well as related occupations like <code class="language-plaintext highlighter-rouge">Politikwissenschaftler</code> and <code class="language-plaintext highlighter-rouge">Politikwissenschaftlerin</code>.</p>
<p>We now <code class="language-plaintext highlighter-rouge">Remove All</code> facets and <code class="language-plaintext highlighter-rouge">Clear reconciliation data</code> as before, and reconcile again, this time passing both the <code class="language-plaintext highlighter-rouge">occupation</code> and <code class="language-plaintext highlighter-rouge">affiliation</code>columns as additional properties:</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-14-reconcile.png" alt="politicians-14-reconcile" /></p>
<p>Checking our final result, we now have more than 75% matched entries (275 matched, 83 unmatched):</p>
<p><img src="/images/2019-09-30-openrefine-examples/politicians-15-reconciled.png" alt="politicians-15-reconciled" /></p>
<p>Again, the remaining entries can be matched manually using previews and entry suggestions, see <a href="http://blog.lobid.org/2018/08/27/openrefine.html">our general documentation</a> for details. You can download the <a href="/data/politicians.json">complete workflow</a> to run it (<code class="language-plaintext highlighter-rouge">Undo / Redo</code> tab, <code class="language-plaintext highlighter-rouge">Apply...</code>) on the <a href="/data/politicians.csv">input data</a> in a new project.</p>
<p>*<small><em>Thanks to Felix Ostrowski and Florian Gilberg for providing these data sets.</em></small></p>
Presenting the SkoHub Vocabs Prototype2019-09-27T00:00:00+00:00Adrian Pohl, Felix Ostrowskihttp://blog.lobid.org/2019/09/27/presenting-skohub-vocabs<p>We are happy to announce that the SkoHub prototype outlined in our post <a href="http://blog.lobid.org/2019/05/17/skohub.html">“SkoHub: Enabling KOS-based content subscription”</a> is now finished. In a series of three post we will report on the outcome by walking through the different components and presenting their features.</p>
<p>SkoHub is all about utilizing the power of Knowledge Organization Systems (KOS) to create a publication/subscription infrastructure for Open Educational Resources (OER). Consequently, publishing these KOS on the web according to the standards was the first area of focus for us. We are well aware that there are already plenty of Open Source tools to <a href="http://skosmos.org/">publish</a> and <a href="http://vocbench.uniroma2.it/">edit</a> vocabularies based on <a href="https://en.wikipedia.org/wiki/Simple_Knowledge_Organization_System">SKOS</a>, but these are usually monolithic database applications. Our own workflows often involve managing smaller vocabularies as <a href="https://github.com/hbz/lobid-vocabs">flat files on GitHub</a>, and <a href="https://github.com/dcmi/lrmi/tree/master/lrmi_vocabs">others</a> seem to also do so.</p>
<p>We will thus start this series with <a href="https://github.com/hbz/skohub-vocabs">SkoHub Vocabs</a> (formerly called “skohub-ssg”), a static site generator that provides integration for a GitHub-based workflow to publish an HTML version of SKOS vocabularies. Check out the <a href="https://jamstack.org/best-practices/">JAMStack Best Practices</a> for some thoughts about the advantages of this approach. SkoHub Vocabs – like SkoHub Editor that will be presented in a separate post – is a stand-alone module that can already be helpful on its own, when used without any of the other SkoHub modules.</p>
<h2 id="how-to-publish-a-skos-scheme-from-github-with-skohub-vocabs">How to publish a SKOS scheme from GitHub with SkoHub Vocabs</h2>
<p>Let’s take a look at the editing and publishing workflow step by step. We will use SkoHub Vocabs to publish a subject classification for Open Educational Resources. We will use the “Educational Subject Classification” (ESC), that was created for the <a href="https://oerworldmap.org">OER World Map</a> based on <a href="http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf">ISCED Fields of Education and Training 2013</a>.</p>
<h3 id="step-1-publish-vocab-as-turtle-files-on-github">Step 1: Publish vocab as turtle file(s) on GitHub</h3>
<p>Currently, a SKOS vocab has to be published in a GitHub repository as one or more <a href="https://www.w3.org/TR/turtle/">Turtle</a> file(s) in order to be processed by SkoHub Vocabs. ESC is already <a href="https://github.com/hbz/vocabs-edu/blob/master/esc.ttl">available on GitHub</a> in one Turtle file, so there is nothing to do in this regard. Note that you can also use the static site generator locally, i.e. without GitHub integration; see <a href="#implementation">below</a> for more about this.</p>
<h3 id="step-2-configure-webhook">Step 2: Configure webhook</h3>
<p>In order to publish a vocabulary from GitHub with SkoHub Vocabs, you have to set up a webhook in GitHub. It goes like this:</p>
<ol>
<li>In the GitHub repo where the vocab resides, go to “Settings” → “Webhooks” and click “Add webhook”
<img src="/images/presenting-skohub-vocabs/add-webhook.png" alt="Screenshot of the Webhook page in a GitHub repo with highlighted fields for the navigation path." style="width:620px" /></li>
<li>Enter <code class="language-plaintext highlighter-rouge">https://test.skohub.io/build</code> as payload URL, choose <code class="language-plaintext highlighter-rouge">application/json</code> as content type and enter the secret. (Please <a href="http://lobid.org/team/">contact</a> us for the secret if you want to try it out.)
<img src="/images/presenting-skohub-vocabs/add-webhook2.png" alt="Screenshot of the Webhook page with input (payload URL and secret)." style="width:620px" /></li>
</ol>
<h3 id="step-3-execute-build--error-handling">Step 3: Execute build & error handling</h3>
<p>For the vocabulary to be built and published on SkoHub, there has to be a new commit in the master branch. So, we have to adjust something in the vocab and push it into the master branch. Looking again at the webhook page in the repo settings, you can see a notice that the build was triggered:</p>
<p><img src="/images/presenting-skohub-vocabs/check-webhook-response.png" alt="Screenshot from GitHub Webhook page with information that build was triggered with link to build log." style="width:620px" /></p>
<p>However, looking at the build log, an error is shown and the site did not build:</p>
<p><img src="/images/presenting-skohub-vocabs/error-in-build-log.png" alt="Screenshot from build log with error message" style="width:620px" /></p>
<p>Oops, we forgot to check the vocab for syntax errors before triggering the build and there actually <em>is</em> a syntax error in the turtle file. Fixing the syntax in a new <a href="https://github.com/hbz/vocabs-edu/commit/6ab97649874607df7784eaa0787adadbcefde166">commit</a> will automatically trigger a new build:</p>
<p><img src="/images/presenting-skohub-vocabs/fix-error.png" alt="Screenshot from build log with error message" style="width:620px" /></p>
<p>This time the build goes through without errors and, voilà, SkoHub has published a human-readable version of the vocabulary at <a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.en.html">https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.en.html</a>. SkoHub Static Site Generator also publishes an <a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/index.en.html">overview</a> of all the SKOS vocaularies in the GitHub repo.</p>
<h3 id="step-4-redirect-vocab-uri-to-skohub">Step 4: Redirect vocab URI to SkoHub</h3>
<p>As we want the canonical version of ESC to be the one published with SkoHub Vocabs, we need to redirect the namespace URI we defined in the Turtle file to SkoHub. As we used w3id.org for this, we have to make a pull request in the respective repo.</p>
<p><a href="https://github.com/perma-id/w3id.org/pull/1483"><img src="/images/presenting-skohub-vocabs/open-pr-at-w3id.png" alt="Screenshot of a pull request to redirect ESC to SkoHub" style="width:620px" /></a></p>
<p>If everything looks good, w3id.org PRs are merged very quickly, in this case it happened an hour later.</p>
<h3 id="result-html--json-ld-representation-published-with-skohub--basic-github-editing-workflow">Result: HTML & JSON-LD representation published with SkoHub & basic GitHub editing workflow</h3>
<p>As a result, we have published a controlled vocabulary in SKOS under a permanent URI and with a human-readable <a href="https://w3id.org/class/esc/scheme.html">HTML</a> representation from GitHub with a minimum amount of work. Additionally, the initial Turtle representation is transformed to more developer-friendly <a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.json">JSON-LD</a>. The HTML has a hierarchy view that can be expanded and collapsed at will:</p>
<p><a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.en.html"><img src="/images/presenting-skohub-vocabs/published-vocab.png" alt="Screenshot of the HTML version of ESC published with SkoHub." style="width:620px" /></a></p>
<p>There also is a search field to easily filter the vocabulary:</p>
<p><img src="/images/presenting-skohub-vocabs/skohub-ssg-filter.png" alt="Screenshot: Filter the scheme by yping in the search box" style="width:420px" /></p>
<p>This filter is based on a <a href="https://github.com/nextapps-de/flexsearch">FlexSearch</a> index that is also built along with the rest of the content. This allows us to implement lookup functionalities without the need for a server-side API. More about this below and in the upcoming post on the SkoHub Editor.</p>
<h2 id="implementation">Implementation</h2>
<p>To follow along the more technical aspects, you might want to have SkoHub Vocabs checked out locally:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ git clone https://github.com/hbz/skohub-vocabs
$ cd skohub-vocabs
$ npm i
$ cp .env.example .env
</code></pre></div></div>
<p>The static site generator itself is implemented with <a href="https://www.gatsbyjs.org/">Gatsby</a>. One reason for this choice was our good previous experience with <a href="https://reactjs.org/">React</a>. Another nice feature of Gatsby is that all content is sourced into an in-memory database that is available using <a href="https://graphql.org/">GraphQL</a>. While there is certainly a learning curve, this makes the experience of creating a static site not that much different from traditional database-based approaches. You can locally build a vocab as follows:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cp test/data/systematik.ttl data/
$ npm run build
</code></pre></div></div>
<p>This will result in a build in <code class="language-plaintext highlighter-rouge">public/</code> directory. Currently, the build is optimized to be served by Apache with <a href="https://httpd.apache.org/docs/2.4/mod/mod_negotiation.html">Multiviews</a> in order to provide content negotiation. Please note that currently only vocabularies are supported that implement the <a href="https://www.w3.org/2001/sw/BestPractices/VM/http-examples/2006-01-18/#slash">slash namespace</a> pattern. We will add support for hash URIs in the future.</p>
<p>In order to trigger the static site generator from GitHub, a small webhook server based on <a href="https://koajs.com/">Koa</a> was implemented. (Why not <a href="https://expressjs.com/">Express</a>? – It wouldn’t have made a difference.) The <a href="https://developer.github.com/webhooks/">webhook</a> server listens for and validates POST requests coming from GitHub, retrieves the data from the corresponding repository and then spins up Gatsby to create the static content.</p>
<p>A final word on the FlexSearch index mentioned above. An important use case for vocabularies is to access them from external applications. Using the FlexSearch library and the index pre-built by SkoHub Vocabs, a lookup of vocabulary terms is easy to implement:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><script src="https://cdnjs.cloudflare.com/ajax/libs/FlexSearch/0.6.22/flexsearch.min.js"></script>
<script>
fetch('https://w3id.org/class/esc/scheme', {
headers: { accept: 'text/index'}
}).then(response => response.json())
.then(serialized => {
const index = FlexSearch.create()
index.import(serialized)
console.log(index.search("philosophy"))
})
</script>
</code></pre></div></div>
<p>Note that currently the index will only return URIs associated with the search term, not the corresponding labels. This will change in a future update.</p>
<p><em>Updates:</em></p>
<ul>
<li><em>Edit 2021-02-05: Update some URLs because with <a href="https://github.com/skohub-io/skohub-vocabs/issues/79">implementing internationalization</a> for the HTML pages, SkoHub Vocabs URLs changed.</em></li>
</ul>
Improved GND reconciliation for OpenRefine2019-08-19T00:00:00+00:00Fabian Steeghttp://blog.lobid.org/2019/08/19/openrefine<p>Triggered by the newly formed <a href="https://www.w3.org/community/reconciliation/">W3C Entity Reconciliation Community Group</a> and its <a href="https://reconciliation-api.github.io/testbench/">reconciliation service test bench</a> we have improved our GND reconciliation for OpenRefine by implementing the <a href="https://github.com/OpenRefine/OpenRefine/wiki/Suggest-API">OpenRefine suggest API</a> for searching types, properties, and entities.</p>
<p>When selecting a custom type in the reconciliation dialog, matching types are suggested:</p>
<p><img src="/images/2018-08-27-openrefine/07-type-custom.png" alt="7-2" /></p>
<p>Data from other columns can be used to improve reconciliation results by selecting a suggested property:</p>
<p><img src="/images/2018-08-27-openrefine/08-other.png" alt="8" /></p>
<p>Candidates can be matched by selecting suggested entities:</p>
<p><img src="/images/2018-08-27-openrefine/10-search.png" alt="10" /></p>
<p>Properties are also suggested when adding columns from reconciled values:</p>
<p><img src="/images/2018-08-27-openrefine/12-add-suggest.png" alt="8" /></p>
<p>For complete usage instructions check out our updated documentation on <a href="http://blog.lobid.org/2018/08/27/openrefine.html">GND reconciliation for OpenRefine</a>.</p>
Offene Bibliotheks-APIs erfassen & nachschlagen2019-07-19T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2019/07/19/open-api-lookup<p>Bisher ist es oft nur recht umständlich herauszufinden, ob und welche Schnittstellen zu einem Bibliothekssystem existieren. Dies kann nun auf sehr bequeme Weise über die lobid-API erfolgen. Im Sigelverzeichnis lassen sich die API-Endpoints verschiedener offener Programmierschnittstellen erfassen und sind dann über <a href="https://lobid.org/organisations">lobid-organisations</a> abfragbar.</p>
<p>Wir nehmen als Beispiel die Universitätsbibliothek Hildesheim (DE-Hil2), die ihre Schnittstellen (<a href="http://www.loc.gov/standards/sru/">SRU</a>, <a href="http://purl.org/NET/DAIA">DAIA</a>, <a href="https://gbv.github.io/paia/paia.html">PAIA</a>) vorbildlich erfasst hat. Das <a href="https://lobid.org/organisations/DE-Hil2.json">JSON-LD</a> enthält folgende Informationen:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://lobid.org/organisations/DE-Hil2#!"</span><span class="p">,</span><span class="w">
</span><span class="nl">"availableChannel"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"serviceType"</span><span class="p">:</span><span class="s2">"SRU"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="s2">"ServiceChannel"</span><span class="p">,</span><span class="s2">"WebAPI"</span><span class="p">],</span><span class="w">
</span><span class="nl">"serviceUrl"</span><span class="p">:</span><span class="s2">"http://sru.gbv.de/opac-de-hil2"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"serviceType"</span><span class="p">:</span><span class="s2">"PAIA"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="s2">"ServiceChannel"</span><span class="p">,</span><span class="s2">"WebAPI"</span><span class="p">],</span><span class="w">
</span><span class="nl">"serviceUrl"</span><span class="p">:</span><span class="s2">"https://paia.gbv.de/DE-Hil2/"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"serviceType"</span><span class="p">:</span><span class="s2">"DAIA"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="s2">"ServiceChannel"</span><span class="p">,</span><span class="s2">"WebAPI"</span><span class="p">],</span><span class="w">
</span><span class="nl">"serviceUrl"</span><span class="p">:</span><span class="s2">"https://paia.gbv.de/DE-Hil2/daia"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Im <code class="language-plaintext highlighter-rouge">availableChannel</code> Array sind also nun alle im Sigelverzeichnis eingetragenen Service URLs als <code class="language-plaintext highlighter-rouge">ServiceChannel</code> angegeben, wobei nur Programmierschnittstellen den zusätzlichen Typ <code class="language-plaintext highlighter-rouge">WebAPI</code> haben.<sup>*</sup> Mit <code class="language-plaintext highlighter-rouge">serviceType</code> wird der jeweilige Schnittstellentyp angegeben.</p>
<p>Alle Felder lassen sich über die API abfragen. Hier ein paar Beispiele:</p>
<ul>
<li>Einrichtungen, die mindestens eine offene API im Sigelverzeichnis dokumentiert haben: <a href="https://lobid.org/organisations/search?q=availableChannel.type%3AWebAPI"><code class="language-plaintext highlighter-rouge">availableChannel.type:WebAPI</code></a></li>
<li>Einrichtungen mit Angabe einer SRU-Schnittstelle: <a href="https://lobid.org/organisations/search?q=availableChannel.serviceType%3ASRU"><code class="language-plaintext highlighter-rouge">availableChannel.serviceType:SRU</code></a></li>
<li>Einrichtungen mit Angabe einer OpenURL-Schnittstelle: <a href="https://lobid.org/organisations/search?q=availableChannel.serviceType%3AOpenURL"><code class="language-plaintext highlighter-rouge">availableChannel.serviceType:OpenURL</code></a></li>
<li>Einrichtungen mit Angabe einer DAIA- oder PAIA-API: <a href="https://lobid.org/organisations/search?q=availableChannel.serviceType%3ADAIA+OR+availableChannel.serviceType%3APAIA"><code class="language-plaintext highlighter-rouge">availableChannel.serviceType:DAIA OR availableChannel.serviceType:PAIA</code></a></li>
<li>Einrichtungen mit verzeichneter DAIA-API aber ohne SRU-API: <a href="https://lobid.org/organisations/search?q=availableChannel.serviceType%3ADAIA+AND+NOT+availableChannel.serviceType%3ASRU"><code class="language-plaintext highlighter-rouge">availableChannel.serviceType:DAIA AND NOT availableChannel.serviceType:SRU</code></a></li>
</ul>
<p>Die Abfragen lassen sich natürlich beliebig mit der Abfrage anderer Felder (siehe die <a href="https://lobid.org/organisations/api/de#jsonld">API-Dokumentation</a> kombinieren, zum Beispiel:</p>
<ul>
<li>Alle Zentralen Universitätsbibliotheken, die mindestens eine offene API im SIgelverzeichnis dokumentiert haben: <a href="https://lobid.org/organisations/search?location=&from=0&size=20&q=availableChannel.type:WebAPI+AND+classification.id:%22http://purl.org/lobid/libtype%23n60%22"><code class="language-plaintext highlighter-rouge">availableChannel.type:WebAPI AND classification.id:"http://purl.org/lobid/libtype#n60"</code></a></li>
</ul>
<p>Voraussetzung für eine umfassende Suche nach offenen Schnittstellen ist natürlich, dass die Schnittstellen überhaupt im Sigelverzeichnis erfasst sind, wozu wir ausdrücklich ermutigen möchten. Für die Erfassung hat Jakob Voß eine <a href="https://verbundwiki.gbv.de/display/VZG/Schnittstellen">Anleitung</a> erstellt, die wir hier wiedergeben.</p>
<h2 id="eintragung-offener-apis-im-sigelverzeichnis">Eintragung offener APIs im Sigelverzeichnis</h2>
<p>Ob und unter welcher URL welche Schnittstellen zu Bibliothekssystemen existieren ist oft nur aufwändig herauszufinden. Es wird deshalb empfohlen die API-URLs im Sigelverzeichnis einzutragen. Grundlage hierfür ist das Pica3-Feld 856. Zur Eintragung und Aktualisierung kann das Webformular der Sigelstelle verwendet werden:</p>
<ol>
<li>Eintrag der eigenen Bibliothek <strong>im Sigelverzeichnis suchen</strong> (z.B. <a href="https://sigel.staatsbibliothek-berlin.de/suche/?isil=DE-Hil2">https://sigel.staatsbibliothek-berlin.de/suche/?isil=DE-Hil2</a>)</li>
<li>Ganz unten auf “<strong>Änderungen zu Angaben mitteilen</strong>” klicken (z.B. <a href="https://sigel.staatsbibliothek-berlin.de/aenderungen-mitteilen/?isil=DE-Hil2">https://sigel.staatsbibliothek-berlin.de/aenderungen-mitteilen/?isil=DE-Hil2</a>)</li>
<li>Vorhandene Schnittstellen unter “Service-URLs” ergänzen
<ol>
<li>Art der URL: “<strong>weitere Service-URL</strong>” auswählen</li>
<li>Text (Textfeld direkt unter der Auswahlliste): Art der Schnittstelle, also “<strong>SRU</strong>”, “<strong>Z39.50</strong>”, “<strong>DAIA</strong>”, “<strong>PAIA</strong>” oder “<strong>OpenURL</strong>”</li>
<li>URL: Basis-URL der jeweiligen Schnittstelle</li>
</ol>
</li>
<li>Formular abschicken (vorher noch eigene Kontaktdaten für Rückfragen angeben) & Bestätigungslink in der automatisch verschickten E-Mail klicken</li>
</ol>
<p><img src="/images/2019-07-19-apis-im-sigelverzeichnis.png" alt="Ein Screenshot des Änderungsformular, der beispielhaft das Eintragen von SRU, PAIA und DAIA-Endpunkten zeigt" style="width:650px" /></p>
<p>Wer will kann natürlich auch den Link zum Änderungsformular im jeweiligen lobid-organisations-Eintrag klicken:</p>
<p><a href="https://lobid.org/organisations/DE-Hil2"><img src="/images/2019-07-19-aenderungen-via-lobid.png" alt="Ein Screenshot, der zeigt, wie man aus einem lobid-organisations-Eintrag in das entsprechende Änderungsformular des Sigelverzeichnisses gelangt" style="width:650px" /></a></p>
<h2 id="dank">Dank</h2>
<p>Danke an alle Beteiligten (siehe diesen <a href="https://twitter.com/acka47/status/1143820540785897472">Twitter Thread</a>), vor allem Jakob Voß und Carsten Klee für die schnelle Unterstützung. Das war ein zügige verbundübergreifende Zusammenarbeit, die Spaß gemacht hat.
Und merci im Vorabbereich an alle, die ihre offenen Schnittstellen im Sigelverzeichnis erfassen!</p>
<hr />
<p><sup>*</sup> Es gibt noch einige weitere Nutzungsarten des entsprechenden Feldes im Sigelverzeichnis, z.B. werden Links zur <a href="https://lobid.org/organisations/search?q=availableChannel.serviceType%3ANutzung">Benutzungsordnung</a>, zum <a href="https://lobid.org/organisations/search?q=availableChannel.serviceType%3AStandort">Standort</a> oder zu den <a href="https://lobid.org/organisations/search?q=availableChannel.serviceType%3A%C3%96ffnungszeiten">Öffnungszeiten</a> in dem Feld angegeben. Eine Liste der <code class="language-plaintext highlighter-rouge">serviceType</code>-Werte gibt es <a href="https://gist.github.com/acka47/bcf7d0cbbbb8de8d31220c12c2525171">hier</a>.</p>
SkoHub: Enabling KOS-based content subscription2019-05-17T00:00:00+00:00Adrian Pohl, Felix Ostrowskihttp://blog.lobid.org/2019/05/17/skohub<p>For a long time, openness movements and initiatives with labels like “Open Access”, “Open Educational Resources” (OER) or “Linked Science” have been working on establishing a culture where scientific or educational resources are by default published with an <a href="http://opendefinition.org/">open</a> license on the web to be read, used, remixed and shared by anybody. With a growing supply of resources on the web, the challenge grows to learn about or find resources relevant for your teaching, studies, or research.</p>
<p>In this post, we describe the SkoHub project being carried out in 2019 by the hbz in cooperation with graphthinking GmbH. The project seeks to implement a prototype for a novel approach in syndicating content on the web by combining current web standards for sending notifications and subscribing to feeds with knowledge organization systems (KOS, sometimes also called “controlled vocabularies”).*</p>
<h2 id="current-practices-and-problems">Current practices and problems</h2>
<p>What are the present approaches to the problem of finding open content on the web, and what are their limitations?</p>
<h3 id="searching-metadata-harvested-from-silos">Searching metadata harvested from silos</h3>
<p>Current approaches for publishing and finding open content on the web are often focused on repositories as the place to publish content. Those repositories then provide (ideally standardized) interfaces for crawlers to collect and index the metadata in order to offer search solutions on top. An established approach for Open Access (OA) articles goes like this:</p>
<ul>
<li>Repositories with interfaces for metadata harvesting (<a href="http://www.openarchives.org/OAI/openarchivesprotocol.html">OAI-PMH</a>) are set up for scholars to upload their OA publications</li>
<li>Metadata is crawled from those repositories, normalized and loaded into search indexes</li>
<li>Search interfaces are offered to end users</li>
</ul>
<p> <img src="/images/2019-05-17-skohub/repo-approach.png" alt="Diagram of the current approach with metadata being crawled from repos, indexed and search offered on top." style="width:400px" /></p>
<p>With this approach, subject-specific filtering is either already done when crawling the data to create a subject-specific index, or when searching the index.</p>
<h3 id="maintenance-burden">Maintenance burden</h3>
<p>When offering a search interface with this approach, you have to create and maintain a list of sources to harvest:</p>
<ol>
<li>watch out for new relevant sources to be added to your list,</li>
<li>adjust your crawler to changes regarding the services’ harvesting interface,</li>
<li>homogenize data from different sources to get a consistent search index.</li>
</ol>
<p>Furthermore, end users have to know where to find your service to search for relevant content.</p>
<h3 id="off-the-web">Off the web</h3>
<p>Besides being error-prone and requiring resources for keeping up with changes in the repositories, this approach also does not take into account how web standards work. As <a href="https://doi.org/10.1045/november2015-vandesompel">Van de Sompel and Nelson 2015</a> (both co-editors of the OAI-PMH specification) phrase it:</p>
<blockquote>
<p><small>“Conceptually, we have come to see [OAI-PMH] as repository-centric instead of resource-centric or web-centric. It has its starting point in the repository, which is considered to be the center of the universe. Interoperability is framed in terms of the repository, rather than in terms of the web and its primitives. This kind of repository, although it resides on the web, hinders seamless access to its content because it does not fully embrace the ways of the web.”</small></p>
</blockquote>
<p>In short, the repository metaphor guiding this practice obscures what constitutes the web: <strong>resources</strong> that are identified by <strong>HTTP URIs</strong> (<a href="https://en.wikipedia.org/wiki/Uniform_Resource_Identifier">Uniform Resource Identifier</a>).</p>
<h2 id="subject-specific-subscription-to-web-resources">Subject-specific subscription to web resources</h2>
<p>So how could a web- or resource-centric approach to resource discovery by subject look like?</p>
<h3 id="of-the-web">Of the web</h3>
<p>To truly be part of the web, URIs are the most important part: Every resource (e.g. an OER) needs a URL that locates and identifies it. In order to make use of knowledge organization systems on the web, representing a controlled vocabulary using <a href="https://en.wikipedia.org/wiki/Simple_Knowledge_Organization_System">SKOS</a> vocabulary is the best way to go forward: each subject in the vocabulary is identified by a URI. With these prerequisites, anybody can link their resources to subjects from a controlled vocabulary. This can be done e.g. by embedding <a href="http://www.dublincore.org/specifications/lrmi/lrmi_1/">LRMI</a>, “Learning Resource Metadata Initiative” metadata as JSON-LD into the resource or its description page.</p>
<p> <img src="/images/2019-05-17-skohub/subject-indexing-with-uris.png" alt="A diagram with three resources (an OER, a subject and a classification), each identified by a URI and linked together" style="width:230px" /></p>
<h3 id="web-based-subscriptions-and-notifications">Web-based subscriptions and notifications</h3>
<p>So, HTTP URIs for resources and subject are important to transparently publish and thereafter identify and link educational resources, controlled vocabularies and subject on the web. But with URIs as the basic requirement in place, we also get the possibility to utilize further web standards for the discovery of OER. For SkoHub, we make use of <a href="https://www.w3.org/TR/social-web-protocols/">Social Web Protocols</a> to build an infrastructure where services can send and subscribe to notifications for subject. The general setup looks as follows:</p>
<ol>
<li>Every element of a controlled vocabulary gets an inbox, identified by a URL.
<img src="/images/2019-05-17-skohub/subject-indexing-with-uris-and-inbox.png" alt="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together" style="width:500px" /></li>
<li>Systems can send notifications to the inbox, for example “This is a new resource about this subject”.
<img src="/images/2019-05-17-skohub/sending-notification.png" alt="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject's inbox" style="width:500px" /></li>
<li>Systems can subscribe to a subject’s inbox and will directly receive a notification as soon as it is received (push approach).
<img src="/images/2019-05-17-skohub/pushing-notification.png" alt="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject's inbox" style="width:500px" /></li>
</ol>
<p>This infrastructure allows applications</p>
<ol>
<li>to send a notification to a subject’s inbox containing information about and a link to new content about this subject</li>
<li>to subscribe to the inbox of a subject from a knowledge organization system in order to receive push updates about new content in real time.</li>
</ol>
<p>Here is an example: a teacher is interested in new resources about environmental subjects. She subscribes to the subject via a controlled vocabulary like <a href="https://unesdoc.unesco.org/ark:/48223/pf0000235049">ISCED-2013 Fields of Education and Training</a>. She then receives updates whenever a colleague publishes a resource that is linked to the subject.</p>
<p> <img src="/images/2019-05-17-skohub/pubsub.png" alt="A diagram with Teacher A subscribing to a subject tag that a document published by Teacher B is about, thus receiving notifications about the new resource." style="width:300px" /></p>
<p>To be really useful, applications for subscribing to content should enable additional filters, to subscribe to combinations of subjects (e.g. “Environment” & “Building and civil engineering”) or to add addtional filters on educational level, license type etc.</p>
<h2 id="advantages">Advantages</h2>
<p>This subject-oriented notification/subscription approach to content syndication on the web has many advantages.</p>
<p><strong>Push instead of pull</strong>
<br />
With the push approach, you subscribe once and content is coming from different and new sources without the subscriber having to maintain a list of sources. Of course quality control might become an issue. Thus, instead of whitelisting by administering a subscription list one would practice blacklisting by filtering out sources that distribute spam or provide low-quality content.</p>
<p><strong>Supporting web-wide publications</strong></p>
<p>Being of the web, SkoHub supports publications residing anywhere on the web. While the repository-centric approach favours content in a repository that provides interfaces for harvesting, with SkoHub any web resource can make use of the notification mechanism. Thus, content producers can choose which tool or platform best fits their publishing needs, be it YouTube, a repository, hackmd.io or else. The only requirement is for publications to have a stable URL and, voilà, they can syndicate their content via KOS.</p>
<p><strong>Knowledge organization systems are used to their full potential</strong>
<br />
This additional layer to the use of Knowledge Organization Systems makes them much more powerful (“KOS on steroids”) and attractive for potential users.</p>
<p><strong>Encouraging creation and use of shared Knowledge Organization Systems across applications</strong>
<br />
In the German OER context it is a recurring theme that people are wishing everybody would use the same controlled vocabularies so that data exchange and aggregation required less mapping. With a SkoHub infrastructure in place, there are big additional incentives on going forward in this direction.</p>
<p><strong>Incentive for content producers to add machine-readable descriptions</strong>
<br />
When subject indexing becomes tantamount with notifying interested parties about one’s resources, this means a huge incentive for content producers to describe their resources with structured data doing subject indexing.</p>
<h2 id="skohub-project-scope">SkoHub project scope</h2>
<p>The SkoHub project has four deliverables. While working on the backend infrastructure for receiving and pushing notifications (skohub-pubsub), we also want to provide people with means to publish a controlled vocabulary along with inboxes (skohub-ssg), to link to subjects and send notifications (skohub-editor) and to subscribe to notifications in the browser (skohub-deck).</p>
<p><strong>skohub-pubsub: Inboxes and subscriptions</strong>
<br />
Code: <a href="https://github.com/hbz/skohub-pubsub">https://github.com/hbz/skohub-pubsub</a>
<br />
This part provides the SkoHub core infrastructure, setting up basic inboxes for subjects plus the ability of subscribing to push subscriptions for each new notification.</p>
<p><strong>skohub-ssg: Static site generator for Simple Knowledge Organization Systems</strong>
<br />
Code: <a href="https://github.com/hbz/skohub-ssg">https://github.com/hbz/skohub-ssg</a>
<br />
This part of the project covers the need to easily publish a controlled vocabulary as a SKOS file, with a basic lookup API and a nice HTML view including links to an inbox for each subject.</p>
<p><strong>skohub-editor: Describing & linking learning resources, sending notifications</strong>
<br />
Code: <a href="https://github.com/hbz/skohub-editor">https://github.com/hbz/skohub-editor</a>
<br />
The editor will run in the browser and enable structured description of educational resources published anywhere on the web. It includes validation of the entered content for each field and lookup of controlled values via the API provided by skohub-ssg.</p>
<p><strong>skohub-deck: Browser-based subscription to subjects</strong>
<br />
Code: <a href="https://github.com/hbz/skohub-deck">https://github.com/hbz/skohub-deck</a>
<br />
The SkoHub deck is a proof of concept to show that the technologies developed actually work. It enables people to subscribe to notifications for specific subjects in the browser. The incoming notifications will be shown in a Tweetdeck-like interface.</p>
<h2 id="outlook">Outlook</h2>
<p>The project will be completed by end of 2019. We intend to provide updates about the process during the way. Next up, we will explain the technical architecture in more detail, expanding on our use of social web protocols. Furthermore, we will provide updates on the development status of the project.</p>
<hr />
<p>*<small> Note that while SkoHub has clear similarities with the “Information-Sharing Pipeline” envisioned in Ilik and Koster 2019 regarding the use of social web protocols on authority data, there is also a fundamental difference: While Ilik and Koster are talking about sharing <em>updates</em> of authority entries themselves (e.g. receiving updates for a person profile to be considered for inclusion in one’s own authority file), SkoHub is about sharing new <em>links</em> to an entry in an authority file or other controlled vocabulary.</small></p>
<h2 id="references">References</h2>
<p>de Sompel, Herbert Van / Nelson, Michael L. (2015): Reminiscing About 15 Years of Interoperability Efforts. D-Lib Magazine 21 , no. 11/12. DOI: <a href="https://doi.org/10.1045/november2015-vandesompel">10.1045/november2015-vandesompel</a></p>
<p>Ilik, Violeta / Koster, Lukas (2019): Information-Sharing Pipeline, The Serials Librarian, DOI: <a href="https://doi.org/10.1080/0361526X.2019.1583045">10.1080/0361526X.2019.1583045</a>. Preprint: <a href="https://doi.org/10.31219/osf.io/hbwf8">https://doi.org/10.31219/osf.io/hbwf8</a></p>
lobid-Lehrveranstaltung an der HTW chur2019-04-04T00:00:00+00:00Adrian Pohl, Pascal Christophhttp://blog.lobid.org/2019/04/04/lobid-at-htw<p>Ende letzter Woche waren <a href="http://lobid.org/team/ap#!">Adrian</a> und <a href="http://lobid.org/team/pc#!">Pascal</a> in Zürich. Eingeladen von <a href="https://ch.semweb.ch/firma/de-fabio-ricci/">Fabio Ricci</a> haben wir im Kurs “Semantische Systeme” im <a href="https://www.htwchur.ch/studium/bachelorangebot/wirtschaft-und-dienstleistung/information-science/">Bachelor-Studiengang Informationswissenschaft</a> an der HTW Chur über unsere Erfahrungen in der Bereitstellung von Linked Open Data am hbz gesprochen.</p>
<p>Wir wurden als Externe eingeladen, damit die Student*innen ein wenig aus der Berufspraxis erfahren würden. Es war das erste Mal, dass wir vor Student*innen vorgetragen haben. Wir hatten ein wenig Informationen über das Vorwissen der Student*innen und waren frei, was den Inhalt, Struktur und Methode der Veranstaltung anging. Wir begrüßen eine solche Freiheit - sie bedeutet allerdings auch unendliche Gestaltungsmöglichkeiten und die Aufgabe, sich für einen Ansatz zu entscheiden.</p>
<p>Wir hatten uns in der Vorbereitung relativ zügig auf die groben Inhalte geeinigt: zum einen allgemein zeigen, <em>was</em> wir machen und <em>wie</em> wir arbeiten (Open Source, Open Data, offene Standards kamen in diesem Kontext natürlich nicht zu kurz) und zum anderen Details des Aufbaus einer JSON-LD-basierten Web-API vermitteln und deren Nutzungsmöglichkeiten beschreiben. Damit es nicht zu langweilig wird, sollten die Studierenden zwischendurch selbst Aufgaben an ihren Laptops erledigen, so dass die Inhalte besser verfangen. Hier die Agenda, mit der wir in die Veranstaltung gegangen sind:</p>
<table>
<thead>
<tr>
<th>Zeit</th>
<th>Thema</th>
<th>Inhalt</th>
</tr>
</thead>
<tbody>
<tr>
<td>13:15-13:30</td>
<td>Kennenlernen</td>
<td>Vorstellung der Referenten, Fragen an Teilnehmer*innen</td>
</tr>
<tr>
<td>13:30-14:00</td>
<td>Arbeitsweise</td>
<td>Arbeitsprinzipien & Softwareentwicklungsprozess des lobid-Teams</td>
</tr>
<tr>
<td>14:00-14:10</td>
<td>Linked Open Data</td>
<td>Linked-Open-Data-Grundlagen</td>
</tr>
<tr>
<td>14:10-14:30</td>
<td>lobid</td>
<td>Grundlegendes und Historisches</td>
</tr>
<tr>
<td><em>14:30-15:00</em></td>
<td><em>Pause</em></td>
<td> </td>
</tr>
<tr>
<td>15:00-15:30</td>
<td>LOUD & JSON-LD</td>
<td>Linked Open Usable Data & JSON-LD-Grundlagen inkl. Übungen</td>
</tr>
<tr>
<td>15:30-16:00</td>
<td>Ein Beispiel: lobid-gnd</td>
<td>lobid-gnd-Demo als LOUD-Beispiel</td>
</tr>
<tr>
<td>16:00-16:15</td>
<td>lobid-Nutzungsbeispiele</td>
<td>Anwendungsbeispiele der lobid-API mit OpenRefine-Reconciliation-Übung</td>
</tr>
<tr>
<td>16:15-16:30</td>
<td>Abschlussdiskussion</td>
<td> </td>
</tr>
</tbody>
</table>
<p>Die Slides zur Veranstaltung finden sich unter <a href="http://slides.lobid.org/htw-chur-2019/">http://slides.lobid.org/htw-chur-2019/</a>. (Wir haben zu einem großen Teil Slides aus vergangenen Präsentationen recycelt und angepasst aber auch einige Dinge – wie z.B. die <a href="http://slides.lobid.org/htw-chur-2019/#/66">JSON-LD-Übung ab Slide 66</a> – neu erstellt.)</p>
<h2 id="lessons-learned">Lessons Learned</h2>
<p>Vor dem Hintergrund, dass wir keine Erfahrungen mit solcherlei Veranstaltungen hatten, sind wir insgesamt sehr zufrieden mit dem Verlauf. Ein großer Teil der Teilnehmer*innen ist unserem Vortrag gefolgt (natürlich gab es auch einige, die anderes zu tun hatten, aber das bleibt bei einem Uni-Seminar nicht aus). Eine Handvoll von Student*innen hat an verschiedenen Stellen nachgefragt und es haben sich Diskussionen entsponnen. Die Rückmeldungen, die wir am Ende von einigen Teilnehmer*innen bekamen, waren durchweg positiv.</p>
<p>Es gab natürlich auch einige Dinge, die wir bei einer weiteren Veranstaltung anders machen würden:</p>
<ul>
<li><em>Reduktion</em>: Während die Zeit im ersten Teil vollkommen ausreichte und wir in die Details gehen konnten, haben wir nach der Pause gemerkt, dass wir uns mit der Agenda für den zweiten Teil übernommen haben. Das hat dazu geführt, dass wir für die Übungen nicht genügend Zeit hatten und immer mehr durch die Folien hetzen mussten. Eine Möglichkeit, das beim nächsten Mal zu verbessern: den Entwicklungsprozess (ab <a href="http://slides.lobid.org/htw-chur-2019/#/17">Folie 17</a>) von elf auf maximal drei knappe Folien reduzieren und mehr Fokus auf den technischen Teil (APIs & JSON-LD sowie OpenRefine-Übung) legen. Das hätte auch besser zum dem Kurs-Titel “Semantische Systeme” gepasst.</li>
<li><em>Vereinfachung</em>: Im zweiten Teil der Veranstaltung haben wir teilweise zu viel vorausgesetzt.
<ul>
<li>Der allgemeine Web-API-Teil (ab <a href="http://slides.lobid.org/htw-chur-2019/#/53">Folie 53</a>), hat ein Grundverständnis vorausgesetzt, was APIs sind und wie sie funktionieren (wir hatten ihn aus vorherigen Folien, die sich eher an Entwickler*innen richteten, adapiert.) An dieser Stelle müssten wir weiter ausholen und vereinfachen. Ideen: API als “erweiterte Suche über URL” (siehe z.B. diese alten <a href="http://slides.com/acka47/20151027-nwbib-dini#/18">NWBib-Slides</a>); eine Webanwendung(z.B. nwbib.de) als Beispiel zeigen, für die selbst direkt keinerlei Daten geschaffen werden, sondern die komplett auf einer offenen API aufsetzt.</li>
<li>JSON-LD sollte am besten anhand eines einzelnen Tripels eingeführt werden, das 1.) in N-Triples, 2.) als JSON-LD ohne Kontext und 3.) mit Kontext gezeigt wird.</li>
</ul>
</li>
<li>Mehr <em>visuelle Unterstützung</em>: Zum Beispiel beim Zeigen, wie eine Query gegen die lobid-API gebaut wird, den Pfad zu einem Feld auf einer tieferen Ebene (wie etwa <code class="language-plaintext highlighter-rouge">sameAs.collection.id</code> in lobid-gnd) farblich im JSON markieren und dann die entsprechende Query zeigen.</li>
<li><em>Mehr Fragen an das Publikum vorbereiten</em>: Für die Vorstellung am Anfang hatten wir ein paar Fragen vorbereitet, um die Vorkenntnisse im Publikum besser einschätzen zu können. Im Lauf der Veranstaltung haben wir teilweise spontan weitere Fragen gestellt. Es wäre gut, beim nächsten Mal solche Fragen vorzubereiten. Dabei ist zu beachten, dass man mit “Wer hat nie…/Wer kennt noch nicht…?”-Fragen oft mehr Rückmeldung bekommt als auf “Wer kennt…/Wer hat schon…?”-Fragen.</li>
<li><em>Rückmeldungen einholen</em>: Reflexion ist zwar immer hilfreich für den eigenen Lernprozess, noch besser wäre es allerdings gewesen, wenn wir gezielt Rückmeldungen der Teilnehmer*innen eingesammelt hätten. Beim nächsten Mal werden wir einen kleinen <em>Fragebogen</em> (nach Relevanz, Umfang, Schwierigkeit der Inhalte etc.) vorbereiten und die Teilnehmer*innen am Ende bitten ihn auszufüllen.</li>
</ul>
Indexing the Bibframe works dataset as JSON-LD2019-01-31T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2019/01/31/bibframe-dataset<div class="alert-info">
🛈 This post describes an experimental service running on labs.lobid.org. The described service is not be stable and links in the text might stop working in the future.
</div>
<p>At last year’s SWIB conference (<a href="http://swib.org/swib18/programme.html">SWIB18</a>) the <a href="http://lobid.org/team/">lobid team</a> offered a workshop “From LOD to LOUD: making data usable”. In the workshop, participants carried out the steps to create well-structured JSON-LD from RDF data, index it in Elasticsearch, build a simple web application for querying it and use the data with tools like OpenRefine and Kibana. For details, see the slides at <a href="https://hbz.github.io/swib18-workshop/">https://hbz.github.io/swib18-workshop/</a>.</p>
<p>We had to decide which RDF dataset we would use to be treated in the workshop. In the end, we chose the Bibframe works dataset (but not the instances dataset) that the Library of Congress (LoC) had <a href="https://listserv.loc.gov/cgi-bin/wa?A2=BIBFRAME;3141fdaf.1806">published in June</a>. As preparation for the workshop, we did an experimental not very quick but rather dirty conversion of the N-Triples to JSON-LD and indexed the whole Bibframe dataset into Elasticsearch.</p>
<h2 id="the-json-ld-context">The JSON-LD context</h2>
<p>The <a href="https://json-ld.org/spec/latest/json-ld/#the-context">context</a> plays an essential role when creating JSON-LD and in increasing its usability. A central function of the context is to map long property URIs to short keys to be used in the JSON. For example with the line <code class="language-plaintext highlighter-rouge">"label": "http://www.w3.org/2000/01/rdf-schema#label"</code> in the context, I can now use the key <code class="language-plaintext highlighter-rouge">"label"</code> in a JSON-LD document and when including the context in the document (for example by referencing it like <code class="language-plaintext highlighter-rouge">"@context": "https://example.org/context.jsonld"</code>) the key-value pair can be translated to an RDF triple. The context is also used to declare that the values of a specific key should be interpreted as URIs (by saying <code class="language-plaintext highlighter-rouge">"@type": "@id"</code>) or as a date (<a href="https://github.com/hbz/swib18-workshop/blob/85b3d87d2d3d18f7f435a617a3e8b7c104b56b3f/data/context.json#L139-L142">example</a>) or to enforce that a key always is used with an array (<code class="language-plaintext highlighter-rouge">"@container": "@set"</code>), see e.g <a href="https://github.com/hbz/swib18-workshop/blob/85b3d87d2d3d18f7f435a617a3e8b7c104b56b3f/data/context.json#L263-L267">here</a>.</p>
<p>Unfortunately, nobody had already created a context we could reuse. And as a lot of properties and classes are used in the Bibframe works dataset the context grew quite big and its creation took a lot of time and iterations. The result can be found <a href="https://github.com/hbz/swib18-workshop/blob/master/data/context.json">here</a>. It is not perfect but may be of help to others who want to do something similar with the Bibframe dataset.</p>
<p>So we used this JSON-LD context to create JSON-LD from the Bibframe N-Triples and indexed the result in Elastisearch. For some more information on how to create JSON-LD from N-Triples see Fabian’s <a href="http://fsteeg.com/notes/from-rdf-to-json-with-json-ld">blog post</a> about the first part of the workshop.</p>
<h2 id="querying-the-index--visualizing-with-kibana">Querying the index & visualizing with Kibana</h2>
<p>The index can be found here: <a href="http://es.labs.lobid.org/loc_works/_search">http://es.labs.lobid.org/loc_works/_search</a>. You get direct access to the index without a UI. You can use the Kibana instance running against that index as UI. Check it out at <a href="http://kibana.labs.lobid.org/">http://kibana.labs.lobid.org/</a>. There you can for example access the <a href="http://kibana.labs.lobid.org/app/kibana#/management/kibana/indices/AWcq7SBQx7AjQfXZ73pv">index pattern</a> which gives you an overview over all the fields you can query.</p>
<p>For querying the data, you can use the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-query-string-query.html#query-string-syntax">Elasticsearch Query String Syntax</a> which allows composing easy but also rather complex queries against the data. For setting up a Kibana visualization see the <a href="https://www.elastic.co/guide/en/kibana/5.6/createvis.html">Kibana documentation</a> or take a look at the <a href="http://kibana.labs.lobid.org/app/kibana#/visualize">example visualizations</a>.</p>
<p>Here are some examples which you can use to build your own queries and visualizations:</p>
<p><strong>Querying for “climate change”:</strong></p>
<p>All records containing the phrase “climate change” somewhere, listing the first 100 (using the <code class="language-plaintext highlighter-rouge">size</code> parameter) of a total 5124: <a href="http://es.labs.lobid.org/loc_works/_search?q=%22climate%20change%22&size=100">http://es.labs.lobid.org/loc_works/_search?q=%22climate%20change%22&size=100</a></p>
<p>If you want to know which subject headings are used in those records, look at the Kibana visualization showing the <a href="http://kibana.labs.lobid.org/goto/6f8434fca70236e694c189aab538aaf8">top 10 subject headings</a>:</p>
<p><img src="/images/20190131_bibframe-dataset/top-10-subjects-climate-change.png" alt="bar chart" /></p>
<p><strong>Query specific fields:</strong></p>
<p>Records with topic “Cat owners”: <a href="http://es.labs.lobid.org/loc_works/_search?q=subject.label:%22cat%20owners%22">http://es.labs.lobid.org/loc_works/_search?q=subject.label:%22cat%20owners%22</a></p>
<p>And here a <a href="http://kibana.labs.lobid.org/goto/36fc3fb32b0983053dcd7ea8bd226ff9">visualization comparing the number of record about “Cat owners” (green) with those about “Dog owners” (blue)</a>:</p>
<p><img src="/images/20190131_bibframe-dataset/dogs-vs-cats.png" alt="pie chart" style="width:200px !important;height:200px !important;" /></p>
<p><strong>Boolean operators:</strong></p>
<p>You can use boolean operators connecting two fields, e.g. querying for works about “Dog owners” (<code class="language-plaintext highlighter-rouge">subject.label</code>) in German (<code class="language-plaintext highlighter-rouge">language.id</code>): <a href="http://es.labs.lobid.org/loc_works/_search?q=subject.label:%22dog%20owners%22+AND+language.id:%22http://id.loc.gov/vocabulary/languages/ger%22">subject.label:”dog owners”+AND+language.id:”http://id.loc.gov/vocabulary/languages/ger”</a> (Fun fact: There are no titles about cat owners in German.)</p>
<p>You can also use boolean operators on the content of one field by using brackets, e.g. <code class="language-plaintext highlighter-rouge">subject.authoritativeLabel:(cat*+AND+psychology)</code> (<a href="http://es.labs.lobid.org/loc_works/_search?q=subject.authoritativeLabel:%28cat*+AND+psychology%29&size=100">query</a>)</p>
<p><strong>Range queries:</strong></p>
<p>All resources modified in 2017: <a href="http://es.labs.lobid.org/loc_works/_search?q=adminMetadata.changeDate:[2017-01-01+TO+2017-12-31]">adminMetadata.changeDate:[2017-01-01+TO+2017-12-31]</a></p>
<p>All resources created in 2017: <a href="http://es.labs.lobid.org/loc_works/_search?q=adminMetadata.creationDate:[2017-01-01+TO+2017-12-31]">adminMetadata.creationDate:[2017-01-01+TO+2017-12-31]</a></p>
<p>You can also use date fields for visualizations, e.g. <a href="http://kibana.labs.lobid.org/goto/49a8fee1a547f276673384d65e868939">record creation date by year</a> (What happened from 1981 to 1985?):</p>
<p><img src="/images/20190131_bibframe-dataset/timeline-creation-date.png" alt="timeline" /></p>
<p><strong>_exists_ queries:</strong></p>
<ul>
<li>A list of all records containing subject information: <a href="http://es.labs.lobid.org/loc_works/_search?q=_exists_:subject"><code class="language-plaintext highlighter-rouge">_exists_:subject</code></a></li>
<li>And here is a <a href="http://kibana.labs.lobid.org/goto/88cc6fabfc3c35076bd3450e6170b08d">visualization comparing the number of entries with subject information (green) to those without (blue)</a></li>
</ul>
<p><img src="/images/20190131_bibframe-dataset/subject-donut.png" alt="donut" style="width:200px !important;height:200px !important;" /></p>
<h2 id="using-kibana-and-adding-visualizations">Using Kibana and adding visualizations</h2>
<p>Feel free to play around with the index and Kibana. You can also <a href="http://kibana.labs.lobid.org/app/kibana#/visualize/new">create</a> other interesting visualizations. Just take a look at the examples as template.</p>
<h2 id="lessons-learned">Lessons Learned</h2>
<p>We have learned a lot creating the JSON-LD and indexing it. For <a href="https://github.com/hbz/swib18-workshop/issues/23#issuecomment-438217655">example</a>, the Kibana index pattern page is a good place to find problems in the creation of the compacted JSON-LD. Specifically, we would check for keys that still contain “http” to find out which properties are missing in the context document. As the index pattern page is itself based on the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html">GET mapping API</a>, this insight led us to use the mapping API to <a href="https://github.com/hbz/lobid-gnd/issues/171">create an automatic check</a> against the <a href="http://blog.lobid.org/tags/lobid-gnd">lobid-gnd</a> data for not compacted keys.</p>
<p>Another thing we have learned that it is probably better to create a JSON context by hand than creating it from the ontologies used in a dataset. The ontology approach will give you lots of things in the context that aren’t actually used in the data. (Anybody for creating a tool to automatically create a JSON-LD context based on an RDF dataset as input?)</p>
<h2 id="feedback-to-loc">Feedback to LoC</h2>
<p>Working with a dataset always reveals some things that are not correct or could be improved. We collected those in a <a href="https://github.com/hbz/swib18-workshop/issues/33">separate issue</a> to be submitted to the Library of Congress. Here is what we found while working on this:</p>
<ul>
<li>A canonical JSON-LD context for the dataset is missing.</li>
<li>The list of contributors from <code class="language-plaintext highlighter-rouge">bf:contribution</code> is not an ordered list, thus missing the contributor order from the actual resource.</li>
<li>Some properties are used in the dataset whose URIs do not resolve: <code class="language-plaintext highlighter-rouge">http://id.loc.gov/ontologies/bflc/consolidates</code>, <code class="language-plaintext highlighter-rouge">http://id.loc.gov/ontologies/bflc/relatorMatchKey</code>, <code class="language-plaintext highlighter-rouge">http://id.loc.gov/ontologies/bflc/procInfo</code>, <code class="language-plaintext highlighter-rouge">http://id.loc.gov/ontologies/bflc/profile</code></li>
<li>There are redundancies between classes in the <a href="http://www.loc.gov/mads/rdf/v1">MADS</a> and <a href="http://id.loc.gov/ontologies/bibframe/">Bibframe</a> vocabularies which both are used: <a href="http://id.loc.gov/ontologies/bibframe/GenreForm"><code class="language-plaintext highlighter-rouge">bf:GenreForm</code></a> and <a href="http://www.loc.gov/mads/rdf/v1#GenreForm"><code class="language-plaintext highlighter-rouge">mads:GenreForm</code></a>, <a href="http://id.loc.gov/ontologies/bibframe/Temporal"><code class="language-plaintext highlighter-rouge">bf:Temporal</code></a> and <a href="http://www.loc.gov/mads/rdf/v1#Temporal"><code class="language-plaintext highlighter-rouge">mads:Temporal</code></a>, <a href="http://id.loc.gov/ontologies/bibframe/Topic"><code class="language-plaintext highlighter-rouge">bf:Topic</code></a> and <a href="http://www.loc.gov/mads/rdf/v1#Topic"><code class="language-plaintext highlighter-rouge">mads:Topic</code></a></li>
<li>In the dataset, the wrong URI is used for <code class="language-plaintext highlighter-rouge">mads:isMemberOfMADSScheme</code> (instead o an upper case “O” lower case is used).</li>
<li>Instead of the correct <code class="language-plaintext highlighter-rouge">bf:instrumentalType</code> the following is used: <code class="language-plaintext highlighter-rouge">bf:instrumentType</code></li>
</ul>
Accessing ZDB via lobid-resources2018-09-04T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2018/09/04/zdb<p>A little bird told us that there is some interest in using lobid as interface to the data of the <em>Zeitschriftendatenbank</em> (ZDB) (Union Catalogue of Serials). <a href="http://www.zeitschriftendatenbank.de">ZDB</a> is the central bibliographic and holdings database for periodicals in Germany and Austria. It records holdings of nearly all German academic libraries and of many public libraries. Responsible for the technical aspects are the Berlin State Library and the German National Library (DNB). ZDB data is <a href="http://www.zeitschriftendatenbank.de/ueber-uns/datenlizenz/">licensed under CC0</a>.</p>
<p>Although a <a href="https://zdb-katalog.de">new search ZDB interface</a> for ZDB was recently launched, it does not offer a web API for easy access and use of the data by developers.</p>
<p>This is where lobid comes into play. <a href="https://lobid.org/resources">lobid-resources</a> provides a user interface and web API based on JSON-LD via HTTP for the union catalogue of the North Rhine-Westphalian Library Service Centre (hbz). The hbz union catalogue records approximately 20 Million cooperatively created bibliographic titles plus holding information from libraries in North Rhine-Westphalia and Rhineland-Palatinate. Besides that, the <a href="https://nwbib.de">North Rhine-Westphalian Bibliography (NWBib)</a> and – here comes the interesting part for this post – all periodicals from the German Union Catalogue of Serials (ZDB) are included.</p>
<p><strong>Note</strong>: <em>Although lobid-resources contains all title records from ZDB it does only contain the holdings information for hbz libraries, thus missing the holdings for libraries in other German federal states and Austria.</em></p>
<h2 id="the-lobid-zdb-data">The lobid ZDB data</h2>
<p>As said, the ZDB data is a subset of lobid-resources, generated from a <a href="http://lobid.org/download/dumps/DE-605/mabxml/">MAB/XML export of the hbz union catalogue</a> which is currently maintained with an Aleph system. For some background reading see <a href="http://blog.lobid.org/2017/06/08/lobid-api-why-how.html">this post</a> about lobid APIs and the JSON-LD behind it and <a href="http://blog.lobid.org/2017/04/19/vocabulary-choices.html">this post</a> about the vocabularies we chose for representing the bibliographic data in RDF. The <a href="http://lobid.org/resources/api">lobid-resources API documentation</a> contains more details but is currently only available in German.</p>
<p>There also exist RDF representations of ZDB titles offered directly by the ZDB, compare for example the journal <a href="http://ld.zdb-services.de/data/203461-x.ttl">“Erkenntnis” at the ZDB (Turtle)</a> and <a href="http://lobid.org/resources/HT001320263.json">in lobid</a>. RDF from the ZDB itself and from lobid differs in various aspects:</p>
<ul>
<li><strong>identifiers</strong>: URIs in lobid are built based on the hbz ID from the Aleph system while ZDB uses its specific IDs, look for example at the <code class="language-plaintext highlighter-rouge">predecessor</code>/<code class="language-plaintext highlighter-rouge">successor</code> resp. <code class="language-plaintext highlighter-rouge">rdau:P60261</code>/<code class="language-plaintext highlighter-rouge">rdau:P60278</code> triples. lobid contains the ZDB ID for each resource, though, with the key <code class="language-plaintext highlighter-rouge">zdbId</code>.</li>
<li><strong>modeling approaches</strong>: Alhough both ZDB and hbz/lobid learn from each other and often use the same approach and properties for expressing some information, they sometimes differ e.g. for representing publication date, place and publisher.</li>
<li><strong>information covered</strong>: You can find some information in lobid that you won’t find in the ZDB RDF (e.g. record creation/modification information, and the hbz holdings) and the other way round (e.g. RDA content, media, carrier).</li>
</ul>
<p>Anyway, if you are missing any information or notice bugs, we are happy to adjust, improve and add information in lobid as needed. Just let us know.</p>
<h2 id="accessing-zdb-via-lobid">Accessing ZDB via lobid</h2>
<h3 id="selecting-the-zdb-subset">Selecting the ZDB subset</h3>
<p>Every ZDB entry in lobid is marked as part of the ZDB “collection” like so:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"inCollection"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://lobid.org/resources/HT014846970#!"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Zeitschriftendatenbank (ZDB)"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Collection"</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Accordingly, you can limit searches to the subset of ZDB resources by adding this to the query string:</p>
<p><a href="http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014846970%23%21%22"><code class="language-plaintext highlighter-rouge">inCollection.id:"http://lobid.org/resources/HT014846970#!"</code></a></p>
<h3 id="querying-the-subset">Querying the subset</h3>
<p>As you can see, ZDB comprises around 1.9 Million entries. To explore the dataset, you can add to the query above as you like. For a start, you can explore the data by using the facets from the HTML view to filter by medium, publication type, publication date or subject heading.</p>
<p>Using the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-query-string-query.html#query-string-syntax">Elasticsearch Query String Syntax</a> you can compose quite complex queries against the data (see also our <a href="http://blog.lobid.org/2018/07/06/lobid-gnd-queries.html">post on building complex queries</a>, also in German). Some examples:</p>
<ul>
<li>Using an <code class="language-plaintext highlighter-rouge">_exists_</code> query to get all ZDB resources that have an ISSN: <a href="http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014846970%23%21%22+AND+_exists_%3Aissn"><code class="language-plaintext highlighter-rouge">inCollection.id:"http://lobid.org/resources/HT014846970#!" AND _exists_:issn</code></a></li>
<li>All ZDB resources published by Elsevier: <a href="http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014846970%23%21%22+AND+publication.publishedBy%3AElsevier"><code class="language-plaintext highlighter-rouge">inCollection.id:"http://lobid.org/resources/HT014846970#!" AND publication.publishedBy:Elsevier</code></a></li>
<li>All ZDB resources that have a DDC notation: <a href="http://lobid.org/resources/search?filter=inCollection.id:%22http%3A%2F%2Flobid.org%2Fresources%2FHT014846970%23%21%22&q=subject.source.id:%22https://d-nb.info/gnd/4149423-4%22"><code class="language-plaintext highlighter-rouge">subject.source.id:"https://d-nb.info/gnd/4149423-4"</code></a></li>
<li>Query for a concrete DDC notation is a bit more complex as we have notations from different classifications in the <code class="language-plaintext highlighter-rouge">subject</code> array and one has to specify the source classification alongside the actual notation by using the <code class="language-plaintext highlighter-rouge">nested</code> query parameter. For example if I want all the resources with notation <code class="language-plaintext highlighter-rouge">100</code> from the DDC, I have to add the following to the query: <a href="http://lobid.org/resources/search?filter=inCollection.id:%22http%3A%2F%2Flobid.org%2Fresources%2FHT014846970%23%21%22&nested=subject:subject.notation:100+AND+subject.source.id:%22https://d-nb.info/gnd/4149423-4%22"><code class="language-plaintext highlighter-rouge">&nested=subject:subject.notation:100+AND+subject.source.id:"https://d-nb.info/gnd/4149423-4"</code></a></li>
</ul>
<h3 id="bulk-downloads-and-post-processing">Bulk downloads and post processing</h3>
<p>You can use the API’s <a href="http://lobid.org/resources/api#content_types">bulk options</a> to download all the ZDB data or some subsets so you can run some scripts on them locally.</p>
<p>For example, download all ZDB resources with an ISSN and use <a href="https://stedolan.github.io/jq/">jq</a> to create a list of all ISSNs in ZDB:</p>
<p><code class="language-plaintext highlighter-rouge">$ curl -H "Accept: application/x-jsonlines" 'http://lobid.org/resources/search?q=inCollection.id%3A%22http%3A%2F%2Flobid.org%2Fresources%2FHT014846970%23%21%22+AND+_exists_%3Aissn' | jq -r .issn[] > zdb-issn.txt</code></p>
<p>(This will take some time, just took me nearly two minutes, you may speed it up by downloading gzipped data with <code class="language-plaintext highlighter-rouge">Accept-Encoding: gzip</code>.)</p>
<h2 id="let-us-know-if-you-need-help">Let us know if you need help</h2>
<p>This post does only cover examples and the other documentation is mostly in German. If you have further questions, contact us by annotating this post with hypothes.is, by mentioning <code class="language-plaintext highlighter-rouge">@lobidOrg</code> on Twitter or by writing an email.</p>
GND reconciliation for OpenRefine2018-08-27T00:00:00+00:00Fabian Steeg, Adrian Pohlhttp://blog.lobid.org/2018/08/27/openrefine<p>Our <a href="https://lobid.org/gnd">lobid-gnd</a> service provides access to the Integrated Authority File <a href="https://en.wikipedia.org/wiki/Integrated_Authority_File">GND</a>. The service contains integration into <a href="http://openrefine.org/">OpenRefine</a>, a powerful tool for working with messy data. This tutorial provides an overview of GND reconciliation for OpenRefine. The features used here require OpenRefine 2.8 or later.</p>
<p><em>Reconciliation</em> is the process of matching name strings to identifiers of entities in a database like an authority file, Wikidata etc. This is useful whenever you want to merge differing name strings for the same person in your data or when you want to fetch additional data from the target database you are reconciling against.</p>
<p>The first step in the reconciliation process is to create a project. OpenRefine can import data from various sources. For this tutorial, we’ll simply import data from the clipboard:</p>
<p><img src="/images/2018-08-27-openrefine/01-input.png" alt="1" /></p>
<p>Copy these lines and paste them in OpenRefine:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>name;beruf;ort
J. Weizenbaum;Informatiker;Berlin
Twain, Mark;Schriftsteller;
Kumar, Lalit;;
Jemand;;
</code></pre></div></div>
<p><img src="/images/2018-08-27-openrefine/02-data.png" alt="2" /></p>
<p>In the following preview screen you can take over the settings which were automatically detected and create the project:</p>
<p><img src="/images/2018-08-27-openrefine/03-create.png" alt="3" /></p>
<p>We now want to reconcile the text strings in the <code class="language-plaintext highlighter-rouge">name</code> column with GND entries:</p>
<p><img src="/images/2018-08-27-openrefine/04-reconcile.png" alt="4" /></p>
<p>We’ll have to add the GND reconciliation service:</p>
<p><img src="/images/2018-08-27-openrefine/05-add-service.png" alt="5" /></p>
<p>Paste <code class="language-plaintext highlighter-rouge">https://lobid.org/gnd/reconcile</code> as the service URL:</p>
<p><img src="/images/2018-08-27-openrefine/06-service-url.png" alt="6" /></p>
<p>Collapse the drawer on the left hand side by clicking the newly added service. As our list for reconciliation consists solely of personal names, we now select <code class="language-plaintext highlighter-rouge">DifferentiatedPerson</code> to reconcile only against GND entries of that type:</p>
<p><img src="/images/2018-08-27-openrefine/07-type.png" alt="7-1" /></p>
<p>Optionally, we could reconcile against a non-default type by typing into the “Reconcile against type” field and selecting one of the suggested types, e.g. <code class="language-plaintext highlighter-rouge">Person</code>:</p>
<p><img src="/images/2018-08-27-openrefine/07-type-custom.png" alt="7-2" /></p>
<p>It can make sense to pass additional data from other columns to improve the reconciliation results. Type in the text fields for each column, and select one of the suggested properties. E.g. use the data from the <code class="language-plaintext highlighter-rouge">beruf</code> column to search in the <code class="language-plaintext highlighter-rouge">professionOrOccupationAsLiteral</code> field in the GND:</p>
<p><img src="/images/2018-08-27-openrefine/08-other.png" alt="8" /></p>
<p>After reconciliation, we can inspect candidates that have not been automatically matched by clicking or hovering over (depending on your OpenRefine version) their name:</p>
<p><img src="/images/2018-08-27-openrefine/09-candidate.png" alt="9" /></p>
<p>This brings up a preview, with the option to match them:</p>
<p><img src="/images/2018-08-27-openrefine/10-preview.png" alt="10" /></p>
<p>Alternatively, we can search for a match by clicking “Search for match”. This brings up a dialog with a text field prefilled with the cell value. Select one of the suggestions to match the cell:</p>
<p><img src="/images/2018-08-27-openrefine/10-search.png" alt="10" /></p>
<p>After matching, we can enrich our data with the reconciled data. We want to add columns based on the reconciled values:</p>
<p><img src="/images/2018-08-27-openrefine/11-add-columns.png" alt="11" /></p>
<p>We can now select the properties we want to add (using the search field and picking one of the suggestions for what we typed, or from the the prefilled list below the search field) and preview them. Here, we choose <code class="language-plaintext highlighter-rouge">Beruf oder Beschäftigung</code>, <code class="language-plaintext highlighter-rouge">Geburtsort</code>, <code class="language-plaintext highlighter-rouge">Sterbeort</code>, and <code class="language-plaintext highlighter-rouge">Ländercode</code>:</p>
<p><img src="/images/2018-08-27-openrefine/12-add-preview.png" alt="12" /></p>
<p>The first three properties are GND entries themselves, so they are recognized as reconciled items (they are links in the preview).</p>
<p>For non-reconciled items that have a label and an ID in lobid-gnd (such as <code class="language-plaintext highlighter-rouge">Ländercode</code>), we can configure the content we want (label or ID) using the <code class="language-plaintext highlighter-rouge">configure</code> link for that property:</p>
<p><img src="/images/2018-08-27-openrefine/13-configure.png" alt="13" /></p>
<p>Note also the <code class="language-plaintext highlighter-rouge">limit</code> setting, which works for all properties and limits the number of values added for each entry (0 is the default, meaning no limit).</p>
<p>After confirming the preview (removing the old columns <code class="language-plaintext highlighter-rouge">beruf</code> and <code class="language-plaintext highlighter-rouge">ort</code>, cutting off the non-reconciled item using the facet on the left hand side), we have the enriched table with new data:</p>
<p><img src="/images/2018-08-27-openrefine/14-table.png" alt="14" /></p>
<p>We can now use the new reconciled items (like <code class="language-plaintext highlighter-rouge">Berlin</code> in the <code class="language-plaintext highlighter-rouge">Sterbeort</code> column here) to add more columns based on <em>their</em> properties (i.e. properties of <code class="language-plaintext highlighter-rouge">Berlin</code>, not <code class="language-plaintext highlighter-rouge">Weizenbaum, Joseph</code>):</p>
<p><img src="/images/2018-08-27-openrefine/15-extend.png" alt="15" /></p>
<p>As an example, we add a link to a depiction of the <code class="language-plaintext highlighter-rouge">Sterbeort</code>:</p>
<p><img src="/images/2018-08-27-openrefine/16-extend-preview.png" alt="16" /></p>
<p>Finally, we can export our data in various supported formats:</p>
<p><img src="/images/2018-08-27-openrefine/17-export.png" alt="17" /></p>
<p>This concludes our overview of GND reconciliation in OpenRefine. For further information check out the OpenRefine <a href="http://openrefine.org/documentation.html">general documentation</a> and the <a href="https://github.com/OpenRefine/OpenRefine/wiki/Reconciliation">reconciliation wiki page</a>.</p>
RSS für den hbz-Verbundkatalog2018-08-15T00:00:00+00:00Fabian Steeghttp://blog.lobid.org/2018/08/15/rss<p>RSS ist <a href="https://ar.al/2018/06/29/reclaiming-rss/">ein etablierter Standard</a>, um <a href="https://mg.guelker.eu/saverss/">Inhalte im Web zu abonnieren</a>. In <a href="https://www.hughrundle.net/2018/03/25/watching-the-feeds/">Bezug auf Bibliothekskataloge</a> ist RSS besonders nützlich, da meist beliebige Suchanfragen abonniert werden können und man so spezifische Teilbereiche der Kataloge verfolgen kann. Daher haben wir in <a href="https://lobid.org/resources">lobid-resources, unserem Dienst zur Bereitstellung des hbz-Verbundkatalogs im Web</a>, RSS-Unterstützung umgesetzt.</p>
<p>RSS kann innerhalb unterschiedlicher Anwendungen verwendet werden. Wir verwenden hier als Beispiel die Open-Source-Software <a href="https://www.thunderbird.net">Thunderbird</a>, die vor allem als Email-Client bekannt ist. Vergleichbare RSS-Unterstützung hat etwa auch das Microsoft-Produkt <a href="https://www.howtogeek.com/164325/how-to-add-rss-feeds-to-outlook-2013/">Outlook</a>. Daneben gibt es viele weitere RSS-Anwendungen (Feed-Reader), darunter den Web-Dienst <a href="http://feedly.com">feedly.com</a>.</p>
<p>In Thunderbird richten wir zunächst einen Feed-Account ein:</p>
<p><img src="/images/2018-08-15-rss/1-feed-account.png" alt="1" /></p>
<p>Im Folgenden kann ein Name für den Account gewählt werden. Wir wollen hier mehrere Anfragen an der hbz-Verbundkatalog bündeln und nennen den Account entsprechend. Im nächsten Schritt fügen wir ein Feed-Abonnement hinzu:</p>
<p><img src="/images/2018-08-15-rss/2-manage-subscriptions.png" alt="2" /></p>
<p>Im Folgenden geben wir die URL des Feeds an:</p>
<p><img src="/images/2018-08-15-rss/3-add-url.png" alt="3" /></p>
<p>Die URL, die wir hier angeben, entspricht der <a href="http://lobid.org/resources/search?q=K%C3%B6ln+AND+Ehrenfeld">URL einer Suchanfrage in lobid-resources</a>. Für eine beliebige Suchanfrage können Sie die URL aus der Adressleiste kopieren oder (falls Ihr Feed-Reader die URL nicht akzeptiert), die explizite URL hinter dem RSS-Icon oben links über der Trefferliste:</p>
<p><img src="/images/2018-08-15-rss/4-url.png" alt="4" /></p>
<p>Für eine übersichtlichere Darstellung des Abonnements in Thunderbird können Sie den angezeigten Namen des Feeds über sein Kontextmenü ändern:</p>
<p><img src="/images/2018-08-15-rss/5-rename.png" alt="5" /></p>
<p>Die einzelnen Einträge enthalten die kompletten Titeldetails und können so vollständig in Ihrem Feed-Reader angezeigt werden:</p>
<p><img src="/images/2018-08-15-rss/6-details.png" alt="6" /></p>
<p>Die Tatsache, dass beliebige Suchen abonniert werden können ergibt ein äußerst vielseitiges Werkzeug. Unsere <a href="http://blog.lobid.org/2018/07/06/lobid-gnd-queries.html">Anleitung zur Formulierung komplexer Anfragen</a> in lobid-gnd ist auch auf lobid-resources anwendbar. So können etwa über <a href="http://lobid.org/resources/search?subject=https%3A%2F%2Fd-nb.info%2Fgnd%2F4031483-2">Schlagwortsuchen</a> Publikationen zu einem bestimmten Thema abonniert werden. Über die <a href="http://lobid.org/resources/search?owner=http%3A%2F%2Flobid.org%2Forganisations%2FDE-38">Bestandssuche</a> können Neuerscheinungen in einer bestimmten Bibliothek abonniert werden, über die <a href="http://lobid.org/resources/search?agent=https%3A%2F%2Fd-nb.info%2Fgnd%2F115370080">Mitwirkendensuche</a> Publikationen bestimmter Autor*innen.</p>
<p>Auch für Beschäftigte in Verbundbibliotheken kann die Funktion hilfreich sein. Um etwa automatisch über Probleme im Katalog unterrichtet zu werden, können zum Beispiel <a href="http://lobid.org/resources/search?q=NOT+_exists_%3Atitle">Suchen</a> formuliert werden, die keine (neuen) Treffer ergeben sollten.</p>
Shutdown der alten lobid-APIs2018-07-19T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2018/07/19/lobid-1-shutdown<p>Mit lobid-organisations and lobid-resources gingen <a href="http://blog.lobid.org/2017/07/04/lobid-launch.html">vor etwa einem Jahr</a> die ersten beiden lobid-Dienste in der neuen Version in Produktion. lobid-gnd machte <a href="http://blog.lobid.org/2018/07/11/lobid-gnd-launch.html">letzte Woche</a> das Tripel komplett, so dass wir hiermit die Abschaltung der <a href="http://lobid.org/api">alten Dienste</a> ankündigen:</p>
<p><strong>Am 31. Oktober 2018 werden alle lobid-1.x-APIs abgeschaltet. Wir empfehlen allen API-Nutzer*innen einen Umstieg auf die neuen, verbesserten Angebote.</strong></p>
<p>Soweit möglich werden wir mit der Abschaltung Anfragen an den alten Dienst auf die neue Version umleiten.</p>
<p>Bei Fragen oder Problemen beim Umstieg helfen wir gerne weiter, <a href="https://lobid.org/team">kontaktieren Sie das lobid-Team</a>.</p>
Offizieller Launch von lobid-gnd2018-07-11T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2018/07/11/lobid-gnd-launch<p>Wir freuen uns, offiziell den Launch von <a href="https://lobid.org/gnd">lobid-gnd</a> verkünden zu können. Heute ist der Dienst zur Bereitstellung der Gemeinsamen Normdatei in Produktion gegangen.</p>
<p><a href="https://lobid.org/gnd"><img src="/images/20180711_screenshot.png" alt="Screenshot" title="lobid-gnd screenshot" /></a></p>
<p>Zur Dokumentation von lobid-gnd haben wir in den letzten Monaten <a href="http://blog.lobid.org/tags/lobid-gnd">einige Blogbeiträge</a> veröffentlicht. Bei Fragen oder Problemen helfen wir gerne weiter, <a href="https://lobid.org/team">kontaktieren Sie das lobid-Team</a>.</p>
lobid-gnd: Formulierung komplexer Suchanfragen2018-07-06T00:00:00+00:00Adrian Pohl, Fabian Steeghttp://blog.lobid.org/2018/07/06/lobid-gnd-queries<p>Im <a href="http://blog.lobid.org/2018/07/04/lobid-gnd-suche.html">vorherigen Beitrag</a> haben wir bereits die Oberfläche von <a href="https://lobid.org/gnd">lobid-gnd</a> und ihre Funktionen beschrieben. Die API ermöglicht aber auch komplexere Abfragen, für die man sich ein wenig mit den zugrundeliegenden Datenstrukturen vertraut machen muss. Dies soll in diesem Beitrag an einigen Beispielen ausgeführt werden.</p>
<h2 id="query-grundlagen">Query-Grundlagen</h2>
<p>Bevor wir die Suchmöglichkeiten an einigen Beispielen illustrieren, werden zunächst einige generelle Informationen zur Suche geliefert.</p>
<h3 id="eingabe">Eingabe</h3>
<p>Alle Abfragen können über das Suchfeld auf der lobid-gnd-Seite eingegeben werden:</p>
<p><img src="/images/2018-07-06-lobid-gnd-queries/enter-complex-query.png" alt="Screenshot" title="Query in Eingabefenster" /></p>
<p>Die Queries auch direkt als Teil der URL angegeben und im Browser geöffnet werden:</p>
<p><a href="http://lobid.org/gnd/search?q=Dom+K%C3%B6ln">http://lobid.org/gnd/search?q=Dom+Köln</a></p>
<p>Oder auf der Kommandozeile via curl:</p>
<p><small><code class="language-plaintext highlighter-rouge">$ curl "http://lobid.org/gnd/search?q=Dom+K%C3%B6ln"</code></small></p>
<h3 id="default-sucheinstellungen--boolesche-operatoren">Default-Sucheinstellungen & boolesche Operatoren</h3>
<p>Standardmäßig geht eine im Suchfenster angestoßene Suche über alle Felder. Mehrere Suchterme werden dabei per default mit einem booleschen <code class="language-plaintext highlighter-rouge">AND</code> verknüpft. Boolesche Operatoren lassen sich aber auch passgenau für den jeweiligen Zweck angeben. Beispiele:</p>
<ul>
<li><a href="http://lobid.org/gnd/search?q=Dom+AND+(Aachen OR Köln)">Dom UND (Aachen ODER Köln)</a></li>
<li><a href="http://lobid.org/gnd/search?q=type%3APlaceOrGeographicName+AND+geographicAreaCode.id%3A%28%22https%3A%2F%2Fd-nb.info%2Fstandards%2Fvocab%2Fgnd%2Fgeographic-area-code%23XC-ET%22+OR+%22https%3A%2F%2Fd-nb.info%2Fstandards%2Fvocab%2Fgnd%2Fgeographic-area-code%23XC-ER%22%29">Geographika in (Äthiopien ODER Eritrea)</a></li>
</ul>
<h3 id="anzeige-der-json-daten">Anzeige der JSON-Daten</h3>
<p>In den folgenden Beispielen wird immer wieder auf die strukturierten Daten im Format JSON-LD Bezug genommen, die es für jeden Eintrag in lobid-gnd gibt. Anzeigen lassen sich diese wie folgt:</p>
<ol>
<li>Mit Klick auf das JSON-LD-Zeichen in einer Detailansicht:
<a href="http://lobid.org/gnd/11850391X"><img src="/images/2018-07-06-lobid-gnd-queries/focus-json-ld.png" alt="Screenshot" title="Hinweis auf Link zum JSON-LD" /></a></li>
<li>Durch Anhängen von <code class="language-plaintext highlighter-rouge">.json</code> an die URL eines Einzeltreffers, z.B. <a href="http://lobid.org/gnd/11850391X">http://lobid.org/gnd/11850391X.json</a></li>
<li>Der Vollständigkeit halber: <strong>Bei Suchanfragen</strong> muss der Parameter <code class="language-plaintext highlighter-rouge">format=json</code> angehängt werden, um die gesamte Ergebnisliste als JSON-LD anzuzeigen, z.B. <a href="http://lobid.org/gnd/search?q=hannah+arendt&format=json">http://lobid.org/gnd/search?q=hannah+arendt&format=json</a>. (Alternativ können auch mit dem Parameter <code class="language-plaintext highlighter-rouge">format=jsonl</code> JSON Lines ausgegeben werden, d.h. pro Zeile ein Eintrag als JSON, z.B. <a href="http://lobid.org/gnd/search?q=hannah+arendt&format=jsonl">http://lobid.org/gnd/search?q=hannah+arendt&format=jsonl</a>).</li>
</ol>
<p>Die Bedeutung eines Feldes lässt sich im <a href="https://json-ld.org/spec/latest/json-ld/#the-context">JSON-LD-Kontext</a> unter <a href="http://lobid.org/gnd/context.jsonld">http://lobid.org/gnd/context.jsonld</a> nachschlagen. Will ich beispielsweise wissen, wie das Feld <code class="language-plaintext highlighter-rouge">broaderTermPartitive</code> verwendet wird, dann suche ich im JSON-LD-Kontext nach diesem Feld und folge dem angegebenen Link zur Beschreibung der zugrundeliegenden RDF-Property, hier ist dies die Beschreibung von <a href="https://d-nb.info/standards/elementset/gnd#broaderTermPartitive">“Oberbegriff partitiv”</a> in der GND-Ontologie.</p>
<h3 id="feldsuchen">Feldsuchen</h3>
<p>Über die <code class="language-plaintext highlighter-rouge"><Feld>:<Suchbegriff></code>-Syntax kann in spezifischen Feldern gesucht werden, z.B. nach einer bestimmten Ansetzungsform:</p>
<p><img src="/images/2018-07-06-lobid-gnd-queries/field-search.png" alt="Screenshot" title="Feldsuche in Eingabefenster" /></p>
<p><a href="http://lobid.org/gnd/search?q=preferredName:%22Dom+K%C3%B6ln%22">http://lobid.org/gnd/search?q=preferredName:”Dom+Köln”</a></p>
<p>Will ich ein Feld abfragen, das sich nicht auf der obersten Ebene der geschachtelten JSON-Daten befindet, muss ich es über den Pfad identifizieren, das heißt ich gebe die Felder an, in denen das Feld eingebettet ist. Beispielsweise <code class="language-plaintext highlighter-rouge">professionOrOccupation.label</code> in folgenden Daten:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"professionOrOccupation"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://d-nb.info/gnd/4124099-6"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Sänger"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>So kann ich etwa nach <a href="http://lobid.org/gnd/search?q=professionOrOccupation.label:Sänger*"><code class="language-plaintext highlighter-rouge">professionOrOccupation.label:Sänger*</code></a> suchen, wenn ich sowohl männliche wie auch weibliche Vokalist*innen finden möchte.</p>
<h2 id="beispiele">Beispiele</h2>
<h3 id="_exists_-abfragen"><code class="language-plaintext highlighter-rouge">_exists_</code>-Abfragen</h3>
<p>Häufig ist es hilfreich herauszufinden, wie viele und welche Einträge überhaupt eine bestimmte Information beinhalten bzw. in wie vielen Einträgen ein bestimmtes Feld fehlt. Dafür kann eine Anfrage in der Form <code class="language-plaintext highlighter-rouge">_exists_:<Feldname></code> verwendet werden, optional mit dem booleschen <code class="language-plaintext highlighter-rouge">NOT</code>, um alle Einträge zu bekommen, die das jeweilige <em>nicht</em> haben, z.B. geschlechtslose Geister:</p>
<p><a href="http://lobid.org/gnd/search?q=type%3ASpirits+AND+NOT+_exists_%3Agender"><code class="language-plaintext highlighter-rouge">http://lobid.org/gnd/search?q=type:Spirits+AND+NOT+_exists_:gender</code></a></p>
<h3 id="einträge-mit-angabe-eines-architekten">Einträge mit Angabe eines Architekten</h3>
<p>Beim Betrachten etwa des Eintrags zum <a href="http://lobid.org/gnd/1065252633">Friedenspark Köln</a> fällt auf, dass ein Architekt angegeben ist. Bei Interesse daran, welche Einträge noch Architekt*innen angeben, lässt sich das wie folgt herausfinden.</p>
<p>Ich schaue zunächst im JSON nach, wie das entsprechende Feld heißt:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/1065252633"</span><span class="p">,</span><span class="w">
</span><span class="nl">"architect"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/118530232"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Encke, Fritz"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Dann schreibe ich die entsprechende <code class="language-plaintext highlighter-rouge">_exists</code>-<a href="http://lobid.org/gnd/search?q=_exists_:architect">Anfrage</a>:
<img src="/images/2018-07-06-lobid-gnd-queries/architect-query.png" alt="Screenshot" title="architect-Sucheingabe" /></p>
<p>Unterfelder werden wie beschrieben über eine Punkt-Notation angegeben, z.B. Architekten mit dem label “Fritz”:
<a href="http://lobid.org/gnd/search?q=architect.label:Fritz"><code class="language-plaintext highlighter-rouge">architect.label:Fritz</code></a></p>
<h3 id="gleichzeitige-suche-in-ansetzungs--und-verweisungsformen">Gleichzeitige Suche in Ansetzungs- und Verweisungsformen</h3>
<p>Aus einer E-Mail-Anfrage an das lobid-Team:</p>
<blockquote>
<p>Noch eine Frage habe ich zur API. Kann ich die Suche nach Namen so einschränken, dass ich nach exakten Matches in den <code class="language-plaintext highlighter-rouge">variantName</code> oder <code class="language-plaintext highlighter-rouge">preferredName</code> suchen kann?</p>
</blockquote>
<p>Das geht über eine Kombination von booleschem OR und Phrasensuche mit <code class="language-plaintext highlighter-rouge">"<Phrase>"</code> in den entsprechenden Feldern:</p>
<p><a href="http://lobid.org/gnd/search?q=preferredName%3A%22Muka%2C+Arno%C5%A1t%22+OR+variantName%3A%22Muka%2C+Arno%C5%A1t%22"><code class="language-plaintext highlighter-rouge">preferredName:"Muka, Arnošt" OR variantName:"Muka, Arnošt"</code></a></p>
<h3 id="suche-nach-einträgen-mit-wikidata-link-aber-ohne-bild">Suche nach Einträgen mit Wikidata-Link aber ohne Bild</h3>
<p>Im Kontext der Anzeige eines zufälligen Bildes auf der <a href="https://lobid.org/gnd">lobid-gnd-Startseite</a> kam die Frage auf, wie viele und welche Einträge einen Wikidata-Link aber kein Bild haben. Dafür schaue ich mir zunächst am besten die Daten eines Eintrags an der beides hat, z.B. <a href="http://lobid.org/gnd/11850391X.json">Hannah Arendt</a>. Hier die für uns wichtigen Ausschnitte:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/11850391X"</span><span class="p">,</span><span class="w">
</span><span class="nl">"depiction"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://commons.wikimedia.org/wiki/Special:FilePath/Hannah_arendt-150x150.jpg"</span><span class="p">,</span><span class="w">
</span><span class="nl">"url"</span><span class="p">:</span><span class="s2">"https://commons.wikimedia.org/wiki/File:Hannah_arendt-150x150.jpg?uselang=de"</span><span class="p">,</span><span class="w">
</span><span class="nl">"thumbnail"</span><span class="p">:</span><span class="s2">"https://commons.wikimedia.org/wiki/Special:FilePath/Hannah_arendt-150x150.jpg?width=270"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"sameAs"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"collection"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"abbr"</span><span class="p">:</span><span class="s2">"WIKIDATA"</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="s2">"Wikidata"</span><span class="p">,</span><span class="w">
</span><span class="nl">"publisher"</span><span class="p">:</span><span class="s2">"Wikimedia Foundation Inc."</span><span class="p">,</span><span class="w">
</span><span class="nl">"icon"</span><span class="p">:</span><span class="s2">"https://www.wikidata.org/static/favicon/wikidata.ico"</span><span class="p">,</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://www.wikidata.org/entity/Q2013"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://www.wikidata.org/entity/Q60025"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Die Verlinkung zu Wikidata findet sich innerhalb eines Objekts im <code class="language-plaintext highlighter-rouge">sameAs</code>-Array. Gekennzeichnet als Wikidata-Verlinkung ist sie durch die angegebene Sammlung (<code class="language-plaintext highlighter-rouge">collection</code>). Will ich also meine Suche auf Einträge einschränken, die einen Link zu Wikidata haben muss ich nach Einträgen mit der ID <code class="language-plaintext highlighter-rouge">http://www.wikidata.org/entity/Q2013</code> im Feld <code class="language-plaintext highlighter-rouge">sameAs.collection.id</code> suchen:</p>
<p><a href="http://lobid.org/gnd/search?q=sameAs.collection.id:%22http://www.wikidata.org/entity/Q2013%22"><code class="language-plaintext highlighter-rouge">sameAs.collection.id:"http://www.wikidata.org/entity/Q2013"</code></a></p>
<p><strong>Hinweis</strong>: Damit die Suche funktioniert muss die Wikidata-URI (<code class="language-plaintext highlighter-rouge">http://www.wikidata.org/entity/Q2013</code>) in Anführungszeichen gesetzt werden (exakte Phrasensuche).</p>
<p>Wir wollen aber nicht alle Einträge mit Wikidata-Link, sondern nur jene <em>ohne Bild</em>. Das heißt wir müssen die Bedingung ergänzen, dass das Feld <code class="language-plaintext highlighter-rouge">depiction</code> nicht vorhanden ist. Hier kommt uns die oben eingeführte <code class="language-plaintext highlighter-rouge">_exist_</code>-Anfrage zur Hilfe. Konkret müssen wir zur Suchanfrage <code class="language-plaintext highlighter-rouge">AND NOT _exists_:depiction</code> ergänzen, so dass am Ende dabei rauskommt:</p>
<p><a href="http://lobid.org/gnd/search?q=sameAs.collection.id:"http://www.wikidata.org/entity/Q2013"+AND+NOT+_exists_:depiction"><code class="language-plaintext highlighter-rouge">sameAs.collection.id:"http://www.wikidata.org/entity/Q2013" AND NOT _exists_:depiction</code></a></p>
<h3 id="personen-die-während-der-ns-zeit-in-köln-geboren-wurden">Personen, die während der NS-Zeit in Köln geboren wurden</h3>
<p>Wenn ich eine Frage beantworten möchte wie “Welche Personen in der GND wurden in der NS-Zeit in Köln geboren?”, dann ist es sinnvoll, sich einen Eintrag zu suchen, der die nötigen Informationen zur Beantwortung einer solchen Frage besitzt. Hier z.B. die strukturierten Daten zum Eintrag von <a href="http://lobid.org/gnd/11850066X.json">Konrad Adenauer</a>, der folgende Informationen zu Geburtsort und -datum enthält:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/11850066X"</span><span class="p">,</span><span class="w">
</span><span class="nl">"placeOfBirth"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/4031483-2"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Köln"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"dateOfBirth"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"1876-01-05"</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Den ersten Schritt – die Eingrenzung auf in Köln geborene Personen – können wir auf einfache Weise über die Benutzeroberfläche für den Eintrag von <a href="http://lobid.org/gnd/11850066X">Konrad Adenauer</a> vollziehen: Mit einem Klick auf die Lupe neben “Geburtsort Köln” wird eine Abfrage nach allen in Köln geborenen Menschen in der GND gestartet.</p>
<p><img src="/images/2018-07-06-lobid-gnd-queries/lupe-klick.png" alt="Screenshot" title="Suche per Lupe" /></p>
<p>Jetzt müssen wir die vorhandene Abfrage (<a href="http://lobid.org/gnd/search?q=placeOfBirth.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4031483-2%22&format=html"><code class="language-plaintext highlighter-rouge">placeOfBirth.id:"https://d-nb.info/gnd/4031483-2"</code></a>) noch um eine Einschränkung des Geburtsdatums ergänzen. Hier können wir eine <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-query-string-query.html#_ranges">range query</a> verwenden, die Zeitrahmen mit verschiedenen Detailgraden (Jahr, Monat, Tag etc.) ermöglicht. Für unseren Fall probieren wir zunächst die tagesgenaue Eingrenzung mit <code class="language-plaintext highlighter-rouge">dateOfBirth:[1933-01-30 TO 1945-05-08]</code>:</p>
<p><a href="http://lobid.org/gnd/search?q=placeOfBirth.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4031483-2%22+AND+dateOfBirth%3A%5B1933-01-30+TO+1945-05-08%5D"><code class="language-plaintext highlighter-rouge">placeOfBirth.id:"https://d-nb.info/gnd/4031483-2" AND dateOfBirth:[1933-01-30 TO 1945-05-08]</code></a></p>
<p>Ebenfalls möglich ist eine jahresgenaue Abfrage (enthält hier auch Geburtsdaten im Jahr 1933 vor dem 30.1. und im Jahr 1945 nach dem 8.5.):</p>
<p><a href="http://lobid.org/gnd/search?q=placeOfBirth.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4031483-2%22+AND+dateOfBirth%3A%5B1933+TO+1945%5D"><code class="language-plaintext highlighter-rouge">placeOfBirth.id:"https://d-nb.info/gnd/4031483-2" AND dateOfBirth:[1933 TO 1945]</code></a></p>
<p>Je nach Zweck kann die eine oder andere Abfrage sinnvoller sein.</p>
<h3 id="vollständige-query-syntax">Vollständige Query-Syntax</h3>
<p>lobid-gnd ist auf Basis von <a href="https://de.wikipedia.org/wiki/Elasticsearch">Elasticsearch</a> umgesetzt. Wir verweisen hier auf die vollständige Dokumentation der <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-query-string-query.html#query-string-syntax">Elasticsearch Query String Syntax</a> sowie der <a href="https://lucene.apache.org/core/2_9_4/queryparsersyntax.html">Apache Lucene Query Syntax</a>. (Elasticsearch basiert auf <a href="https://de.wikipedia.org/wiki/Apache_Lucene">Apache Lucene</a>.)</p>
lobid-gnd: Suche und Navigation2018-07-04T00:00:00+00:00Fabian Steeg, Adrian Pohlhttp://blog.lobid.org/2018/07/04/lobid-gnd-suche<p>Dieser Artikel bietet einen Überblick zur Suche und Navigation in <a href="http://lobid.org/gnd">lobid-gnd</a>. Die Startseite von lobid-gnd führt auf die einfache Suchoberfläche:</p>
<p><img src="/images/lobid-gnd-suche/1-1-suchen.png" alt="http://lobid.org/gnd" /></p>
<p>Nach der Eingabe im Suchfeld kann einer der Vorschläge direkt ausgewählt werden, um zur Detailansicht zu gelangen:</p>
<p><img src="/images/lobid-gnd-suche/1-2-vorschlag-auswahl.png" alt="http://lobid.org/gnd" /></p>
<p>Alternativ kann eine Suche über die Enter-Taste oder das Lupen-Icon ausgeführt werden:</p>
<p><img src="/images/lobid-gnd-suche/1-3-vorschlag-suche.png" alt="http://lobid.org/gnd" /></p>
<p>Als alternativer Einstieg kann die gesamte GND erkundet werden:</p>
<p><img src="/images/lobid-gnd-suche/2-erkunden.png" alt="http://lobid.org/gnd/search" /></p>
<p>Über beide Wege kommt man zur Trefferliste. Über den Treffern auf der linken Seite kann die Anzahl der Treffer pro Seite gewählt werden, darunter kann zwischen den Seiten gewechselt werden:</p>
<p><img src="/images/lobid-gnd-suche/3-1-liste-paginierung.png" alt="http://lobid.org/gnd/search" /></p>
<p>Auf der rechten Seite ermöglicht eine facettierte Suche nach Entitätstyp, GND-Sachgruppe, Ländercode und Beruf oder Beschäftigung eine Eingrenzung der Ergebnisse:</p>
<p><img src="/images/lobid-gnd-suche/3-2-liste-facetten.png" alt="http://lobid.org/gnd/search" /></p>
<p>Als Standard werden in jeder Facette die fünf häufigsten Einträge angezeigt, weitere Einträge lassen sich ein- und ausblenden:</p>
<p><img src="/images/lobid-gnd-suche/4-facetten-einblenden.png" alt="http://lobid.org/gnd/search" /></p>
<p>Entitätstypen sind in Untertypen differenziert:</p>
<p><img src="/images/lobid-gnd-suche/5-facetten-untertypen.png" alt="http://lobid.org/gnd/search" /></p>
<p>Über die Auswahl unterschiedlicher Facetten lässt sich die Treffermenge präzise eingrenzen, z.B. zur Anzeige <a href="http://lobid.org/gnd/search?filter=%2B(type%3ANaturalGeographicUnit)+%2B(gndSubjectCategory.id%3A%22https%3A%2F%2Fd-nb.info%2Fstandards%2Fvocab%2Fgnd%2Fgnd-sc%2319.3%22)+%2B(geographicAreaCode.id%3A%22https%3A%2F%2Fd-nb.info%2Fstandards%2Fvocab%2Fgnd%2Fgeographic-area-code%23XA-DE-NW%22)">aller hydrologischen Geografika in Nordrhein-Westfalen</a>:</p>
<p><img src="/images/lobid-gnd-suche/6-1-facetten-filter.png" alt="http://lobid.org/gnd/search" /></p>
<p>Erweiterte Suchmöglichkeiten ergeben sich aus einer Kombination von Sucheinstieg über das Suchfeld und facettierter Suche sowie über Mehrfachauswahl innerhalb einer Facette:</p>
<p><img src="/images/lobid-gnd-suche/6-2-facetten-filter.png" alt="http://lobid.org/gnd/search" /></p>
<p>Der Klick auf einen Suchtreffer führt zu einer Detailansicht. Die Detailseiten enthalten Links zu verknüpften GND-Einträgen. Über die Lupen-Icons kann eine Suche nach Einträgen mit der gleichen Beziehung angestoßen werden, z.B. <a href="https://lobid.org/gnd/search?q=broaderTermPartitive.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4042579-4%22&size=50&format=html">alle Teile der Nordsee</a>:</p>
<p><img src="/images/lobid-gnd-suche/7-1-details-lupe.png" alt="http://lobid.org/gnd/4393546-1" /></p>
<p>Die visuelle Darstellung im Tab “Beziehungen” erlaubt ebenso eine Navigation zu den verknüpften Entitäten per Klick auf einen Knoten des Graphs und eine Suche nach weiteren Einträgen mit der gleichen Beziehung per Klick auf eine Kante:</p>
<p><img src="/images/lobid-gnd-suche/7-2-details-kante.png" alt="http://lobid.org/gnd/4393546-1" /></p>
lobid-gnd-Neuigkeiten: Bulk Downloads, OpenRefine-API und mehr2018-07-02T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2018/07/02/lobid-update<p>Letzte Woche haben wir einige Funktionen zu lobid-gnd ergänzt, hier ein Überblick.</p>
<h2 id="zufälliges-bild-auf-der-startseite">Zufälliges Bild auf der Startseite</h2>
<p>Wie auch in <a href="https://lobid.org/organisations">lobid-organisations</a> wird nun auf der <a href="https://lobid.org/gnd">lobid-gnd-Startseite</a> mit jedem Laden ein zufälliges Bild zu einer GND-Ressource angezeigt. Momentan gibt es <a href="http://lobid.org/gnd/search?q=_exists_%3Adepiction">knapp 200.000 Einträge mit Bild</a>, davon sind die meisten Personen. Wer also Lust hat, die GND ein wenig näher kennenzulernen, kann ja mal die Startseite ein paar Mal neu laden.</p>
<p><a href="https://lobid.org/gnd"><img src="/images/sendler.png" alt="Screenshot" title="lobid-gnd homepage" /></a>
<small>Screenshot der lobid-gnd-Startseite mit dem Bild von <a href="http://lobid.org/gnd/129335290">Irena Sendler</a></small></p>
<h2 id="bulk-downloads">Bulk Downloads</h2>
<p>Für jede lobid-gnd-Abfrage kann jetzt – wie auch in lobid-resources – die gesamte Ergebnismenge als JSON Lines heruntergeladen werden, indem einach der Parameter <code class="language-plaintext highlighter-rouge">format=jsonl</code> ergänzt wird. Im Antwortformat wird dann pro Zeile ein GND-Eintrag zurückgeliefert, zum Beispiel alle GND-Entitäten vom Typ “Sammlung” (Unterklasse von “Werk”):</p>
<p><a href="http://lobid.org/gnd/search?filter=type:Collection&format=jsonl">http://lobid.org/gnd/search?filter=type:Collection&format=jsonl</a></p>
<p>Bei solchen kleineren Ergebnismengen reicht der JSON-Lines-Download aus, werden größere Untermengen der GND abgefragt, empfiehlt es sich, das Ergebnis komprimiert als gzip herunterzuladen. Dafür muss der HTTP-Anfrage nur der entsprechende Accept-Header mitgegeben werden, z.B. mit curl:</p>
<p><code class="language-plaintext highlighter-rouge">$ curl --header "Accept-Encoding: gzip" 'http://lobid.org/gnd/search?filter=type:Collection&format=jsonl'</code></p>
<h2 id="openrefine-reconciliation-api">OpenRefine Reconciliation API</h2>
<p>Seit Ende letzter Woche ist die OpenRefine Reconciliation API für lobid-gnd produktiv. Damit ist es auf einfache Weise möglich, mit dem für Datenaufbereitung und -anreicherung beliebten Werkzeug <a href="http://openrefine.org/">OpenRefine</a> eine Liste von Ansetzungsformen mit der GND abzugleichen, um die Textstrings auf GND-IDs zu matchen. Dafür müssen lediglich die abzugleichenden Daten in OpenRefine geladen werden, die entsprechende Spalte ausgewählt und der Reconciliation-Prozess z.B. wie folgt durchgeführt werden.</p>
<p>1.Start des Reconciliation-Prozesses für eine Spalte in OpenRefine
<img src="/images/start-reconciling.png" alt="Screenshot" title="start reconciling" /></p>
<ol>
<li>Ergänzen des lobid-gnd Reconciliation Endpoints (<code class="language-plaintext highlighter-rouge">https://lobid.org/gnd/reconcile</code>) in OpenRefine
<img src="/images/add-lobid-gnd-to-openrefine.png" alt="Screenshot" title="ergänze lobid-gnd reconciliation API" /></li>
<li>(Optionale) Auswahl einer GND-Untermenge (hier “Person”) für Reconciliation
<img src="/images/choose-type-for-reconciliation.png" alt="Screenshot" title="Typ-Auswahl" /></li>
<li>Start der API-Abfrage mit Klick auf “Start Reconciling”</li>
</ol>
lobid-gnd – Eine Schnittstelle zur Gemeinsamen Normdatei für Mensch und Maschine2018-06-07T00:00:00+00:00Adrian Pohl, Fabian Steeghttp://blog.lobid.org/2018/06/07/lobid-gnd<p>Wie im <a href="http://blog.lobid.org/2018/03/20/gnd-class-hierarchy.html">letzten Beitrag</a> geschrieben, entwickeln wir seit einiger Zeit die neue Version des lobid-Normdatendienstes <em>lobid-gnd</em>, erreichbar über <a href="https://lobid.org/gnd">https://lobid.org/gnd</a>.<sup>1</sup> Noch befindet sich der Dienst im beta-Status, allerdings sind wir kurz davor, mit lobid-gnd in Produktion zu gehen. Das nehmen wir zum Anlass, um hier einen Einblick in die Funktionsweise von lobid-gnd zu geben.</p>
<h2 id="die-benutzeroberfläche">Die Benutzeroberfläche</h2>
<p><img src="/images/20180601_lobid-gnd-autosuggest.png" alt="Screenshot" title="lobid-gnd Suchvorschläge" /></p>
<p>Als Einstieg in die GND dient ein einfacher Suchschlitz. Die Suche unterstützt Boolesche Operatoren, Phrasensuche und Trunkierung. Für noch speziellere Abfragen wird die <a href="https://lucene.apache.org/core/2_9_4/queryparsersyntax.html">Lucene Query Parser Syntax</a> unterstützt (siehe für Beispiele die <a href="https://lobid.org/gnd/api">API-Dokumentation</a>).<sup>2</sup> Während der Eingabe werden Vorschläge gemacht, um direkt den gewünschten Eintrag auswählen zu können. Zur leichteren Identifikation werden neben dem Namen auch der Typ einer GND-Entität angezeigt sowie weitere für eine Identifikation relevante Informationen wie etwa Geburts- und Sterbejahr bei Personen.</p>
<p>Wenn kein vorgeschlagener Eintrag ausgewählt und stattdessen die Suche abgeschickt wird, öffnet sich die Suchergebnisliste.</p>
<p><a href="http://lobid.org/gnd/search?q=hannah+arendt"><img src="/images/20180605_lobid-gnd-result-list.png" alt="Screenshot" title="lobid-gnd-Ergebnisliste" /></a></p>
<p>Ein Piktogramm am Anfang jeder Zeile zeigt den allgemeinen Typ der Ressource an. Zur leichten Identifikation einer GND-Entität werden in der Zeile ebenfalls ihr spezieller Entitätstyp und weitere Informationen je nach Art des Eintrags angezeigt. Auf der rechten Seite werden Facetten angezeigt anhand derer die Suchergebnisse gefiltert werden können. Derzeit wird eine Facettierung nach Entitätstyp, GND-Sachgruppe, Ländercode und “Beruf oder Beschäftigung” (nur Personen) angeboten. In Klammern wird hinter jeder Facette wie üblich angezeigt, wieviele Ressourcen mit Klick auf die Facette herausgefiltert werden.</p>
<p>Mit Klick auf den Eintrag einer Suchergebnisliste wie auch der Vorschlagsliste gelangt man zur Einzeltrefferansicht.</p>
<p><a href="http://lobid.org/gnd/11850391X"><img src="/images/20180605_lobid-gnd-einzeltreffer.png" alt="Screenshot" title="lobid-gnd-Einzeltreffer" /></a></p>
<p>Im Titel des Eintrags steht die präferierte Namensform plus Informationen zum Entitätstyp. Als Untertitel werden weitere identifizierende Merkmale wie auch in den Suchvorschlägen und der Ergebnisliste gezeigt. Darunter werden standardmäßig alle Beschreibungsfelder angezeigt sowie daneben – falls über EntityFacts vorhanden – eine zum Eintrag passende Abbildung. Aus EntityFacts werden auch die Links zu anderen Quellen wie Wikidata oder der Deutschen Digitalen Bibliothek bezogen (unter “Siehe auch” angezeigt).</p>
<p>In der tabellarischen Beschreibung finden sich sowohl textuelle Informationen als auch Links. Die Verlinkungen führen zur jeweilig verknüpften GND-Entität oder zum Eintrag im jeweiligen externen kontrollierten Vokabular (z. B. <a href="https://d-nb.info/standards/vocab/gnd/geographic-area-code.html">GND Geographic Area Codes</a> oder <a href="https://d-nb.info/standards/vocab/gnd/gnd-sc.html">GND-Sachgruppen</a>). Wird die Lupe hinter einem Link geklickt, werden alle GND-Entitäten mit derselben Eigenschaft angezeigt, im Beispiel aus dem Foto z. B. <a href="http://lobid.org/gnd/search?q=professionOrOccupation.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4174285-0%22&format=html">alle Einträge mit Beruf oder Beschäftigung “Philosophin”</a>.</p>
<p>Im Tab “Beziehungen” gibt es eine anschauliche Repräsentation der GND-internen Verlinkungen in Form eines Graphen. Hier lassen sich die Knoten klicken, um zum Beziehungsgraphen eines verlinkten Eintrags zu kommen oder die Kanten, um eine Suche nach allen anderen Ressourcen mit derselben Relation anzustoßen, wie etwa <a href="http://lobid.org/gnd/search?q=acquaintanceshipOrFriendship.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F1071467174%22&format=html">alle Personen mit einer freundschaftlichen Beziehung zu Hilde Fränkel</a>.</p>
<p><a href="http://lobid.org/gnd/11850391X#rels"><img src="/images/20180606_lobid-gnd-graph.png" alt="lobid-gnd-Beziehungsgraph" /></a></p>
<p>Das Piktogramm <img src="https://lobid.org/gnd/assets/images/json-ld.png" alt="JSON-LD-Piktogramm" style="width:32px !important;height:32px !important;" /> verweist auf die dem Eintrag zugrundeliegenden strukturierten Daten im Format JSON-LD. Im folgenden wird die Herkunft, Aktualität und Struktur dieser Daten erläutert.</p>
<h2 id="datengenerierung-und-anreicherung">Datengenerierung und Anreicherung</h2>
<p>lobid-gnd ist – neben seiner Funktion als Endnutzerschnittstelle – auch eine Maschinenschnittstelle zur GND. Die Endnutzerschnittstelle basiert auf HTML für die Ansicht im Browser, aber ebenso liefern alle HTTP-GET-Anfragen auf Wunsch JSON(-LD) für die maschinelle Verarbeitung etwa durch Anwendungsentwickler. Bevor wir aber näher auf die Web-API (<em>Application Programming Interface</em>, deutsch: Anwendungsschnittstelle) eingehen, möchten wir zunächst beschreiben, wie und in welcher Form die GND-Daten indexiert werden.</p>
<p>Die Datenquelle sind die RDF-Daten der GND, die von der Deutschen Nationalbliothek (DNB) <a href="http://www.dnb.de/DE/Service/DigitaleDienste/LinkedData/linkeddata_node.html">bereitgestellt</a> werden. Das hbz hat Zugriff auf eine OAI-PMH-Schnittstelle der DNB, über die täglich Updates der Daten geholt werden, um Aktualität zu gewährleisten. Diese Daten werden dann für lobid-gnd mit einigen Anpassungen nach JSON-LD konvertiert.<sup>3</sup></p>
<h3 id="der-json-ld-kontext">Der JSON-LD-Kontext</h3>
<p>Die meiste Arbeit zur Optimierung der Datenstruktur übernimmt der JSON-LD-Kontext unter <a href="https://lobid.org/gnd/context.jsonld">https://lobid.org/gnd/context.jsonld</a>. Er bewirkt unter anderem folgende Dinge:</p>
<ul>
<li>Der Kontext bestimmt, welche JSON-Keys auf welche RDF-Properties gemappt werden, so dass im JSON nicht lange URIs als Keys angezeigt werden.</li>
<li>Mit Einträgen wie <code class="language-plaintext highlighter-rouge">"AuthorityResource": "gnd:AuthorityResource"</code> werden Typen (<code class="language-plaintext highlighter-rouge">type</code>) im JSON nicht als umständliche URI, sondern als einfacher String angezeigt, so dass die Daten auch für Entwickler leicht verständlich sind, die bisher nicht viel mit Linked Data gearbeitet haben.</li>
<li>Mittels <code class="language-plaintext highlighter-rouge">"@container": "@set"</code> wird festgelegt, dass bis auf wenige Ausnahmen alle Properties ein Array als Wert haben, auch wenn es nur ein Element als Wert gibt. Dadurch ist die Datenstruktur homogener und vorhersagbarer<sup>4</sup>. Im Zusammenspiel mit der Option <a href="https://json-ld.org/spec/latest/json-ld-api/#dom-jsonldoptions-compactarrays">compactArrays</a> in JSON-LD ermöglicht dies eine gezielte Konfiguration einzelner Felder.</li>
</ul>
<h3 id="framing">Framing</h3>
<p>Außerdem nutzen wir einen einfachen <a href="https://json-ld.org/spec/latest/json-ld-framing/">JSON-LD Frame</a>, um das JSON in eine hierarchische JSON-Struktur mit einem Wurzelelement zu bringen. Der Frame ist denkbar einfach:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
"@context": "http://lobid.org/gnd/context.jsonld",
"@type": "AuthorityResource",
"@embed": "@always"
}
</code></pre></div></div>
<h3 id="homogenisierung-von-typen-und-label-properties">Homogenisierung von Typen und Label-Properties</h3>
<p>Damit das Framing bei jeder GND-Entität funktioniert, muss allen Entitäten der Typ <code class="language-plaintext highlighter-rouge">AuthorityResource</code> zugewiesen sein. Hier kommen wir zum Punkt, wo wir die Daten der DNB ergänzen, um bestimmte Funktionalitäten zu ermöglichen. Das von der DNB gelieferte <a href="https://d-nb.info/gnd/11850391X/about/lds">RDF zum Eintrag von Hannah Arendt</a> enthält folgende Informationen (in Turtle-Notation):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@prefix gndo: <https://d-nb.info/standards/elementset/gnd#> .
<https://d-nb.info/gnd/11850391X> a gndo:DifferentiatedPerson ;
gndo:preferredNameForThePerson "Arendt, Hannah" ;
gndo:variantNameForThePerson "Blücher, Johanna" .
</code></pre></div></div>
<p>Wie man sieht, wird hier nur die spezifische Klasse (<code class="language-plaintext highlighter-rouge">gndo:DifferentiatedPerson</code>) angegeben und typspezifische Properties (<code class="language-plaintext highlighter-rouge">gndo:preferredNameForThePerson</code>, <code class="language-plaintext highlighter-rouge">gndo:variantNameForThePerson</code>) zur Angabe der Ansetzungs- und Verweisungsformen verwendet. Dies mag für eine Abfrage der Daten über einen SPARQL-Endpoint ausreichend sein, weil die <a href="https://d-nb.info/standards/elementset/gnd">GND-Ontologie</a> die Informationen enthält, welches die Überklassen und -Properties sind und somit mit Hilfe von Reasoning auch entsprechende Abfragen funktionieren.</p>
<p>Für eine einheitliche Abfrage der Ansetzungsformen aller GND-Entitäten in einem Suchmaschinenindex bzw. über eine Web-API und die Bereitstellung von Filtermöglichkeiten nach Oberklassen (Person, Schlagwort, Körperschaft, Geografikum etc.) reicht das aber nicht aus. Deshalb verzichten wir zum einen auf die Nutzung der spezifischen Namen-Properties und zum anderen ergänzen wir die Überklassen im JSON-LD. Die entsprechenden Teile im JSON-LD zu Hannah Arendt sehen in lobid-gnd etwa so aus:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"@context"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://lobid.org/gnd/context.jsonld"</span><span class="p">,</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/11850391X"</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"DifferentiatedPerson"</span><span class="p">,</span><span class="w">
</span><span class="s2">"AuthorityResource"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Person"</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"preferredName"</span><span class="p">:</span><span class="s2">"Arendt, Hannah"</span><span class="p">,</span><span class="w">
</span><span class="nl">"variantName"</span><span class="p">:[</span><span class="w">
</span><span class="s2">"Blücher, Johanna"</span><span class="p">,</span><span class="w">
</span><span class="s2">"..."</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<h3 id="labels-für-verlinkte-ressourcen">Labels für verlinkte Ressourcen</h3>
<p>Im JSON-LD wird zu jeder in Beziehung gesetzten GND-Ressource sowie zu den GND-Sachgruppen und Ländercodes die entsprechende Ansetzungsform wie in den anderen lobid-Diensten als <code class="language-plaintext highlighter-rouge">label</code> mitgeliefert. Beim Eintrag zu Hannah Arendt gibt es unter anderen einen Link auf den Sterbeort, auf verschiedene Berufe/Beschäftigungen, auf drei GND-Sachgruppen und auf verwandte Personen. Wo im RDF der GND nur URIs zu finden sind, sieht es in lobid-gnd wie folgt aus:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"@context"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://lobid.org/gnd/context.jsonld"</span><span class="p">,</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/11850391X"</span><span class="p">,</span><span class="w">
</span><span class="nl">"placeOfDeath"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/4042011-5"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"New York, NY"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"familialRelationship"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/119378418"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Blücher, Heinrich"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/118502751"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Anders, Günther"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"gndSubjectCategory"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/standards/vocab/gnd/gnd-sc#4.7p"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Personen zu Philosophie"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"geographicAreaCode"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/standards/vocab/gnd/geographic-area-code#XA-DE"</span><span class="p">,</span><span class="w">
</span><span class="nl">"label"</span><span class="p">:</span><span class="s2">"Deutschland"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Dies ermöglicht es API-Nutzer/innen auf einfache Weise, menschenlesbare Labels in Anwendungsoberflächen anzuzeigen anstatt bloße URIs. Es macht zudem die Suche nach Einträgen mit diesen Labels (z.B. <em>Schriftsteller</em>) überhaupt erst möglich wie auch Performance-kritische Anwendungsfälle, bei denen zusätzliche Lookups zu Ermittlung der Labels nicht praktikabel wären. So verwendet etwa die oben beschriebene Vorschlagsfunktion die Labels zum schnellen Auffinden des gesuchten Eintrags.</p>
<h3 id="anreicherung-mit-links-und-bildern-aus-entityfacts">Anreicherung mit Links und Bildern aus EntityFacts</h3>
<p>Neben dem GND-RDF stellt die DNB mit <a href="http://www.dnb.de/DE/Service/DigitaleDienste/EntityFacts/entityfacts_node.html">EntityFacts</a> einen Dienst bereit, der einfaches JSON-LD zu Personen, Körperschaften und Geographika aus der GND anbietet, angereichert um Links zu anderen Datenanbietern (Wikidata, ORCID, BnF etc.) sowie zu Abbildungen einer GND-Entität auf Wikimedia Commons. Die Bereitstellung eines <a href="https://twitter.com/junicatalo/status/976086235541397504">Dumps</a> der EntityFacts-Daten seitens der DNB hat uns dazu ermutigt, diese zusätzlichen Informationen zu ergänzen.<sup>5</sup> Im Beispiel Hannah Arendt sind dies unter anderem folgende Informationen:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://d-nb.info/gnd/11850391X"</span><span class="p">,</span><span class="w">
</span><span class="nl">"depiction"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"https://commons.wikimedia.org/wiki/Special:FilePath/Hannah_arendt-150x150.jpg"</span><span class="p">,</span><span class="w">
</span><span class="nl">"url"</span><span class="p">:</span><span class="s2">"https://commons.wikimedia.org/wiki/File:Hannah_arendt-150x150.jpg?uselang=de"</span><span class="p">,</span><span class="w">
</span><span class="nl">"thumbnail"</span><span class="p">:</span><span class="s2">"https://commons.wikimedia.org/wiki/Special:FilePath/Hannah_arendt-150x150.jpg?width=270"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"sameAs"</span><span class="p">:[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"collection"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"abbr"</span><span class="p">:</span><span class="s2">"BNF"</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="s2">"Bibliothèque nationale de France"</span><span class="p">,</span><span class="w">
</span><span class="nl">"publisher"</span><span class="p">:</span><span class="s2">"Bibliothèque nationale de France"</span><span class="p">,</span><span class="w">
</span><span class="nl">"icon"</span><span class="p">:</span><span class="s2">"http://www.bnf.fr/bnf_dev/icono/favicon.ico"</span><span class="p">,</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://www.wikidata.org/entity/Q19938912"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://catalogue.bnf.fr/ark:/12148/cb118890622"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"collection"</span><span class="p">:{</span><span class="w">
</span><span class="nl">"abbr"</span><span class="p">:</span><span class="s2">"WIKIDATA"</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="s2">"Wikidata"</span><span class="p">,</span><span class="w">
</span><span class="nl">"publisher"</span><span class="p">:</span><span class="s2">"Wikimedia Foundation Inc."</span><span class="p">,</span><span class="w">
</span><span class="nl">"icon"</span><span class="p">:</span><span class="s2">"https://www.wikidata.org/static/favicon/wikidata.ico"</span><span class="p">,</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://www.wikidata.org/entity/Q2013"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="s2">"http://www.wikidata.org/entity/Q60025"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Mit diesen Anreicherungen kann auf der Basis von Identifikatoren Dritter in lobid-gnd gesucht werden, etwa anhand einer <a href="http://lobid.org/gnd/search?q=%220000-0002-7613-4123%22">ORCID</a> oder eines <a href="http://lobid.org/gnd/search?q=%220000000114476112%22">ISNI</a>. Mit den Bildern können Einträge wie z.B. Autorenseiten illustriert werden.<sup>6</sup></p>
<h2 id="web-api">Web-API</h2>
<p>Das im vorherigen Abschnitt beschriebene JSON-LD indexieren wir in einen <a href="https://www.elastic.co/de/products/elasticsearch">Elasticsearch</a>-Suchmaschinenindex und bieten die Elasticsearch-Abfragesprache für Suchanfragen und zum Filtern an. Somit sind nützlichen Elasticsearch-Funktionen für interessierte Nutzer verfügbar wie z.B. Unterstützung der <a href="https://lucene.apache.org/core/2_9_4/queryparsersyntax.html">Lucene Query Language</a> und exists-Abfragen. Eine Dokumentation der Elasticsearch <code class="language-plaintext highlighter-rouge">query_string</code> DSL findet sich <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html">hier</a>. Darauf aufsetzend bieten wir auch einen <a href="http://lobid.org/gnd/api#auto-complete">Parameter für Auto-Suggest</a>, dessen Rückgabefelder bei Bedarf angepasst werden können.</p>
<p>Für eine detaillierte API-Beschreibung verweisen wir auf die in Entstehung befindliche Dokumentation unter <a href="https://lobid.org/gnd/api">https://lobid.org/gnd/api</a>. Im Folgenden seien nur ein paar Beispiel-Abfragen genannt, wobei durch Ergänzung von <code class="language-plaintext highlighter-rouge">format=json</code> auch im Browser JSON-LD angezeigt werden kann:</p>
<ul>
<li><a href="http://lobid.org/gnd/search?q=placeOfBirth.id%3A%22https%3A%2F%2Fd-nb.info%2Fgnd%2F4031483-2%22+AND+dateOfBirth%3A%5B1933+TO+1945%5D+&filter=%2B%28type%3APerson%29">Personen, die während der NS-Zeit in Köln geboren wurden</a></li>
<li><a href="http://lobid.org/gnd/search?q=sameAs.collection.id%3A%22http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ423048%22+AND+NOT+sameAs.collection.id%3A%22http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ2013%22">Einträge, die einen DDB-Link aber keinen Wikidata-Link haben</a> (um etwa herauszufinden, welche Personen mit Objekten in der Deutschen Digitalen Bibliothek womöglich noch nicht in Wikidata verzeichnet sind)</li>
<li><a href="http://lobid.org/gnd/search?q=_exists_%3Aarchitect">Alle Entitäten, zu denen ein Architekt angegeben wurde</a></li>
<li><a href="http://lobid.org/gnd/search?q=geographicAreaCode.id%3A%22https%3A%2F%2Fd-nb.info%2Fstandards%2Fvocab%2Fgnd%2Fgeographic-area-code%23XA-DE-BE%22+AND+type%3ANameOfSmallGeographicUnitLyingWithinAnotherGeographicUnit">“Kleinräumige Geografika” innerhalb von Berlin</a></li>
</ul>
<h2 id="rückmeldungen-erwünscht">Rückmeldungen erwünscht</h2>
<p>lobid-gnd möchte die GND als <a href="https://www.slideshare.net/azaroth42/europeanatech-keynote-shout-it-out-loud">Linked Open Usable Data</a> anbieten. Die Daten sollen einfach zu nutzen sein, für Anwendungsentwickler/innen über die API und für Endnutzer/innen über eine intuitive Oberfläche. Wir freuen uns über jegliche Rückmeldungen, seien es Verbesserungsvorschläge, Bug-Meldungen, Lobhudeleien oder Verrisse. Bitte teilen Sie uns über Anmerkungen zu diesem Beitrag mit hypothes.is, per E-Mail oder Twitter mit, wie sie die Daten gerne nutzen würden, welche Funktionen Ihnen fehlen oder wo Sie einen Bug entdeckt haben.</p>
<hr />
<p><sup>1</sup> In der Version 1.x wurden GND-Entitäten noch über den <code class="language-plaintext highlighter-rouge">/subject</code>-Endpoint angeboten und es gab einen Endpoint nur für die GND-Personen (<code class="language-plaintext highlighter-rouge">/person</code>). Jetzt gibt es Zugriff auf alle GND-Entitäten über <a href="https://lobid.org/gnd">https://lobid.org/gnd</a>.</p>
<p><sup>2</sup> Siehe auch die Dokumentation der <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax">Elasticsearch Query String Syntax</a>.</p>
<p><sup>3</sup> Für Details siehe etwa die Tickets <a href="https://github.com/hbz/lobid-gnd/issues/1">#1</a>, <a href="https://github.com/hbz/lobid-gnd/issues/2">#2</a>, <a href="https://github.com/hbz/lobid-gnd/issues/3">#3</a>, <a href="https://github.com/hbz/lobid-gnd/issues/24">#24</a>, <a href="https://github.com/hbz/lobid-gnd/issues/69">#69</a>, <a href="https://github.com/hbz/lobid-gnd/issues/101">#101</a>. Zum Teil waren die Anpassungen durch Inkonsistenzen in den Ausgangsdaten nötig, was wir zum Anlass genommen haben, Verbesserungen vorzuschlagen (u.a. <a href="https://lists.dnb.de/pipermail/gnd-ontology/2017-July/000093.html">auf der GND-Ontology-Mailingliste</a>).</p>
<p><sup>4</sup> Dies spielt etwa für die Indexierung in Elasticsearch eine Rolle, da hier ein bestimmtes Feld immer den gleichen Datentypen (z.B. Array) haben muss. Auch bei der Nutzung der API erleichtert dies die Verarbeitung, da für ein bestimmtes Feld immer von einem identischen Typ ausgegangen werden kann.</p>
<p><sup>5</sup> Für Details zur Umsetzung siehe <a href="https://github.com/hbz/lobid-gnd/issues/69">Ticket #69</a>.</p>
<p><sup>6</sup> Wobei zu beachten ist, dass die Attributions- und Lizenzinformationen zu den Bildern nicht mitgeliefert werden, sondern von der Wikimedia Commons API geladen werden müssen. Zur Umsetzung siehe z.B. <a href="https://github.com/hbz/lobid-organisations/issues/321#issuecomment-285366696">diesen Kommentar</a> und unsere <a href="https://github.com/hbz/lobid-gnd/blob/580365da19ae5b3264376289480d836adc8894c4/app/controllers/HomeController.java#L355">aktuelle Implementierung</a>.</p>
The GND class hierarchy, updated2018-03-20T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2018/03/20/gnd-class-hierarchy<p>We started doing some work on the lobid-gnd (in beta), the service providing access to the Integrated Authority File (GND): <a href="https://lobid.org/gnd">https://lobid.org/gnd</a>. Currently we are working on the type filter (see <a href="https://github.com/hbz/lobid-gnd/issues/42">issue #42</a>). As several of sub-classes have been added to the GND ontology in the meantime, it seemed like a good opportunity for a quick update of a post from 2013 titled <a href="https://wiki1.hbz-nrw.de/x/CIeW">“The GND ontology’s class hierarchy - an overview”</a>.</p>
<p>Still, the most general class in the GND ontology is “AuthorityResource”. These are the classes on the lower levels: [<strong>Update 2018-03-22</strong>: <em>Now with the current number of entities with the respective type and with a link to those entities in lobid-gnd.</em>]</p>
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:ConferenceOrEvent">ConferenceOrEvent</a> (784,096)
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:SeriesOfConferenceOrEvent">SeriesOfConferenceOrEvent</a> (124,019)</li>
</ul>
</li>
<li><a href="http://lobid.org/gnd/search?filter=type:CorporateBody">CorporateBody</a> (1,494,345)
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:Company">Company</a> (0)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:FictiveCorporateBody">FictiveCorporateBody</a> (17)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:MusicalCorporateBody">MusicalCorporateBody</a> (0)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:OrganOfCorporateBody">OrganOfCorporateBody</a> (110,665)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:ProjectOrProgram">ProjectOrProgram</a> (1,450)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:ReligiousAdministrativeUnit">ReligiousAdministrativeUnit</a> (0)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:ReligiousCorporateBody">ReligiousCorporateBody</a> (0)</li>
</ul>
</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Family">Family</a> (19,054)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Person">Person</a> (11,047,320)
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:DifferentiatedPerson">DifferentiatedPerson</a> (4,310,992)
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:CollectivePseudonym">CollectivePseudonym</a> (532)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Gods">Gods</a> (553)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:LiteraryOrLegendaryCharacter">LiteraryOrLegendaryCharacter</a> (1,325)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:RoyalOrMemberOfARoyalHouse">RoyalOrMemberOfARoyalHouse</a> (2,979)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Spirits">Spirits</a> (103)</li>
</ul>
</li>
<li><a href="http://lobid.org/gnd/search?filter=type:UndifferentiatedPerson">UndifferentiatedPerson</a> (6,736,328)</li>
</ul>
</li>
<li><a href="http://lobid.org/gnd/search?filter=type:PlaceOrGeographicName">PlaceOrGeographicName</a> (301,281)
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:AdministrativeUnit">AdministrativeUnit</a> (11,844)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:BuildingOrMemorial">BuildingOrMemorial</a> (6,4735)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Country">Country</a> (327)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:ExtraterrestrialTerritory">ExtraterrestrialTerritory</a> (261)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:FictivePlace">FictivePlace</a> (30)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:MemberState">MemberState</a> (579)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:NameOfSmallGeographicUnitLyingWithinAnotherGeographicUnit">NameOfSmallGeographicUnitLyingWithinAnotherGeographicUnit</a> (1,877)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:NaturalGeographicUnit">NaturalGeographicUnit</a> (17,749)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:ReligiousTerritory">ReligiousTerritory</a> (2,833)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:TerritorialCorporateBodyOrAdministrativeUnit">TerritorialCorporateBodyOrAdministrativeUnit</a> (185,237)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:WayBorderOrLine">WayBorderOrLine</a> (4,613)</li>
</ul>
</li>
<li><a href="http://lobid.org/gnd/search?filter=type:SubjectHeading">SubjectHeading</a> (207,186)
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:CharactersOrMorphemes">CharactersOrMorphemes</a> (1,939)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:EthnographicName">EthnographicName</a> (4,194)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:FictiveTerm">FictiveTerm</a> (2)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:GroupOfPersons">GroupOfPersons</a> (349)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:HistoricSingleEventOrEra">HistoricSingleEventOrEra</a> (5,206)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Language">Language</a> (5740)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:MeansOfTransportWithIndividualName">MeansOfTransportWithIndividualName</a> (1,377)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:NomenclatureInBiologyOrChemistry">NomenclatureInBiologyOrChemistry</a> (30,721)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:ProductNameOrBrandName">ProductNameOrBrandName</a> (5,602)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:SoftwareProduct">SoftwareProduct</a> (8,026)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:SubjectHeadingSensoStricto">SubjectHeadingSensoStricto</a> (135,680)</li>
</ul>
</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Work">Work</a> (324,074)
<ul>
<li><a href="http://lobid.org/gnd/search?filter=type:Collection">Collection</a> (1,112)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:CollectiveManuscript">CollectiveManuscript</a> (0)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Expression">Expression</a> (5,270)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:Manuscript">Manuscript</a> (5,747)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:MusicalWork">MusicalWork</a> (167,771)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:ProvenanceCharacteristic">ProvenanceCharacteristic</a> (2,236)</li>
<li><a href="http://lobid.org/gnd/search?filter=type:VersionOfAMusicalWork">VersionOfAMusicalWork</a> (2,949)</li>
</ul>
</li>
</ul>
Geschichte des Semantic Web und Linked (Open) Data im Bibliothekswesen – eine Zeitleiste2018-02-22T00:00:00+00:00Adrian Pohl, Christian Hauschkehttp://blog.lobid.org/2018/02/22/lodbib-zeitleiste<p>Die Entwicklung von Linked (Open) Data war schon immer eng mit dem wissenschaftlichen Bibliothekswesen verknüpft. Für einen Vortrag auf der <a href="https://www.inetbib.de/inetbib18-do/">Inetbib-ODOK-Tagung 2018</a> wollten wir, <a href="http://lobid.org/team/ap">Adrian Pohl</a> (hbz) und <a href="https://vivo.tib.eu/fis/display/n0000-0003-2499-7741">Christian Hauschke</a> (TIB), diese Zusammenhänge aufzeigen und vergangene erfüllte und enttäuschte Hoffnungen darstellen.</p>
<p>Um uns selbst einen plastischen Überblick über vergangene Entwicklungen zu verschaffen, haben wir eine <a href="https://tinyurl.com/lodlam-zeitleiste">Zeitleiste mit ausgewählten Ereignissen aus der Geschichte des Semantic Webs, Linked (Open) Data mit Relevanz für das Bibliothekswesen</a> erstellt, in der uns bemerkenswert erscheinende Meilensteine verzeichnet sind. Wir haben die Ereignisse auf vier Kategorien verteilt: Standards, Projekte/Tools, Open Data, Community.</p>
<p>Auch wenn der Vortrag leider entfallen musste, möchten wir die geleisteten Vorarbeiten nicht einfach in der Schublade verstauben lassen. Die der Zeitleiste zu Grunde liegende Tabelle ist daher lizenziert unter einer <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative-Commons-Namensnennung-4.0-International-Lizenz</a>. Mitarbeit an dieser Zeitleiste ist <a href="https://docs.google.com/spreadsheets/d/1jskswhsv20PithoDZqIw8QSjw_KdYS_HGDfVVx-CemI/edit?usp=sharing">ausdrücklich erwünscht</a>.</p>
<p>Dieses Posting ist parallel <a href="http://blog.lobid.org/2018/02/22/lodbib-zeitleiste.html">im Lobid-Blog</a> / <a href="https://blogs.tib.eu/wp/tib/2018/02/22/geschichte-des-semantic-web-linked-open-data-im-bibliothekswesen-eine-zeitleiste">Blog der TIB</a> erschienen.</p>
Using the Java API for scripting in Elasticsearch 5.62017-11-29T00:00:00+00:00Fabian Steeghttp://blog.lobid.org/2017/11/29/java-api-scripting-elasticsearch<p>To create a custom aggregation <a href="https://github.com/hbz/lobid-resources/commit/72054407cd25371f58a28de0068a44ce8ada12bd">in lobid-resources for NWBib</a>, I used the Java API for scripting in Elasticsearch 5.6. It was surprisingly hard to find details on this, since there was no full, current documentation available. So here is the gist of it.</p>
<p>First, we specify the scripting language to use, and a script ID:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>String lang = "painless";
String id = "topic-aggregation";
</code></pre></div></div>
<p>Then, our actual script content (as an example, we just pick the document’s <code class="language-plaintext highlighter-rouge">type</code> field here):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>String script = "doc['type']";
</code></pre></div></div>
<p>Next, we have to create a JSON string to pass to the Elasticsearch API. Our goal is something like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{ "script": { "lang": "painless", "source": "doc['type']" } }
</code></pre></div></div>
<p>To avoid escaping issues, we use a JSON lib here, like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ObjectNode scriptObject = Json.newObject();
scriptObject.putObject("script")
.put("lang", lang).put("source", script);
</code></pre></div></div>
<p>We then wrap the JSON string into a <code class="language-plaintext highlighter-rouge">BytesArray</code> object:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>BytesArray bytes = new BytesArray(scriptObject.toString());
</code></pre></div></div>
<p>And finally use that object to store the script in our cluster:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PutStoredScriptResponse response = client.admin().cluster()
.preparePutStoredScript().setId(id)
.setContent(bytes, XContentType.JSON).get();
</code></pre></div></div>
<p>Later, we can create a <code class="language-plaintext highlighter-rouge">Script</code> object based in the script ID:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Script script = new Script(
ScriptType.STORED, lang, id, Collections.emptyMap());
</code></pre></div></div>
<p>Which we can then use, e.g. in our <code class="language-plaintext highlighter-rouge">Aggregation</code>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>searchRequest.addAggregation(
AggregationBuilders.terms("topic").script(script));
</code></pre></div></div>
<p>For details on other Elasticsearch APIs and the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/modules-scripting-painless.html">painless scripting language</a>, see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html">the Elasticsearch documentation</a>.</p>
Officially launching lobid-resources & lobid-organisations 2.02017-07-04T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2017/07/04/lobid-launch<p>We are happy to announce the official launch of lobid-resources and lobid-organisations 2.0!</p>
<p><a href="https://lobid.org"><img src="/images/20170704_screenshot.png" alt="Screenshot" title="lobid screenshot" /></a></p>
<p>For some time we had the API and new user interfaces based on it in open beta and by now think that it is time to go into production. We have been writing a lot about our experiences working on the new version of these services, see the <a href="http://blog.lobid.org/">previous posts on the blog</a>.</p>
<p>Version 1.x of the API will remain up and running for now. Nonetheless, you should plan switching to the newer version as we won’t run both services in parallel forever. As soon as we have a concrete date for shutting off the API we will let you know via the <a href="http://listen.hbz-nrw.de/mailman/listinfo/lobid">mailing list</a> (German) and via <a href="http://twitter.com/lobidorg">Twitter</a>.</p>
Lobid API 2.0: Why and how2017-06-08T00:00:00+00:00Fabian Steeg, Pascal Christophhttp://blog.lobid.org/2017/06/08/lobid-api-why-how<h2 id="introduction-the-lobid-api">Introduction: The Lobid API</h2>
<p><a href="http://lobid.org">Lobid</a> provides uniform access to different library-related data via a web-based application programming interface (API) that serves JSON for linked data (JSON-LD):</p>
<p><img src="/images/data.png" alt="Data" title="Data" /></p>
<p>The idea is to decouple applications that make use of the data from specific data sources, formats, and systems. That way, these systems and formats can change, without requiring change in the applications, which use the data via the API. If you like, you can read more about why we think that <a href="http://fsteeg.com/notes/why-lod-needs-applications-and-libraries-need-apis">libraries need APIs</a>.</p>
<p>After the initial release of the API in 2013 we started <a href="https://github.com/hbz/lobid/issues/1">gathering improvements</a> that would not be compatible with the released version, as a preparation for a future API 2.0 release. With the upcoming launch of our 2.0 APIs, we want to revisit these improvements, and describe how we implemented them.</p>
<h2 id="architecture-from-horizontal-layers-to-vertical-slices">Architecture: from horizontal layers to vertical slices</h2>
<p>The implementation of the 1.x system was a classical layered system: we had one repo that implemented the backend, which included data transformations and storage for all datasets, and one repo that implemented the API and frontend for all datasets. All datasets shared one Elasticsearch cluster, and all APIs and UIs ran in the same process.</p>
<p>In general, this resulted in things being entangled: if we wanted to switch to a newer Elasticsearch version that provided some feature required for one dataset, all others would have to move too. Or some software dependency needed for the API of one dataset would cause conflicts with dependencies that only the API of another dataset needed.</p>
<p>So for the 2.0 system, we sliced the system boundaries to <a href="http://fsteeg.com/notes/more-self-containedness-less-code-sharing">vertical, self contained systems</a> for each data set:</p>
<p><img src="/images/scs.png" alt="Architecture" title="Architecture" /></p>
<p>Combining these modules, we still get a large API area, and a large UI, but each part of the API and UI is encapsuled in its own module, which deals with one dataset, and can be understood, changed, and deployed independently.</p>
<h2 id="json-ld-an-rdf-serialization-or-json-with-context">JSON-LD: an RDF serialization, or JSON with context</h2>
<p>JSON-LD is a W3C recommendation for a JSON-based linked data serialization. There are two ways to view JSON-LD: as an RDF serialization (like N-Triples, Turtle, or RDF-XML), or as a way to use JSON for linking data. This is reflected in the <a href="https://www.w3.org/TR/json-ld/">JSON-LD spec</a>, which both states that JSON-LD is “usable as RDF”, and that it is “designed to be usable directly as JSON, with no knowledge of RDF”. Regular JSON becomes serializable as RDF by <a href="https://www.w3.org/TR/json-ld/#the-context">attaching a context</a>.</p>
<h3 id="generic-json-ld-in-the-1x-system">Generic JSON-LD in the 1.x system</h3>
<p>For the 1.x API, we created N-Triples in our data transformation and automatically converted them to JSON-LD using a JSON-LD processor, thus treating it completely as an RDF serialization:</p>
<p><img src="/images/lobid-1.png" alt="Lobid 1" title="Lobid 1" /></p>
<p>The resulting JSON-LD used the URIs from the N-Triples as the JSON keys. We indexed this data in Elasticsearch as <a href="https://www.w3.org/TR/json-ld/#expanded-document-form">expanded JSON-LD</a>.<sup>1</sup> When serving responses via our API, we automatically converted the data to <a href="https://www.w3.org/TR/json-ld/#compacted-document-form">compact JSON-LD</a> to get short, more user friendly keys. So we actually generated two formats: the internal index format, and the external API format.</p>
<h3 id="custom-json-ld-in-the-20-systems">Custom JSON-LD in the 2.0 systems</h3>
<h4 id="creating-json-ld-as-json-with-context-lobid-organisations">Creating JSON-LD as JSON with context: lobid-organisations</h4>
<p>For the first dataset that we moved to the new approach, lobid-organisations, we turned that around — instead of crafting N-Triples, and generating JSON-LD from them, we crafted JSON in the exact structure we want, from which we can then generate RDF serializations like N-Triples:</p>
<p><img src="/images/lobid-2.png" alt="Lobid 2" title="Lobid 2" /></p>
<p>The main advantage of this is that it puts the concrete use case first: we explicitly build our API, which our applications use, in the format that makes sense, instead of putting the abstraction first, from which we generate representations that are used by actual applications.</p>
<p>Compared to the approach in the 1.x API, this is at the opposite side of the spectrum described above, treating JSON-LD as JSON, with no knowledge of RDF.</p>
<h4 id="creating-json-ld-as-an-rdf-serialization-lobid-resources">Creating JSON-LD as an RDF serialization: lobid-resources</h4>
<p>For lobid-resources 2.0, we adopted something in between. We decided to reuse and build upon the transformation script of API 1.x, as it already transforms our data into N-Triples. We then used code which was developed by Jan Schnasse for the <a href="https://github.com/hbz/etikett">etikett project</a> to create custom JSON-LD from the N-Triples. Like for lobid-organisations, and unlike the lobid 1.x API, the resulting custom JSON-LD is the internal index format <em>and at the same time</em> the external API format.</p>
<h3 id="benefits-of-custom-json-ld">Benefits of custom JSON-LD</h3>
<p>Both approaches to creating custom JSON-LD, be it custom generated from N-Triples or ‘hand crafted’ JSON, yield multiple benefits.</p>
<h4 id="what-you-see-is-what-you-can-query">What you see is what you can query</h4>
<p>A central aspect is that we now serve the same format that is actually stored in the index. This allows us to support generic querying for any part of the data. For instance, if you look at a particular record, like <a href="http://lobid.org/organisations/DE-605?format=json">http://lobid.org/organisations/DE-605?format=json</a>, you see something like:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"classification" : {
"id" : "http://purl.org/lobid/libtype#n96",
"type" : "Concept",
"label" : {
"de" : "Verbundsystem/ -kataloge",
"en" : "Union Catalogue"
}
}
</code></pre></div></div>
<p>Based on the data you see, you can address any field, e.g. <code class="language-plaintext highlighter-rouge">classification.label.en</code> in a query like <a href="http://lobid.org/organisations/search?q=classification.label.en:Union">http://lobid.org/organisations/search?q=classification.label.en:Union</a>. With our old approach, where we stored expanded JSON-LD in our index, and served compact JSON-LD in our API, we had to support explicit query parameters for specific field queries — e.g. for titles, authors, or subjects — resulting in queries like:</p>
<p><code class="language-plaintext highlighter-rouge">http://lobid.org/resource?name=Ehrenfeld</code></p>
<p>These can now be expressed with a generic <code class="language-plaintext highlighter-rouge">q</code> query parameter and actual field names from the data:</p>
<p><code class="language-plaintext highlighter-rouge">http://lobid.org/resources/search?q=title:Ehrenfeld</code></p>
<p>This avoids a limitation of the supported query types to those we anticipated. It opens API access to the full data.</p>
<h4 id="semantically-structured-data">Semantically structured data</h4>
<p>The generated JSON-LD in the 1.x API resulted in a flat structure, with objects in an array under the <code class="language-plaintext highlighter-rouge">@graph</code> key, e.g. in <code class="language-plaintext highlighter-rouge">http://lobid.org/organisation?id=DE-605&format=full</code>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"@graph": [
{
"@id": "http://purl.org/lobid/fundertype#n02",
"prefLabel": [{
"@language": "de",
"@value": "Land"
},{
"@language": "en",
"@value": "Federal State"
}]
},{
"@id": "http://purl.org/lobid/stocksize#n11",
"prefLabel": [{
"@language": "en",
"@value": "Institution without a collection"
},{
"@language": "de",
"@value": "Einrichtung ohne Bestand"
}]
}
]
</code></pre></div></div>
<p>This structure was not very useful and seemed to go <a href="http://fsteeg.com/notes/one-issue-with-json-ld-that-seems-not-so-pragmatic">against the pragmatic spirit of JSON-LD</a>. If a developer is looking for the english funder type label, they would have to first iterate over all <code class="language-plaintext highlighter-rouge">@graph</code> elements, looking for the one with the fundertype <code class="language-plaintext highlighter-rouge">@id</code>, then iterate over alls its <code class="language-plaintext highlighter-rouge">prefLabel</code>s, looking for the one with the english <code class="language-plaintext highlighter-rouge">@language</code> field. In the new API, we provide the data in a structured, more JSON-like format:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"fundertype": {
"id": "http://purl.org/lobid/fundertype#n02",
"type": "Concept",
"label": {
"de": "Land",
"en": "Federal State"
}
},
"collects": {
"type": "Collection",
"extent": {
"id": "http://purl.org/lobid/stocksize#n11",
"type": "Concept",
"label": {
"de": "Einrichtung ohne Bestand",
"en": "Institution without holdings"
}
}
}
</code></pre></div></div>
<p>This allows developers familiar with JSON to process the data in a straightforward, familiar manner. The data is directly accessible, e.g. the english funder type label as <code class="language-plaintext highlighter-rouge">fundertype.label.en</code>.</p>
<p>Another example for adding semantics to our data by providing a custom structure in our JSON, and the effect of that data on its usage in the client, <a href="http://blog.lobid.org/2016/12/13/data-modeling-client-effects.html">are contributors and their roles in lobid-resources</a>.</p>
<h4 id="labels-for-ids">Labels for IDs</h4>
<p>When using the API, a common use case is to show labels for the URIs used to identify resources, authors, subjects, etc. For applications using the 1.x APIs, we implemented label lookup functionality in many different forms and contexts. To ease that use case, we provide labels in the 2.0 API along with IDs when it makes sense and is possible. For instance the old data would only contain a URI for the medium:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"medium" : "http://rdvocab.info/termList/RDAproductionMethod/1010"
</code></pre></div></div>
<p>To display labels for URIs like this, we had to maintain mappings of URIs to labels in our client applications. In the new API, we provide the labels along with the URIs:<sup>2</sup></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"medium": [{
"id": "http://rdaregistry.info/termList/RDAproductionMethod/1010",
"label": "Print"
}]
</code></pre></div></div>
<p>Like for the creation of the JSON-LD in general, the implementation for adding these labels differs in the JSON-first and the Triples-first approach. In lobid-organisations, like all other aspects of the JSON creation, it is part of the transformation. For lobid-resources, a <code class="language-plaintext highlighter-rouge">labels.json</code> config file is used during the conversion from N-Triples to JSON-LD.</p>
<h4 id="summary-json-ld-does-not-equal-json-ld">Summary: JSON-LD does not equal JSON-LD</h4>
<p>A key take away from our experience with JSON-LD is that JSON-LD can be used and produced very differently. How it’s created has major effects on how it can be processed, and on how useful it appears to developers with different backgrounds. While a pure RDF serialization as in our 1.x API might be perfectly usable for developers working on the RDF model anyway, it can alienate web developers familiar with JSON. This variety in what JSON-LD actually looks like provides a challenge in talking about the usefulness of JSON-LD. At the same time this is JSON-LD’s unique strength, being both a JSON-based RDF serialization, and a simple way to link JSON data.</p>
<h2 id="user-interfaces">User interfaces</h2>
<p>In addition to these API and data changes, <a href="http://lobid.org">Lobid</a> 2.0 provides improved user interfaces. While the original service only had rudimentary table views for single records and search queries, the new services provide full featured search interfaces including map based visualizations and faceted search.</p>
<hr />
<p><sup>1</sup> Elasticsearch expects consistent types for a specific field (e.g. the field <code class="language-plaintext highlighter-rouge">alternateName</code> should always be a string, or should always be an array), but compact JSON-LD uses a single string if there is only one value, or an array if there are multiple values. Expanded JSON-LD will always create an array, even if it contains a single value only. We would have needed something like compact keys with expanded values, but that is not available (see <a href="https://github.com/json-ld/json-ld.org/issues/338">https://github.com/json-ld/json-ld.org/issues/338</a>).</p>
<p><sup>2</sup> Note that the value is an array here, even though there’s only one medium in this case. Since the data we serve is what we store in the index, we ensure that values are always arrays for fields that can have multiple values. See also footnote 1 above.</p>
Documenting the lobid API, part II: How to document?2017-04-26T00:00:00+00:00Adrian Pohl, Fabian Steeghttp://blog.lobid.org/2017/04/26/api-documentation-2<p>As outlined in <a href="http://blog.lobid.org/2017/02/23/api-documentation-1.html">part I</a>, there are different aspects of an API you need to take into account when working on the documentation: the dataset as a whole, the API calls and response structure, RDF properties and classes, provenance information. In this post we want to share how we approached their documentation for the two services <a href="https://lobid.org/resources/">lobid-resources</a> and <a href="https://lobid.org/organisations/">lobid-organisations</a>, using lobid-organisations as primary example.</p>
<h1 id="high-level-documentation-of-the-dataset">High-level documentation of the dataset</h1>
<p>To give people (as well as machines) a quick overview over the dataset that is provided via the API, we mostly followed the W3C’s <a href="https://www.w3.org/TR/dwbp/#metadata">Data on the Web Best Practices recommendation</a>. The result is a <a href="http://lobid.org/organisations/dataset.jsonld">JSON-LD file</a> describing the dataset, as well as a human-readable <a href="http://lobid.org/organisations/dataset">HTML version</a> of the same information. Note that unlike the W3C recommendation, which uses DC Terms for its examples, we decided to use schema.org properties and classes where possible.</p>
<p><img src="/images/lobid-organisations-description.png" alt="Description of the lobid-organisations data set" /></p>
<p>HTML-version of the lobid-organisations data set description</p>
<h1 id="documenting-the-api">Documenting the API</h1>
<p>The API documentation (<a href="http://lobid.org/organisations/api">lobid-organisations</a>, <a href="http://lobid.org/organisations/api">lobid-resources</a>) introduces basic API request concepts by providing example queries, expands these with some advanced queries on nested fields, and provides details for tricky cases like querying for URLs (which require escaping of special characters). For a full reference on the supported query syntax, we link to the relevant Lucene documentation.</p>
<p>The documentation describes the supported response content types and provides samples for requesting them. We provide complete documentation on using the API to build an autocomplete functionality, including an embedded example in the documentation page.</p>
<p>For the lobid-organisations documentation, we finally describe its specific functionality, like location based queries, CSV export, and OpenRefine reconciliation support.</p>
<h1 id="documentation-by-example">Documentation by example</h1>
<p>When we try to get an understanding of a schema and how it is used, we quickly find ourselves looking out for examples. But examples are often secondary parts of documentation, if given at all. It is common practice to use what can be called a “descriptive approach” of documenting a vocabulary or an application profile by listing elements in tables – often contained within a PDF – and describing their different aspects in various columns.</p>
<p>schema.org is an exception in that it tries to provide examples. But even in schema.org the examples are an appendix to the description and sometimes even missing (e.g. it is hard to learn about how to use <a href="http://schema.org/publication">the publication property</a> and the <a href="http://schema.org/PublicationEvent">publication event class</a>).</p>
<p>We believe that examples should be an integral part of documentation, while we deem page-long tables listing elements of a metadata schema as not very helpful and rather annoying. So we thought about how to put the example in the center of documentation following the bold claim that “<a href="https://twitter.com/acka47/status/791271448245637120">All documentation should be built around examples</a>”.</p>
<h2 id="using-web-annotation-tools-for-api-documentation">Using web annotation tools for API documentation</h2>
<p>A <a href="https://www.programmableweb.com/news/web-api-documentation-best-practices/2010/08/12">blog post on API documentation from 2010</a> says about examples:</p>
<blockquote>
<p>In addition to sample code, having HTTP, XML, and JSON samples of your request and response is important. However, samples only are not sufficient. In addition, you need a description that explains the purpose of the call and you need a table that explains each element. We recommend a table with columns for Name, Type, Description, and Remarks.</p>
</blockquote>
<p>Agreed, that samples alone are not sufficient, but do we really need a table describing each element of our data? When putting the example first, why not attach the structured descriptive data (name, description, etc.) to the example? Today, this is quite easy to achieve with web annotation tools. So we took production examples of our JSON-LD data and annotated them with <a href="https://hypothes.is/">hypothes.is</a>.<sup>1</sup> For lobid-organisations, it was enough to annotate one example file. In order to cover most of the fields used in the lobid-resources data, we had to annotate different kinds of examples (book, periodical, article, series volume).</p>
<p>We chose to annotate each JSON key adding the following information:</p>
<ul>
<li>Name: a human-readable name for the field</li>
<li>Description: a short description of the information in the field</li>
<li>Coverage: the number of resources that have information in this field (Here, you will often find example URLs on how to query the field.)</li>
<li>Use cases: example use cases on what the information from the field can be used for, along with example queries</li>
<li>URI: the RDF property the JSON key is mapped to</li>
<li>Provenance: information about the source data fields the information is derived from</li>
</ul>
<p>While the first two information points (name and description) and the URI can be found in every annotation, the others are not (yet) available for every field. We try to develop a better feeling on how to use the API by adding lots of example queries in the documentation, especially in the “Coverage” and “Use cases” section.</p>
<p>At <a href="[http://lobid.org/organisations/api]">http://lobid.org/organisations/api</a> you can see documentation by annotation in action.<sup>2</sup> Just go to the <a href="http://lobid.org/resources/api#jsonld">JSON-LD section</a> and click on one of the highlighted JSON keys. The hypothes.is side bar will open with information about the data element.</p>
<p><img src="/images/annotation-example.png" alt="Example annotation" /></p>
<p>Example annotation on the “type” key</p>
<h2 id="benefits">Benefits</h2>
<p>The examples taken for documentation should at best be live data from production. Thus, if something changes on the data side, the example – and with it the documentation – automatically updates. For example, if the value of a field changes, the documentation will automatically show the new data. If a specific field was removed in the data, and therefore in the example, the corresponding hypothes.is annotation becomes an “orphan”.</p>
<p>We hope that this documentation approach based on annotation of examples is more useful and more fun than the traditional descriptive approach. It should give people an intuitive and interactive interface for exploring and understanding the data provided by the lobid API. If any questions remain, API users can easily ask questions regarding specific parts of the documentation by replying to a hypothes.is annotation and we will automatically be notified via email.</p>
<p>We are curious what you think about this documentation approach. Let us know by adding an annotation to the whole post (“page note”) or by annotating specific parts.</p>
<hr />
<p><sup>1</sup> At first we planned to directly annotate the JSON files as provided via lobid (e.g. <a href="http://lobid.org/organisations/DE-38M?format=json">this</a>) but people would only be able to see the annotations when using the <a href="https://chrome.google.com/webstore/detail/hypothesis-web-pdf-annota/bjfhmglciegochdpefhhlphglcehbmek">hypothes.is Chrome plugin</a>. Another option is hypothes.is’ <a href="https://via.hypothes.is/">via service</a> but it does <a href="https://github.com/hypothesis/via/issues/79">not support annotation of text files</a>. Thus, we decided to embed the JSON content on-the-fly in a HTML page, and add the hypothes.is script to the page.</p>
<p><sup>2</sup> There is also a <a href="http://lobid.org/organisations/api/de">German version</a>, and the <a href="http://lobid.org/resources/api">lobid-resources documentation</a> solely exists in German.</p>
Which vocabularies to use for bibliographic descriptions?2017-04-19T00:00:00+00:00Christoph Ewertowski, Adrian Pohlhttp://blog.lobid.org/2017/04/19/vocabulary-choices<p>Every Linked Data application builds upon vocabularies. But which ones contain the properties and classes needed for bibliographic descriptions? The topic of this blog post is how we choose specific vocabularies, properties and classes for <a href="http://lobid.org/resources">lobid-resources</a>, what patterns stand behind our choices and the reasons for them.</p>
<h1 id="a-grown-application-profile">A grown application profile</h1>
<p>In the very beginning of lobid (i.e. 2010) one specific bibliographic RDFS vocabulary or OWL ontology that catered to all our needs did not exist. This is even more true today as our Linked Data publication carries much more information than some years ago. Thus, we either needed to create our own ontology or create an application profile based on a number of different vocabularies. We opted for vocabulary reuse as this approach promised to increase interoperability with other linked data sets<sup>1</sup>. Only when we could not find existing properties or classes that fit our purpose and come from an existing vocabulary which looks serious and is still maintained, we would create new ones in <a href="http://purl.org/lobid/lv">lobid vocab</a>. We still follow this approach, although we noticed that some effort is needed to keep up with changes in namespaces (looking at you, RDA!) or completely disappearing vocabularies. Having made these experiences, we might follow another approach if we had to start from scratch today: Creating an application-specific vocabulary as you go along and aligning it with existing vocabularies later definitely makes you focus on creating a sensible data model in the first place without taking over problematic models from others.<sup>2</sup></p>
<p>For six years our used properties and classes developed rather organically and there was no well thought-out, documented strategy for chosing our properties and classes. This changed when we worked on the relaunch of the lobid API. We had to add and replace a lot of properties and finally assessed all properties and classes used in lobid in order to make our application profile as consistent as possible.</p>
<h1 id="finding--choosing-rdf-propertiesclasses">Finding & choosing RDF properties/classes</h1>
<p>For adding labels and variant names of a resource, we chose the <code class="language-plaintext highlighter-rouge">rdfs:label</code> and <code class="language-plaintext highlighter-rouge">skos:altLabel</code> as RDFS and SKOS are two widely-used base vocabularies. Typing of linked entities from the Integrated Authority File (GND) is done using the <a href="http://d-nb.info/standards/elementset/gnd">GND Ontology</a>.</p>
<p>Regarding the other elements, the workflow for finding the right thing to reuse goes as follows: We first look for fitting properties and classes mostly using <a href="http://lov.okfn.org/">Linked Open Vocabularies</a> as search tool and identify which vocabularies provide things specific enough for our purposes. If multiple vocabs have fitting properties/classes we apply the following ranking to make our choice.</p>
<ol>
<li><a href="http://purl.org/dc/terms">DC Terms</a></li>
<li><a href="http://id.loc.gov/ontologies/bibframe">Bibframe 2.0</a></li>
<li><a href="http://bibliontology.com/">Bibliograpic Ontology (Bibo)</a></li>
<li>Resource Description and Access (RDA) <a href="http://www.rdaregistry.info/Elements/u/">Unconstrained Properties</a></li>
<li><a href="http://schema.org/">schema.org</a></li>
<li>Several other vocabularies (MADS, Music Ontology, DC Elements,…) for individual elements</li>
<li><a href="http://purl.org/lobid/lv">Our own vocabulary</a></li>
</ol>
<p>The ranking takes into account different aspects of vocabularies, like: How mature is the vocabulary? Is it well known and does it have a considerable user group? How stable is a vocabulary? Criteria for exclusion are whether vocabulary URIs actually resolve and deliver RDF.</p>
<h1 id="some-examples">Some examples</h1>
<p>To get into more detail: DC is at the first place, simply because it’s a widely adopted standard for basic information about resources.</p>
<p>Since Bibframe is still in development, changes will happen, making it rather unstable for now. However, we are optimistic that the current version 2.0 is stable enough and – on the plus side – we are able to propose changes and improvements as needed. As there is quite a lot interest in Bibframe we also just wanted to get a little bit familiar with it. It already turned out to be quite valuable, for example giving us the opportunity to replace some FRBR-relicts from our data and to model contributions and roles the way we needed, see <a href="https://github.com/hbz/lobid-resources/issues/38#issuecomment-259084607">this comment</a>.</p>
<p>When the information to be expressed in RDF gets more and more library-specific the RDA Unconstrained Properties can often help out. We currently use eight RDA unconstrained properties, e.g. for things like <a href="http://rdaregistry.info/Elements/u/P60489">thesis information</a>, <a href="http://rdaregistry.info/Elements/u/P60517">title of subseries</a> or RDA specific information like <a href="http://rdaregistry.info/Elements/u/P60584">nature of content</a>.</p>
<p>Though we rely on Schema.org as base vocabulary in <a href="http://lobid.org/organisations">lobid-organisations</a>, we sticked to DC, Bibo et al. as basic vocabularies in the context of bibliographic resources. We <a href="https://github.com/hbz/lobid-resources-web/issues/25">intend</a> to add schema.org markup embedded in the HTML for use by search engines etc. But schema.org already convinced us to use its event-based modeling of publication information, see e.g. the “publication” object in <a href="http://lobid.org/resources/HT002213253?format=json">this example file</a>.</p>
<p>In specific cases we draw properties/classes from other sources, for example using MADS for representing <a href="https://github.com/hbz/lobid-resources/issues/187">complex subjects</a> or Music Ontology for typing sheet music.</p>
<p>Finally, we create properties and classes in our own <em>lobid vocab</em> if other relevant vocabularies don’t resolve properly, aren’t available in RDF or if there is no existing vocabulary providing the necessary means at all. This was the case for 11 classes and 18 properties, e.g. when associating isPartOf relations of a resource to a series or multi-volume work with the volume number (see <a href="https://github.com/hbz/lobid-vocabs/issues/39">this issue</a>) or when expressing dataset-specific information like the internal identifier. lobid-vocab can be found at http://purl.org/lobid/lv and is maintained on <a href="https://github.com/hbz/lobid-vocabs/blob/master/lobid-vocab.ttl">GitHub</a>. For convenience it is written in Turtle.</p>
<h1 id="the-result">The result</h1>
<p>Here is an overview over all vocabularies we currently use and how much classes/properties are taken from them:</p>
<table>
<thead>
<tr>
<th>Vocabulary</th>
<th>Properties</th>
<th>Classes</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://purl.org/lobid/lv">lobid-vocab</a></td>
<td>17</td>
<td>11</td>
</tr>
<tr>
<td><a href="http://purl.org/dc/terms/">DC Terms</a></td>
<td>15</td>
<td>1</td>
</tr>
<tr>
<td><a href="http://id.loc.gov/ontologies/bibframe/">Bibframe</a></td>
<td>11</td>
<td>3</td>
</tr>
<tr>
<td><a href="http://rdaregistry.info/Elements/u/">RDA Unconstrained Properties</a></td>
<td>8</td>
<td>-</td>
</tr>
<tr>
<td><a href="http://purl.org/ontology/bibo/">Bibo</a></td>
<td>6</td>
<td>12</td>
</tr>
<tr>
<td><a href="http://schema.org">schema.org</a></td>
<td>5</td>
<td>2</td>
</tr>
<tr>
<td><a href="http://d-nb.info/standards/elementset/gnd">GND Ontology</a></td>
<td>2</td>
<td>8</td>
</tr>
<tr>
<td><a href="http://www.w3.org/2000/01/rdf-schema">RDF Schema</a></td>
<td>2</td>
<td>-</td>
</tr>
<tr>
<td><a href="http://www.loc.gov/mads/rdf/v1">MADS</a></td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td><a href="http://purl.org/ontology/mo/">Music Ontology</a></td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td><a href="http://purl.org/dc/elements/1.1/">DC Elements</a></td>
<td>1</td>
<td>-</td>
</tr>
<tr>
<td><a href="http://www.w3.org/2002/07/owl">OWL</a></td>
<td>1</td>
<td>-</td>
</tr>
<tr>
<td><a href="http://www.w3.org/2004/02/skos/core">SKOS</a></td>
<td>1</td>
<td>-</td>
</tr>
<tr>
<td><a href="http://umbel.org/umbel">UMBEL</a></td>
<td>1</td>
<td>-</td>
</tr>
<tr>
<td><a href="http://www.w3.org/2007/05/powder-s">WDRS</a></td>
<td>1</td>
<td>-</td>
</tr>
<tr>
<td><a href="http://data.archiveshub.ac.uk/def/">ArchivesHub vocab</a></td>
<td>-</td>
<td>1</td>
</tr>
</tbody>
</table>
<p>If you want to know which concrete properties and classes we use, take a look at our <a href="http://lobid.org/resources/context.jsonld">JSON-LD context</a><sup>3</sup> or check out the <a href="http://lobid.org/resources/api#jsonld">documentation</a> (in German).</p>
<p>If you have comments or suggestions for improvement, we would be interested to hear them.</p>
<hr />
<p><sup>1</sup> This benefit hasn’t manifested itself yet, although we also have contributed to the <a href="https://wiki.dnb.de/display/DINIAGKIM/Titeldaten+Gruppe">Gruppe Titeldaten der DINI-AG KIM</a>’s work on defining a common application profile for Linked Library Data in German-speaking countries.</p>
<p><sup>2</sup> Such an approach was taken developing the <a href="https://github.com/digibib/ls.ext">ls.ext</a> library system for Deichman Library, Oslo. Rurik Greenall has promoted this strategy a lot, e.g. in his <a href="https://github.com/brinxmat/presentations/blob/master/2015/ELAG2015.pdf">ELAG2015 talk</a>.</p>
<p><sup>3</sup> To get a simple list run <code class="language-plaintext highlighter-rouge">curl http://lobid.org/resources/context.jsonld | grep '"@id" : "http'| sort -u</code>.</p>
Documenting the lobid API, part I: What to document?2017-02-23T00:00:00+00:00Adrian Pohlhttp://blog.lobid.org/2017/02/23/api-documentation-1<p>The relaunch of lobid-resources and lobid-organisations is scheduled for the end of March. This is an ideal opportunity to improve our documentation. In a series of two blog posts we will examine the basic questions that came up in the process of creating and thinking about documentation for a search API:</p>
<ol>
<li>What should we write documentation about?</li>
<li>How should we provide documentation?</li>
</ol>
<h1 id="the-api">The API</h1>
<p>Approaching the first question, let’s start with a closer look at the lobid API, what it offers and how.</p>
<h2 id="the-data">The data</h2>
<p>lobid serves JSON-LD and HTML, depending on the client. You can choose the format by using content negotiation or by setting a <code class="language-plaintext highlighter-rouge">format</code> parameter. For now, we are relaunching these two services:</p>
<ol>
<li>lobid-organisations: The <a href="https://lobid.org/organisations">/organisations</a> service serves information about German-speaking organisations (mainly libraries, archives and museums). Data sources are the German ISIL registry and the core data of the German Library Statistics (Deutsche Bibliotheksstatistik, DBS).</li>
<li>lobid-resources: The <a href="https://lobid.org/resources">/resources</a> service provides bibliographic data from the hbz union catalog (approximately 20 M records) as Linked Data.</li>
</ol>
<p>This means, lobid is serving data that is created and curated in other systems. For <em>transformation</em> of the data from different sources we use <a href="https://github.com/culturegraph/metafacture-core">Metafacture</a>. While the concrete technology is not relevant for documentation, it is definitely relevant where the data comes from and that it is altered before being provided by lobid.</p>
<h2 id="read-only-json-ld-api">Read-only JSON-LD API</h2>
<p>So we have two services to document. These services currently are read-only, i.e. client interaction in terms of HTTP verbs is limited to GET requests. This makes the documentation of the actual API quite manageable as only few URL paths and their parameters for GET requests have to be documented.</p>
<p>As its underlying technology, lobid uses <a href="https://www.elastic.co/products/elasticsearch">Elasticsearch</a>, a Lucene-based search engine. The JSON-LD resulting from the transformation process is indexed in Elasticsearch and can be queried by anybody using the <a href="https://lucene.apache.org/core/2_9_4/queryparsersyntax.html">Lucene query syntax</a>. We are offering some additional parameters in our web application – implemented with the <a href="https://www.playframework.com/">Play framework</a> – to simplify specific kinds of searches.</p>
<h1 id="what-to-document">What to document?</h1>
<p>Following from the description above, there are different aspects of the API and the data it provides that may be worthy of documentation. Let’s take a look at them, from most to least prioritized in our documentation process.</p>
<h2 id="the-data-set">The data set</h2>
<p>People not familiar with an API first want to quickly assess whether the data provided is actually of interest to them. To get a quick overview over the data set itself, you need to answer questions like: What is the data about? How up-to-date is the data? How many resources are described? How many of each type? Which specific information is available for how many resources? (For example <em>How many bibliographic resources actually have information about the publication date?</em> or <em>How many organisations have geo coordinates associated with them?</em>)</p>
<h2 id="the-api-itself">The API itself</h2>
<p>For enabling interested people to make use of the lobid API, it is of greatest importance to document the API itself as the interface they interact with. Focussing on the API itself and the JSON it serves (without the “LD”), documentation is needed for:</p>
<ol>
<li>the different services, the types of resources they describe and their API parameters</li>
<li>the Lucene query syntax</li>
<li>the query results, i.e. their structure as well as the JSON keys used for a specific resource type and their type of content (URIs, uncontrolled text, controlled values etc.) and whether a key can hold multiple values or only holds one</li>
</ol>
<p>The most work definitely has to be put into 1.) and 3.), while 2.) can be covered by referring to the Lucene documentation.</p>
<h2 id="rdf-vocabularies-properties--classes">RDF vocabularies, properties & classes</h2>
<p>With regard to the data being Linked Data, some people will be interested in the RDF vocabularies and properties/classes we use. Here, a reference to the JSON-LD context document can help (see the contexts for <a href="http://lobid.org/organisations/context.jsonld">lobid-organisations</a> and <a href="http://lobid.org/resources/context.jsonld">lobid-resources</a>). The question is whether this suffices as documentation of the RDF properties and classes used.</p>
<h2 id="provenance-information">Provenance information</h2>
<p>Beyond the identification of the data sources, some people want to know from which concrete field in the source data a specific information is derived and what kind of post-processing is done. This is especially of interest for information professionals who are familiar with the source data sets and want to assess the lobid data. For this, some documentation of the mappings and the transformation process is needed.</p>
<p>In the upcoming post we will take a look at how we plan to provide documentation for the different aspects of the lobid API.</p>
Data modeling client effects2016-12-13T00:00:00+00:00Fabian Steeghttp://blog.lobid.org/2016/12/13/data-modeling-client-effects<p>While <a href="https://github.com/hbz/nwbib/pull/362">working on UI updates</a> for <a href="https://github.com/hbz/lobid-resources/issues/38">changes in our beta API</a>, I noticed an interesting way that these changes affect the client side code.</p>
<p>The basic idea of the data change is to replace different fields for contributors that have different roles like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"contributor": [
{
"id": "http://d-nb.info/gnd/11200668X",
"label": "Winter, Heike"
}
],
"translator": [
{
"id": "http://d-nb.info/gnd/1075675383",
"label": "Mac ‘IlleMhaoil, Gillebrìde"
}
]
</code></pre></div></div>
<p>With a single <code class="language-plaintext highlighter-rouge">contribution</code> field, in which each <code class="language-plaintext highlighter-rouge">agent</code> has a <code class="language-plaintext highlighter-rouge">role</code>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"contribution": [
{
"agent": {
"id": "http://d-nb.info/gnd/11200668X",
"label": "Winter, Heike"
},
"role": {
"id": "http://id.loc.gov/vocabulary/relators/ctb",
"label": "Mitwirkende"
}
},
{
"agent": {
"id": "http://d-nb.info/gnd/1075675383",
"label": "Mac ‘IlleMhaoil, Gillebrìde"
},
"role": {
"id": "http://id.loc.gov/vocabulary/relators/trl",
"label": "Übersetzung"
}
}
]
</code></pre></div></div>
<p>In the client code this allows us to replace something like this (where <code class="language-plaintext highlighter-rouge">@field</code> would use the given label and property to create a <code class="language-plaintext highlighter-rouge"><tr></code> for each field):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@field("Autor/in", "creator")
@field("Redaktion", "redaktor")
@field("Herausgeber/in", "editor")
@field("Mitwirkung", "contributor")
@field("Schauspieler/in", "actor")
@field("Nachwort", "afterwordBy")
@field("Einleitung", "introductionBy")
@field("Drehbuch", "screenwriter")
@field("Mitarbeit", "collaborator")
@field("Komponist/in", "composer")
@field("Dirigent/in", "conductor")
@field("Kamera", "cinematographer")
@field("Sammler/in", "collector")
@field("Kartographie", "cartographer")
@field("Regie", "director")
@field("Widmungsträger/in", "dedicatee")
@field("Stecher/in", "engraver")
@field("Illustration", "illustrator")
@field("Interviewte/r", "interviewee")
@field("Interviewer/in", "interviewer")
@field("Musik", "musician")
@field("Fotografie", "photographer")
@field("Interpret/in", "performer")
@field("Produktion", "producer")
@field("Gesang", "singer")
@field("Gefeierte Person", "honoree")
@field("Übersetzung", "translator")
</code></pre></div></div>
<p>With something like this (the actual implementation groups the contributions with the same role into a single <code class="language-plaintext highlighter-rouge"><tr></code>):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@for(contribution <- contributions) {
<tr>
<td>@(contribution \ "role" \ "label")</td>
<td>@(contribution \ "agent" \ "label")</td>
</tr>
}
</code></pre></div></div>
<p>That is, instead of explicitly listing every field we want to display in the UI, and how to label it, we include the role semantics right in our data, and can process it in a unified way: show all contributions, and label each agent with its role.</p>
Elasticsearch distance scoring2016-12-09T00:00:00+00:00Fabian Steeghttp://blog.lobid.org/2016/12/09/elasticsearch-distance-scoring<p>In our <a href="https://beta.lobid.org/organisations">organisations directory beta</a> we were sorting results by distance to the user, if they share their location. <a href="https://github.com/hbz/lobid-organisations/issues/280">Adrian noticed</a> that this yields confusing results, since the relevance ranking is completely overridden by the distance sorting. A quick research in the fabulous <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/sorting-by-distance.html#scoring-by-distance">Elasticsearch documentation</a> revealed that we actually want to <em>score</em> results by distance, not <em>sort</em> by distance.</p>
<p>The basic solution was straight-forward: <a href="https://github.com/hbz/lobid-organisations/commit/6cf93d84bb88248573b9714d9107151177809740#diff-fdebe9b141e34cc47158f8b5ce8dbf80L322">implement a scoring function</a> that scores the results returned by the regular query based on their distance to the user’s location. We did encounter one issue though: not all our organisations have geo coordinates, and for those with a missing <code class="language-plaintext highlighter-rouge">location.geo</code> field Elasticsearch gives a perfect score.</p>
<p>Elasticsearch might provide <a href="https://github.com/elastic/elasticsearch/issues/18892">a way to specify a value for missing fields</a> in the future, but in the meantime, there’s a <a href="https://github.com/elastic/elasticsearch/issues/18892#issuecomment-226544977">documented workaround</a> that works fine. For our specific setup though, the fact that the workaround includes a script led to some more overhead: we run Elasticsearch in embedded mode and disabled Groovy scripting. So instead of a simple line in the JSON, we implemented it as <a href="https://github.com/hbz/lobid-organisations/blob/6cf93d84bb88248573b9714d9107151177809740/app/controllers/Zero.java">a native script in Java</a>. It’s <a href="https://github.com/hbz/lobid-organisations/commit/6cf93d84bb88248573b9714d9107151177809740#diff-b98324f209179b7ef27fbd183c238193R63">registered when creating the <code class="language-plaintext highlighter-rouge">Node</code></a>.</p>
<p>Once again I’m impressed with all the stuff Elasticsearch offers, it’s a fantastic tool.</p>