Tellico: Z39.50 (Aleph) Abfrage

Nachfolgend ein paar Angaben zur Installation und Anpassung von Tellico für die Abfrage des Aleph-Servers.

Tellico ist als FLOSS (Free/Libre Open Source Software) und kann von Tellico-Project.Org heruntergeladen werden. Dort finden sich auch Angaben zur Installation.

Konfigurationsdateien Tellico

Zum Import der Aleph-IDs in Tellico sind Modifikationen in /usr/share/kde4/apps/tellico nötig – die Dateien MARC21slim2MODS3.xsl sowie mods2tellico.xsl müssen zur besseren Nutzung des Z39.50 von Aleph ausgetauscht werden.

Hier sind die entsprechend modifizierten Dateien: MARC21slim2MODS3.xsl sowie mods2tellico.xsl.

Auch die Tellico Datei selbst muß entsprechend modifiziert werden, damit die neuen Felder auch wiedergegeben werden können.

Hier ist das Modell der Tellico Datei als XML Datei Aleph3.xml bzw. als TC Datei Aleph3.tc (die beiden Dateien sind inhaltlich identisch).

Z39.50 Parameter

Hier die Parameter zu Nutzung von Aleph über Z39.50:

Host: aleph.mpg.de
Port: 9991
Database: KUB01
Character set: utf-8
Format: MARC21

Step 1: Anlegen eines neuen Servers (hier “Aleph”)

Step 2: Eingabe der Parameter

Testen von Tellico

Wenn alles funktioniert hat, lassen sich die Aleph Datensätze nun leicht importieren:

Fur eine beispielhafte Abfrage mit anschließendem Import siehe auch hier.

Update 2015

Seit ca. April 2015 ist der Aleph Zugang über die MPG stark eingeschränkt: Titel sind nur teilweise abrufbar, Autorennamen werden mit allen (sic) Ansetzungsformen ausgegeben etc.

Wir empfehlen daher, direkt auf den BVB Server auszuweichen. Hier die Parameter zu Nutzung des BVB Servers über Z39.50:

Source name:

BVB
Host: bvbr.bib-bvb.de
Port: 9991
Database: BVB01MCZ
Character set: utf-8
Format: MARC21
User: Z39-SUCHE
Password: SUCHE01td>

Hier (link) mehr zu den Parametern. Bei Nutzung der MARC-Ausgabe in Tellico ist es jedoch nötig, MARC21 zu wählen statt USMARC.

Posted in Aleph | Tagged | Leave a comment

Open Data: OAI Schnittstelle

Die BVB stellt alle ab dem 13. Juni 2012 aufgenommenen Datensätze als Open Data zum Harvesting mittels OAI Schnittstelle bereit (link). Die Schnittstelle besitzt zwei Nutzungsmöglichkeiten: Harvesting der Daten sowie ein gezielter Zugriff auf eine bestimmte Ressource.

Seitenweises Harvesting der OAI Daten

Die Standardprozedur ist das Harvesting der Daten über die OAI Schnittstelle. Dabei werden jeweils 60 Datensätze pro Abfrage zurückgegeben.
Die Abfrage der OAI Daten über http://bvbr.bib-bvb.de:8991/aleph-cgi/oai/oai_opendata.pl?verb=ListRecords&set=OpenData&metadataPrefix=marc21 (Link) hat folgendes Ergebnis:

