Rekordy informacji o dostępności

Informacje

Portal wymaga tylko sumarycznego podzbioru informacji na temat bieżącego statusu dostępności egzemplarzy wybranych rekordów.

Niżej opisany schemat metadanych i ich sposób ich udostępniania w serwerze protokołu OAI-PMH jest podzbiorem standardu ISO 20775 (Schema for Holdings Information).

Zbiór danych stanu dostępności egzemplarzy jest co prawda podzbiorem zbioru danych bibliograficznych, jednak z uwagi na inną częstotliwość zmian - powinny być reprezentowane przez osobne repozytorium OAI-PMH. W szczególności repozytorium zawierające stan dostępności nie będzie zawierało rekordów, które nie są w żaden sposób dostępne dla czytelników (ale posiadają opis bibliograficzny w MARC21).

 

Struktura

Element holding jest obowiązkowy i powtarzalny. Każdy z nich składa się z dwóch elementów - institutionIdentifier i holdingSimple.

Pole danychElement ISO 20775WartośćOpt.Uwagi
Identyfikator placówki

holdings.holding.institutionIdentifier.value

tekst  
Ogólna liczba egzemplarzy

holdings.holding.holdingSimple.copiesSummary.copiesCount

dodatnia liczba całkowita Ogólna liczba egzemplarzy powinna pomijać egzemplarze trwale wycofane z obrotu (np. ubytkowane).
Liczba egzemplarzy dostępnychholdings.holding.holdingSimple.copiesSummary.status.availableCountnieujemna liczba całkowita  
Kod dostępu do zasobuholdings.holding.holdingSimple.copiesSummary.status.availableForcyfra od 0 - 6 

Kod specyfikujący sposób dostępu do zasobu:
        0 - nieokreślony
        1 - wypożyczenie
        2 - fizyczna kopia
        3 - kopia elektroniczna
        4 - dostęp online
        5 - tylko na miejscu (w bibliotece)
        6 - inny

Data najwcześniejszej dostępności zasobuholdings.holding.holdingSimple.copiesSummary.status.earliestDispatchDate  (opcjonalne) data i czas najwcześniejszej możliwej dostępności  zasobu
Długość kolejki oczekującychholdings.holding.holdingSimple.copiesSummary.reservationQueueLengthliczba całkowita (opcjonalnie) - można pominąć, jeśli system biblioteczny nie zezwala na rezerwowanie materiałów w danej placówce
Liczba egzemplarzy niedostępnych (jeszcze) w obrocieholdings.holding.holdingSimple.onOrderCountliczba całkowita (opcjonalnie) - można pominąć, jeśli nie ma takich egzemplarzy

Przykład rekordu

<?xml version="1.0" encoding="UTF-8"?>
<holdings xsi:noNamespaceSchemaLocation="http://www.loc.gov/standards/iso20775/ISOholdings_V1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <holding>
        <institutionIdentifier>
            <value>20</value>
        </institutionIdentifier>
        <holdingSimple>
            <copiesSummary>
                <copiesCount>10</copiesCount>
                <status>
                    <availableCount>0</availableCount>
                    <availableFor>1</availableFor>
                    <earliestDispatchDate>2014-12-17T09:30:47Z</earliestDispatchDate>
                </status>
            </copiesSummary>
            <reservationQueueLength>123</reservationQueueLength>
            <onOrderCount>1</onOrderCount>
        </holdingSimple>
    </holding>
</holdings>

 

Obsługa informacji o dostępności w protokole OAI-PMH

Identify

Jak wcześniej wspomniano, rekordy bibliograficzne i informacja o dostępności egzemplarzy udostępniane są przez oddzielne repozytoria. Każde z nich może w ramach komendy Identify zwracać adres powiązanego repozytorium (tzw. friend). Np. repozytorium główne, będzie informować o "zaprzyjaźnionym" repozytorium informacji o dostępności.

http://an.oa.org/OAI-marc?verb=Identify
<?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>2014-05-21T11:30:30Z</responseDate>
	<request verb="Identify">http://an.oa.org/OAI-marc</request>
	<Identify>
		<repositoryName>Biblioteka X: rekordy bibliograficzne</repositoryName>
		<baseURL>http://an.oa.org/OAI-marc</baseURL>
		<protocolVersion>2.0</protocolVersion>
		<adminEmail>somebody@loc.gov</adminEmail>
		<earliestDatestamp>2010-01-01T12:00:00Z</earliestDatestamp>
		<deletedRecord>persistent</deletedRecord>
		<granularity>YYYY-MM-DDThh:mm:ssZ</granularity>
		<compression>deflate</compression>
		<description>
			<friends xmlns="http://www.openarchives.org/OAI/2.0/friends/" 
			         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			         xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/friends/ http://www.openarchives.org/OAI/2.0/friends.xsd">
				<baseURL>http://an.oa.org/OAI-holdings</baseURL>
			</friends>
		</description>
	</Identify>
</OAI-PMH>

 

ListMetadataFormats

Komenda ListMetadataFormats serwera OAI-PMH powinna zwracać dostępny format metadanych o identyfikatorze iso20775

<metadataFormat>
    <metadataPrefix>iso20775</metadataPrefix>
    <schema>http://www.loc.gov/standards/iso20775/ISOholdings_V1.0.xsd</schema>
    <metadataNamespace>http://www.loc.gov/standards/iso20775/</metadataNamespace>
</metadataFormat>

 

ListRecords