<? xml version = "1.0" encoding = "UTF-8" ?> 
<OAI-PMH xmlns = "http://www.openarchives.org/OAI/2.0/" 
 xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation = "http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd" > 
 <responseDate> 2012-06-30T10:37:43Z </responseDate> 
 <request verb = "ListRecords" metadataPrefix = "marc21" set = "OpenData" 
 > http://bvbr.bib-bvb.de:8991/OAI </request> 
 <ListRecords> 
 <record> 
 <header> 
 <identifier> oai:aleph.bib-bvb.de:BVB01-009227072 </identifier> 
 <datestamp> 2012-05-14T03:32:49Z </datestamp> 
 <setSpec> OpenData </setSpec> 
 </header> 
 <metadata> 
 <marc:record xmlns:marc = "http://www.loc.gov/MARC21/slim" 
 xsi:schemaLocation = "http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" > 
 <marc:leader> nam a22 z 4500 </marc:leader> 
 <marc:controlfield tag = "001" > BV013518582 </marc:controlfield> 
 <marc:controlfield tag = "008" > 010105s1704 m||| 00||| lat d </marc:controlfield> 
 <marc:datafield tag = "024" ind1 = "8" ind2 = "" > 
 <marc:subfield code = "a" > VD18 11037164-003 </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "035" ind1 = "" ind2 = "" > 
 <marc:subfield code = "a" > (OCoLC)635154708 </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "040" ind1 = "" ind2 = "" > 
 <marc:subfield code = "a" > DE-604 </marc:subfield> 
 <marc:subfield code = "e" > rakwb </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "049" ind1 = "" ind2 = "" > 
 <marc:subfield code = "a" > SBR01 </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "100" ind1 = "1" ind2 = "" > 
 <marc:subfield code = "a" > Schoepffer, Johann Joachim </marc:subfield> 
 <marc:subfield code = "d" > 1661-1719 </marc:subfield> 
 <marc:subfield code = "0" > (DE-588)101051859 </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "245" ind1 = "1" ind2 = "0" > 
 <marc:subfield code = "a" > Dissertatio Iuridica Inauguralis De Iuramento 
 Iudiciali, Sine Probationibus Delato </marc:subfield> 
 <marc:subfield code = "c" > Quam ... Praeside .. Dn. Johan. Joachimo 
 Schoepffero ... Submittit Franc. Ernest. Kohl, Raceb.-Meclenburgens. ... 
 </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "260" ind1 = "" ind2 = "" > 
 <marc:subfield code = "a" > Rostochii </marc:subfield> 
 <marc:subfield code = "b" > Weppling </marc:subfield> 
 <marc:subfield code = "c" > [1704] </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "300" ind1 = "" ind2 = "" > 
 <marc:subfield code = "a" > 24 S. </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "700" ind1 = "1" ind2 = "" > 
 <marc:subfield code = "a" > Kohl, Franz Ernst </marc:subfield> 
 <marc:subfield code = "d" > 1667-1738 </marc:subfield> 
 <marc:subfield code = "0" > (DE-588)122099354 </marc:subfield> 
 </marc:datafield> 
 <marc:datafield tag = "940" ind1 = "2" ind2 = "" > 
 <marc:subfield code = "r" > DE-3 </marc:subfield> 
 </marc:datafield> 
 </marc:record> 
 </metadata> 
 </record> 
 <[59 more records ... ] > 
 <resumptionToken> 201205140341389999999999999999OpenData:OAI-MARC21 </resumptionToken> 
 </ListRecords> 
</OAI-PMH>

Gezielte Abfrage nach ID

Daneben ist jedoch auch ein gezieltes Abfragen nach einer bestimmten ID möglich, — ähnlich wie es auch Z39.50 vorsieht.

Beispielsweise gibt die Abfrage nach der ID BV013518582 über die Parameter GetRecord sowie identifier gezielt den Datensatz in MARC21 zurück.

Die vollständige URL lautet dabei: http://bvbr.bib-bvb.de:8991/aleph-cgi/oai/oai_opendata.pl?verb=GetRecord&identifier=BV013518582&metadataPrefix=marc21 (Link).

Hier das Ergebnis:

<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<responseDate>2012-07-01T09:57:00Z</responseDate>
<request verb="GetRecord" identifier="oai:aleph.bib-bvb.de:BVB01-009227072"
 metadataPrefix="marc21">http://bvbr.bib-bvb.de:8991/OAI</request>
<GetRecord>
<record>
<header>
<identifier>oai:aleph.bib-bvb.de:BVB01-009227072</identifier>
<datestamp>2012-05-14T03:32:49Z</datestamp>
<setSpec>OpenData</setSpec>
</header>
<metadata>
<marc:record xmlns:marc="http://www.loc.gov/MARC21/slim" 
 xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<marc:leader>nam a22 z 4500</marc:leader>