Komenda ListRecords serwera OAI-PMH, w przypadku selektywnego pobierania danych o dostępności będzie miała np. taką postać:

Zapytanie

http://an.oa.org/OAI-holdings?
       verb=ListRecords&from=2014-05-15T10:15:00Z&metadataPrefix=iso20775

 

Odpowiedź

<?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>2014-05-21T11:30:30Z</responseDate>
	<request verb="ListRecords" from="2014-05-15T10:15:00Z" metadataPrefix="iso20775">http://an.oa.org/OAI-holdings</request>
		<ListRecords>
		<record>
			<header>
				<identifier>oai:xyz.org:9901001</identifier>
				<datestamp>2014-05-15T11:12:32Z</datestamp>
			</header>
			<metadata>
				<holdings xmlns="http://www.loc.gov/standards/iso20775/"
				          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
						  xsi:schemaLocation="http://www.loc.gov/standards/iso20775/ http://www.loc.gov/standards/iso20775/ISOholdings_V1.0.xsd">
					<holding>
						<institutionIdentifier>
							<value>20</value>
						</institutionIdentifier>
						<holdingSimple>
							<copiesSummary>
								<copiesCount>10</copiesCount>
								<status>
									<availableCount>3</availableCount>
									<availableFor>1</availableFor>
								</status>
								<status>
									<availableCount>1</availableCount>
									<availableFor>5</availableFor>
								</status>
							</copiesSummary>
							<reservationQueueLength>0</reservationQueueLength>
							<onOrderCount>1</onOrderCount>
						</holdingSimple>
					</holding>
					<holding>
						<institutionIdentifier>
							<value>30</value>
						</institutionIdentifier>
						<holdingSimple>
							<copiesSummary>
								<copiesCount>1</copiesCount>
							</copiesSummary>
							<reservationQueueLength>5</reservationQueueLength>
						</holdingSimple>
					</holding>
				</holdings>
			</metadata>
		</record>
	</ListRecords>
</OAI-PMH>

Usuwanie dostępności

W przypadku usuwania z obrotu egzemplarzy (ubytkowanie, itp.), jeśli usuwany jest jedyny dostępny egzemplarz przypisany do danego rekordu - należy zwracać informację o usunięciu całego rekordu z repozytorium. Informacja o usunięciu musi być trwała (dla rekordów, które kiedykolwiek zostały udostępnione w tym repozytorium). Nie ma natomiast potrzeby (i sensu) zwracać jako usunięte rekordów, które nigdy nie miały żadnych egzemplarzy wprowadzonych do obrotu lub usunięto z obrotu wszystkie egzemplarze przed pierwszym uruchomieniem serwera.

Przykładowa odpowiedź ListRecords zawierająca informację o usunięciu stanu dostępności
<?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>2014-05-21T11:30:30Z</responseDate>
	<request verb="ListRecords" from="2014-05-15T12:15:00Z" metadataPrefix="iso20775">http://an.oa.org/OAI-holdings</request>
	<ListRecords>
		<record>
			<header status="deleted">
				<identifier>oai:xyz.org:9901002</identifier>
				<datestamp>2014-05-15T12:11:55Z</datestamp>
			</header>
		</record>
	</ListRecords>
</OAI-PMH>

 

Long polling

Klient protokołu OAI-PMH wykorzystywany do pobierania informacji o zmianach wprowadza niestandardowe rozszerzenie składni dla ListRecords - opcjonalny parametr x-wait - który powoduje, że serwer OAI-PMH - w przypadku braku rekordów dla zadanego zakresu czasu - zawiesza odpowiedź do momentu pojawienia się jakiegoś rekordu (lub - o ile podany jest parametr until - do podanego momentu). Taki mechanizm pozwala ograniczyć częstotliwość zapytań do serwera OAI-PMH. Wykorzystywany jest on tylko dla komendy ListRecords i tylko w przypadku pobierania najświeższych (bieżących) informacji o zmianach w stanie dostępności.

Mechanizm ten polega na żądaniu od serwera listy zmian dla podanego zakresu czasu - od chwili ostatniej pobranej zmiany do chwili "z przyszłości". Przykład:

Czas ostatniej pobranej zmiany: 2014-05-01T17:00:00Z
Bieżący czas: 2014-05-01T17:20:14Z

http://an.oa.org/OAI-holdings?
       verb=ListRecords&from=2014-05-01T17:00:00Z&until=2014-05-01T17:30:00&x-wait=True&metadataPrefix=iso20775

Przypadek standardowego serwera:

  • serwer nie zna parametru x-wait, dlatego zwraca błąd badArgument
  • klient OAI wywołuje ListRecords bez parametru x-wait co ustalony przedział czasu (np. co minutę)

Przypadek serwera obsługującego long polling:

  • jeśli od podanego czasu (from) zaszły zmiany, wysyła je natychmiast.
  • jeśli nie - oczekuje na pojawienie się zmian, aż do osiągnięcia podanego czasu (until)
  • jeśli pojawi się jakaś zmiana: serwer wysyła listę zmienionych rekordów (uprzednio upewniwszy się, że z danym znacznikiem czasu nie będzie już kolejnych zmian innych rekordów: np. może poczekać z odpowiedzią do końca sekundy)
  • jeśli nie pojawi się żadna zmiana, a osiągnie moment podany parametrem until - wyśle błąd noRecordsMatch
  • klient wykonuje ponowne zapytanie przesuwając znacznik czasu until dalej w przyszłość.