<marc:controlfield tag="001">BV013518582</marc:controlfield>
<marc:controlfield tag="008">010105s1704 m||| 00||| lat d</marc:controlfield>
<marc:datafield tag="024" ind1="8" ind2="">
<marc:subfield code="a">VD18 11037164-003</marc:subfield>
</marc:datafield>
<marc:datafield tag="035" ind1="" ind2="">
<marc:subfield code="a">(OCoLC)635154708</marc:subfield>
</marc:datafield>
<marc:datafield tag="040" ind1="" ind2="">
<marc:subfield code="a">DE-604</marc:subfield>
<marc:subfield code="e">rakwb</marc:subfield>
</marc:datafield>
<marc:datafield tag="049" ind1="" ind2="">
<marc:subfield code="a">SBR01</marc:subfield>
</marc:datafield>
<marc:datafield tag="100" ind1="1" ind2="">
<marc:subfield code="a">Schoepffer, Johann Joachim</marc:subfield>
<marc:subfield code="d">1661-1719</marc:subfield>
<marc:subfield code="0">(DE-588)101051859</marc:subfield>
</marc:datafield>
<marc:datafield tag="245" ind1="1" ind2="0">
<marc:subfield code="a">Dissertatio Iuridica Inauguralis De Iuramento 
Iudiciali, Sine Probationibus Delato</marc:subfield>
<marc:subfield code="c">
Quam ... Praeside .. Dn. Johan. Joachimo Schoepffero ... Submittit Franc. Ernest. 
Kohl, Raceb.-Meclenburgens. ...
</marc:subfield>
</marc:datafield>
<marc:datafield tag="260" ind1="" ind2="">
<marc:subfield code="a">Rostochii</marc:subfield>
<marc:subfield code="b">Weppling</marc:subfield>
<marc:subfield code="c">[1704]</marc:subfield>
</marc:datafield>
<marc:datafield tag="300" ind1="" ind2="">
<marc:subfield code="a">24 S.</marc:subfield>
</marc:datafield>
<marc:datafield tag="700" ind1="1" ind2="">
<marc:subfield code="a">Kohl, Franz Ernst</marc:subfield>
<marc:subfield code="d">1667-1738</marc:subfield>
<marc:subfield code="0">(DE-588)122099354</marc:subfield>
</marc:datafield>
<marc:datafield tag="940" ind1="2" ind2="">
<marc:subfield code="r">DE-3</marc:subfield>
</marc:datafield>
</marc:record>
</metadata>
</record>
</GetRecord>
</OAI-PMH>

Nicht implementiert ist hingegen eine Abfrage nach beliebigen Inhalten bzw. MARC21-Feldern — eine Abfrage nach Titel oder Autor ist also bislang nicht möglich.

! Fehlermeldung !

Die gezielte Abfrage nach einer Ressource der BHRom, z.B. nach einer Anzeige der ID BV038964466 (print Ressource) bzw. nach der ID BV038967721 (die entsprechende “elektronische” Ressource, dazu später mehr) gibt momentan jedoch die folgende Fehlermeldung aus:

<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<responseDate>2012-07-01T10:01:20Z</responseDate>
<request>http://bvbr.bib-bvb.de:8991/OAI</request>
<error code="cannotDisseminateFormat">the format is not supported by the item</error>
</OAI-PMH>

Ist der Zugriff auf die Ressourcen der BHRom über die OAI Schnittstelle aus irgendeinem Grund (noch?) gesperrt?

Posted in Aleph | Leave a comment

A Proposal for Annotating Resources


Annotations to one target, multiple targets or between targets

The annotation models proposed here are a work in progress, developed in meetings with
the XML Group (Dirk Wintergruen, Robert Casties). There are also some classes we added
when looking at Rainer Simon’s work on Yuma.Min. Any errors presented here are but my
own.

We settled on the following use cases: simple annotations in the manner of stickers,
annotations to multiple targets, and annotations which establish a relationship between
two targets — a constant problem for triple storage which we can overcome by defining
the first target actually as body.

Simple Annotations

In the case of simple annotations regarding just one target — much in the manner of
Post-It stickers — and relating to the whole target body the RDF model is quite
simple:

Simple 1-target annotation model

The RDF model would look like this (link):

ex:Anno   a oac:Annotation ,
          oac:hasTarget ex:HDFI-1 ,
          oac:hasBody ex:uuid .
ex:uuid   a oac:Body ,
          a cnt:ContentAsText ,
          cnt:chars "This image is very impressive!" ,
          cnt:characterEncoding "utf-8" .
ex:HDFI-1 a oac:Target .

The OAC model also provides for the definition of fragments, which act much like narrowing
down the target. Instead of using these target fragments, though, we prefer the OAC
constraint model — and for a reason: the use of constraints allows us to separate much
more strictly the general target (in pilot talk, the “target area”) and the exact
constraint (the “landing spot”). We think this is a better approach in terms of the
underlying logic, and even more so in the case of multiple targets (which we discuss
below).

OAC 1-target constraint model

The RDF model would look like this (link):

ex:Anno   a oac:Annotation ,
          oac:hasTarget uu1 ,
          oac:hasBody tw:6312261983 .
uu1       a oac:ConstrainedTarget ,
          oac:constrains ex:HDFI-1 ,
          oac:constrainedBy uu2 .
uu2       a oac:BoxConstraint ,
          img:x 100 ,
          img:y 500 ,
          img:w 250 ,
          img:h 150 .
tw:6312261983 a oac:Body .

Another reason for preferring the constraint model was the possibility to use constraint
specific predicates which define the boundaries, for example character strings before or
after a certain text. This in addition to the XPointer model, thus giving extra security
to be able to locate a text passage even if the ID/XPointer model has become useless
(e.g. after an unfortunate update including all IDs).

OAC 1-target constraint predicates model

Annotations to multiple targets

In the case of annotations to multiple targets — where all targets are thought to be
equal — not much has changed, if not the duplication of targets. Note that by
introducing groups (RDF “bags”) we could further structure these targets — but we’re
not sure, ultimately, if this is going to be a real-world scenario. Anyway, the
following OAC model applies:

OAC n-target model

The RDF model would look like this (link):

ex:Anno a oac:Annotation ,
        oac:hasTarget ex:HDFI-1 ,
        oac:hasTarget ex:HDFI-2 ,
        oac:hasBody tw:10994605527 .
ex:HDFI-1 a oac:Target .
ex:HDFI-2 a oac:Target .
tw:10994605527 a oac:Body .

Relationships between targets

The OAC model does not provide for a scenario where an annotation targets two bodies and
at the same time establishes a relationship bewteen them. A classic case is an
annnotation pointing to a chapter X in text A and a chapter Y in text B commenting that
text B/Y is a copy (translation, transcription, ecc.) of text A/X.

We can overcome this problem by making text A/X the body (sic) of the annotation, text
B/Y the target and introducing the rdf:type class for establishing the kind of
relationship. The following OAC model applies:

OAC body-target relationship model

The RDF model would look like this (link):

ex:Anno   a oac:Annotation ,
          oac:hasTarget ex:HDFI-1 ,
          oac:hasBody ex:HDFV .
ex:HDFI-1 a oac:Target .
ex:HDFV   a oac:Body .

Replies to Annotations

Replies to annotations just cite the uuid of the referenced annotation as target. The
following OAC model gives an example, although an unnecessarily complex one because it
models the original annotation and the reply annotation together. Instead, a normal use
case would be two separate instances.

OAC reply model

The RDF model would look like this (link):

ex:Ann2 a oac:Reply ,
        oac:hasBody ex:12665505503 ,
        oac:hasTarget ex:Anno .
ex:Anno a oac:Annotation ,
        oac:hasBody ex:12665463062 ,
        oac:hasTarget ex:HDFI-1 .
ex:HDFI-1 a oac:Target .
tw:12665505503 a oac:Body .
tw:12665463062 a oac:Body .	

The relevant classes

Below a list of classes for the models discussed above. For the sake of convenience we
don’t include namespaces here.

rdf:type cnt:ContentAsText
ex:BoxConstraint
oac:Constraint
oac:Annotation
oac:Reply
oac:Translation
oac:Transcription
oac:Descendant …
the relationship type (text, image, constraints, …)
oac:hasBody uuid the body’s unique id
cnt:characterEncoding UTF-8 the message encoding – we prefer UTF-8 all the way
cnt:chars string the text payload
oac:hasTarget uuid the target’s unique ID
oac:constrains uuid the (constrained) target’s unique ID
img:x
img:y
img:w
img:h
integer * the image constraints, expressed using y: topLeft from top,
x: topLeft from left,
h: bottomRight from
top,
w: bottomRight from left
* Alternatively, fractions of 1 (0-1) are allowed for interaction with DigiLib.
oac:constrainedBy uuid the (constrained) body’s unique ID
xp:constrained XPointer the target string, constrained between two XPointers.
xp:before XPointer the string, defined by an XPointer, immediately before the constraint.
xp:after XPointer the string, defined by an XPointer, immediately after the constraint.
foaf:name URI the creator’s name
foaf:mbox URI the creator’s email
dcterms:creator string the creator group
dcterms:created string the time the comment was created, expressed in seconds
tags string optional user-defined tags, separated by comma. Note: not part of OAC.
scope public
private
the scope of the comment, i.e. public or private. Default is “public”. Note: not
part of OAC.
Posted in Annotation | Tagged | Leave a comment