Commit 9cbdf261 authored by Günter Hipler's avatar Günter Hipler
Browse files

implementation of from / until parameters for List* verbs

parent 65edcd8a
......@@ -6,7 +6,7 @@ import org.elasticsearch.action.get.GetRequest
import org.elasticsearch.action.search.{SearchRequest, SearchResponse, SearchScrollRequest}
import org.elasticsearch.client.{RequestOptions, RestHighLevelClient}
import org.elasticsearch.common.unit.TimeValue
import org.elasticsearch.index.query.QueryBuilders
import org.elasticsearch.index.query.{QueryBuilders, RangeQueryBuilder}
import org.elasticsearch.search.builder.SearchSourceBuilder
import org.joda.time.DateTime
import org.swissbib.memobase.oai.common.util.{ESResumptionTokenHelper, ResumptionToken}
......@@ -36,83 +36,52 @@ trait ElasticsearchComponent extends OaiRepository {
metadataPrefix: String): Option[ResultList] = {
//todo - more / better / tested handling for different parameters
//scroll API: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-search-scroll.html
val searchResponse:Try[SearchResponse] = (from, until, set, resumptionToken, metadataPrefix) match {
case (Some(from), Some(until),_,None,_) =>
//for the moment
val searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery())
val searchRequest = new SearchRequest().source(searchSourceBuilder).indices(index).scroll(TimeValue.timeValueMinutes(3L))
Try[SearchResponse] {client.get.search(searchRequest, RequestOptions.DEFAULT)}
case (_, _,_,Some(resumptionToken),_) =>
val scrollRequest = new SearchScrollRequest(resumptionToken.subject);
scrollRequest.scroll(TimeValue.timeValueMinutes(3L));
Try[SearchResponse] {client.get.scroll(scrollRequest, RequestOptions.DEFAULT);}
//only for the moment until we have better data
case (_, _,_,_,_) =>
//for the moment
val searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery())
val searchRequest = new SearchRequest().source(searchSourceBuilder).indices(index).scroll(TimeValue.timeValueMinutes(3L))
Try[SearchResponse] {client.get.search(searchRequest, RequestOptions.DEFAULT)}
}
searchResponse match {
case Success(searchResponse) =>
val si = searchResponse.getScrollId
//scroll_id is always the same -> for this specific context
//condition to finish the fetching is to compare the length of the resultlist
//compare: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html
//otherwise we will get into an empty loop
val scrollId = if (searchResponse.getHits.getHits.length == 0) Option.empty[String] else Option(searchResponse.getScrollId)
val resumptionToken: Option[ResumptionToken] = scrollId.map(
ESResumptionTokenHelper(_))
val rqB = QueryBuilders
.rangeQuery("lastUpdatedDate")
.gte(from).format("strict_date_time")
.lte(until).format("strict_date_time")
val myMap = searchResponse.getHits.getHits.map(hit => (hit.getId, hit.getSourceAsMap)).map(
sourceTuple => (sourceTuple._1, Json2XML.singleJsonDoc2Xml(
Json.parse(play.libs.Json.toJson(sourceTuple._2).toString))))
val searchSourceBuilder = new SearchSourceBuilder().query(rqB).size(30)
val searchRequest = new SearchRequest().source(searchSourceBuilder).indices(index).scroll(TimeValue.timeValueMinutes(3L))
Option( ResultList(resumptionToken, Option(myMap.toSeq)))
case Failure(exception) =>
//todo we have to do something!!
Option.empty
}
Try {client.get.search(searchRequest, RequestOptions.DEFAULT)}
}
case (Some(from), None ,_,None,_) =>
//for the moment
val rqB = QueryBuilders
.rangeQuery("lastUpdatedDate")
.gte(from).format("strict_date_time")
val searchSourceBuilder = new SearchSourceBuilder().query(rqB)
val searchRequest = new SearchRequest().source(searchSourceBuilder).indices(index).scroll(TimeValue.timeValueMinutes(3L))
override def listRecords1(from: Option[String],
until: Option[String],
set: Option[String],
resumptionToken: Option[ResumptionToken],
metadataPrefix: String): Option[ResultListNew] = {
Try {client.get.search(searchRequest, RequestOptions.DEFAULT)}
val searchResponse:Try[SearchResponse] = (from, until, set, resumptionToken, metadataPrefix) match {
case (Some(from), Some(until),_,None,_) =>
case (None, Some(until) ,_,None,_) =>
//for the moment
val searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery())
val rqB = QueryBuilders
.rangeQuery("lastUpdatedDate")
.lte(until).format("strict_date_time")
val searchSourceBuilder = new SearchSourceBuilder().query(rqB)
val searchRequest = new SearchRequest().source(searchSourceBuilder).indices(index).scroll(TimeValue.timeValueMinutes(3L))
Try[SearchResponse] {client.get.search(searchRequest, RequestOptions.DEFAULT)}
Try {client.get.search(searchRequest, RequestOptions.DEFAULT)}
case (_, _,_,Some(resumptionToken),_) =>
val scrollRequest = new SearchScrollRequest(resumptionToken.subject);
scrollRequest.scroll(TimeValue.timeValueMinutes(3L));
Try[SearchResponse] {client.get.scroll(scrollRequest, RequestOptions.DEFAULT);}
val scrollRequest = new SearchScrollRequest(resumptionToken.subject)
scrollRequest.scroll(TimeValue.timeValueMinutes(3L))
Try[SearchResponse] {client.get.scroll(scrollRequest, RequestOptions.DEFAULT)}
//only for the moment until we have better data
case (_, _,_,_,_) =>
//for the moment
val searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery())
val searchRequest = new SearchRequest().source(searchSourceBuilder).indices(index).scroll(TimeValue.timeValueMinutes(3L))
Try[SearchResponse] {client.get.search(searchRequest, RequestOptions.DEFAULT)}
Try {client.get.search(searchRequest, RequestOptions.DEFAULT)}
}
......@@ -125,7 +94,7 @@ trait ElasticsearchComponent extends OaiRepository {
//condition to finish the fetching is to compare the length of the resultlist
//compare: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html
//otherwise we will get into an empty loop
val scrollId = if (searchResponse.getHits.getHits.length == 0) Option.empty[String] else Option(searchResponse.getScrollId)
val scrollId = if (searchResponse.getHits.getHits.length < 30) None else Option(searchResponse.getScrollId)
val resumptionToken: Option[ResumptionToken] = scrollId.map(
ESResumptionTokenHelper(_))
......@@ -145,7 +114,7 @@ trait ElasticsearchComponent extends OaiRepository {
).toSeq
Option( ResultListNew(resumptionToken, Option(contentList)))
Option( ResultList(resumptionToken, Option(contentList)))
case Failure(exception) =>
//todo we have to do something!!
Option.empty
......@@ -154,6 +123,7 @@ trait ElasticsearchComponent extends OaiRepository {
}
override def listIdentiers(from: Option[String],
until: Option[String],
set: Option[String],
......@@ -167,21 +137,39 @@ trait ElasticsearchComponent extends OaiRepository {
override def getRecord(identifier: String,
metadataPrefix: String): Option[(String, Elem)] = {
metadataPrefix: String): Option[(String, OAIContent)] = {
val getRequest = new GetRequest(index, identifier)
val getResponse = client.get.get(getRequest, RequestOptions.DEFAULT)
//todo: what if response is empty?
val sM: Option[(String, util.Map[String, AnyRef])] = Option( (getResponse.getId,getResponse.getSourceAsMap))
sM.map(tuple => (tuple._1,Json2XML.singleJsonDoc2Xml(Json.parse(play.libs.Json.toJson(tuple._2).toString))))
//sM.map(tuple => (tuple._1,Json2XML.singleJsonDoc2Xml(Json.parse(play.libs.Json.toJson(tuple._2).toString))))
sM.map(tuple => {
val esId = tuple._1
val esSourceMap = tuple._2.asScala
(
esId,
OAIContent(esId,
esSourceMap.getOrElse("id","").toString,
esSourceMap.getOrElse("document","").toString,
esSourceMap.getOrElse("format","").toString,
esSourceMap.getOrElse("published",false).asInstanceOf[Boolean],
esSourceMap.getOrElse("recordset",new util.ArrayList[String]()).asInstanceOf[util.ArrayList[String]].asScala.toList,
esSourceMap.getOrElse("institution",new util.ArrayList[String]()).asInstanceOf[util.ArrayList[String]].asScala.toList,
esSourceMap.getOrElse("lastUpdatedDate", "").asInstanceOf[String])
)
//(tuple._1,Json2XML.singleJsonDoc2Xml(Json.parse(play.libs.Json.toJson(tuple._2).toString))))
//val myMap = searchResponse.getHits.getHits.map(hit => (hit.getId, hit.getSourceAsMap)).map(
// sourceTuple => (sourceTuple._1, Json2XML.singleJsonDoc2Xml(
// Json.parse(play.libs.Json.toJson(sourceTuple._2).toString))))
//Option(myMap.toSeq)
})
}
}
......@@ -17,12 +17,6 @@ trait OaiRepository {
resumptionToken: Option[ResumptionToken],
metadataPrefix: String): Option[ResultList]
def listRecords1(from: Option[String],
until: Option[String],
set: Option[String],
resumptionToken: Option[ResumptionToken],
metadataPrefix: String): Option[ResultListNew]
def listIdentiers(from: Option[String],
......@@ -33,7 +27,7 @@ trait OaiRepository {
def getRecord(identifier: String,
metadataPrefix: String
): Option[(String, Elem)]
): Option[(String, OAIContent)]
......
......@@ -80,7 +80,8 @@ case class GetRecordResponse(runner: GetRecordRunner) extends OaiResponse {
makeHeader(identifier = runner.result.get._1) }
{if (runner.result.nonEmpty)
<metadata>
{runner.result.get._2}
{XML.loadString(runner.result.get._2.document)}
</metadata>}
{if (runner.result.isEmpty)
<metadata/>}
......@@ -154,7 +155,8 @@ case class ListIdentifiersResponse(runner: OaiRequestRunner) extends OaiResponse
{
runner.resultList.get.result.get.map(
node => {
{makeHeader(identifier = node._1)}
{makeHeader(identifier = node.docId,
datestamp = Instant.parse(node.updateDate))}
}
)
}
......@@ -225,10 +227,11 @@ case class ListRecordsResponse(runner: OaiRequestRunner) extends OaiResponse {
elem ++
<ListRecords>
{
runner.resultListnew.get.result.get.map(
runner.resultList.get.result.get.map(
node => {
<record>
{makeHeader(identifier = node.docId)}
{makeHeader(identifier = node.docId,
datestamp = Instant.parse(node.updateDate))}
<metadata>{XML.loadString(node.document)}</metadata>
</record>
}
......@@ -243,8 +246,8 @@ case class ListRecordsResponse(runner: OaiRequestRunner) extends OaiResponse {
)
*/
{if (runner.resultListnew.get.repositoryToken.isDefined) {
<resumptionToken>{runner.resultListnew.get.repositoryToken.get.token}</resumptionToken>
{if (runner.resultList.get.repositoryToken.isDefined) {
<resumptionToken>{runner.resultList.get.repositoryToken.get.token}</resumptionToken>
}}
}
......
package org.swissbib.memobase.oai.runner
import modules.OaiRepository
import modules.{OAIContent, OaiRepository}
import org.swissbib.memobase.oai.request.{BadArgumentsReq, GetRecordReq, IdentifyReq, ListIdentifiersReq, ListIdentifiersReqExclusive, ListMetadataFormatsReq, ListRecordsReq, ListRecordsReqExclusive, ListSetsReq, ListSetsReqExclusive}
import org.swissbib.memobase.oai.response.{BadArgumentsResponse, GetRecordResponse, IdentifyResponse, ListIdentifiersResponse, ListMetadaFormatsResponse, ListRecordsResponse, ListSetsResponse, OaiResponse}
import play.api.Configuration
import scala.xml.{Elem, Node}
sealed abstract class OaiRequestRunner {
var result: Option[(String, Elem)] = None
var result: Option[(String, OAIContent)] = None
var resultList: Option[ResultList] = None
var resultListnew: Option[ResultListNew] = None
//var result: Option[NodeSeq] = None
def run(): OaiResponse
val config: Configuration
......@@ -77,21 +75,13 @@ case class ListRecordsRunner(config: Configuration, repository: OaiRepository, r
ListRecordsReq) extends OaiRequestRunner {
override def run(): OaiResponse = {
//ich benötige einen genrischen Typ result
/*
resultList = repository.listRecords(
from = request.parameter.from,
until = request.parameter.until,
set = request.parameter.set,
resumptionToken = Option.empty,
metadataPrefix = request.parameter.metadataPrefix)
*/
resultListnew = repository.listRecords1(
from = request.parameter.from,
until = request.parameter.until,
set = request.parameter.set,
resumptionToken = Option.empty,
metadataPrefix = request.parameter.metadataPrefix)
......
......@@ -5,7 +5,7 @@ import org.swissbib.memobase.oai.common.util.ResumptionToken
import scala.xml.Node
case class ResultList(repositoryToken:Option[ResumptionToken], result:Option[Seq[(String,Node)]])
case class ResultList(repositoryToken:Option[ResumptionToken], result:Option[Seq[OAIContent]])
case class ResultListNew(repositoryToken:Option[ResumptionToken], result:Option[Seq[OAIContent]])
......
1) GetRecord
https://services.dnb.de/oai/repository?verb=GetRecord&metadataPrefix=MARC21-xml&identifier=oai:dnb.de/authorities/118540238
wenn der record nicht vorhanden ist
<?xml version="1.0" encoding="UTF-8"?>
<OAI-PMH
xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"
xmlns="http://www.openarchives.org/OAI/2.0/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<responseDate>2021-03-16T10:56:05Z</responseDate>
<request metadataPrefix="MARC21-xml" verb="GetRecord"
identifier="oai:dnb.de/authorities/11854023"
>https://services.dnb.de/oai/repository</request>
<error code="idDoesNotExist"/>
</OAI-PMH>
- welche error codes verwende ich?
- wie implementiere ich das?
......@@ -11,7 +11,7 @@ mit anschliessendem resumption token (max. 2 Minuten Zeitdauer zwischen den Aufr
https://oai.memobase.k8s.unibas.ch/?verb=ListRecords&resumptionToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJtZW1vYmFzZSBPQUkgc2VydmVyIiwic3ViIjoiRG5GMVpYSjVWR2hsYmtabGRHTm9Bd0FBQUFBQUFzZjBGbFZLZERSeFJXZEdVazVYVmpSdGJsWXpNWGQ1VjBFQUFBQUFBQTRyTkJadVdWWXllV0ZCV2xORFF6aHNRM1JCZDBkRFoxQkJBQUFBQUFBT0t6VVdibGxXTW5saFFWcFRRME00YkVOMFFYZEhRMmRRUVE9PSIsImV4cCI6MTYwMTI5Mzk0OCwiaWF0IjoxNjAxMjkzNzY4fQ.CmuujiNhY8zzRtRnlpOsgplbyNpPqWjtVtf-dIvD6PLsJuhIwS5ETHGQW_KK4mcS
ListIdentifiers
https://oai.memobase.k8s.unibas.ch/?verb=ListIdentifiers&metadataPrefi x=1234
https://oai.memobase.k8s.unibas.ch/?verb=ListIdentifiers&metadataPrefix=1234
mit anschliessendem resumptionToken - maximal 2 Minuten Zeitdauer zwischen den Aufrufen
aktuell Fehler!
https://oai.memobase.k8s.unibas.ch/?verb=ListIdentifiers&resumptionToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJtZW1vYmFzZSBPQUkgc2VydmVyIiwic3ViIjoiRG5GMVpYSjVWR2hsYmtabGRHTm9Bd0FBQUFBQUFFeWFGbHAyZVVwb2FXWnpVVVJUTUdSdGVUbDZiSE4wY2tFQUFBQUFBQTRyZVJadVdWWXllV0ZCV2xORFF6aHNRM1JCZDBkRFoxQkJBQUFBQUFBT0szb1dibGxXTW5saFFWcFRRME00YkVOMFFYZEhRMmRRUVE9PSIsImV4cCI6MTYwMTI5NDE2NywiaWF0IjoxNjAxMjkzOTg3fQ.6dKO-1VRY4gybSBiC-wpUNd8SHFqiBAkv1YqG5w9AJ-hQz6AnN4UkHLwRKX1tjN4
......
<OAI-PMH xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd" xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<responseDate>2021-03-16T09:54:19.126342Z</responseDate>
<request verb="ListRecords">https://oai.memobase.k8s.unibas.ch/</request><ListRecords>
<record>
<header>
<identifier>https://memobase.ch/record/srf-012-5E7F3070-33C4-4B5B-A985-1DB7708E4C40_07</identifier>
<datestamp>2021-03-16T09:54:19.126562Z</datestamp>
<setSpec>memobaseSet</setSpec>
</header>
<metadata><rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:crm="http://www.cidoc‐crm.org/cidoc‐crm/" xmlns:wgs84_pos="http://www.w3.org/2004/02/skos/core#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<edm:ProvidedCHO rdf:about="https://memobase.ch/record/srf-012-5E7F3070-33C4-4B5B-A985-1DB7708E4C40_07">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/ProvidedCHO"/>
<dc:title>SP-DV</dc:title>
<dc:description>Schweiz &lt;o.O.: SP-Delegiertenversammlung (DV)&lt;br&gt;&lt;br&gt;Sequenzen:&lt;br&gt;0: SP-Parteivorstand (zap) mit Ursula Koch (°Partei-P) - o.O.</dc:description>
<dc:description>Verfügbarkeit auf SRF Play (siehe Link unten) &lt;br&gt; Link zur Sendung: &lt;![CDATA[&lt;a href=&quot;https://www.srf.ch/play/tv/redirect/detail/9719dea2-d2ff-4774-8c2f-0785bdb004a7&quot; target=&quot;_blank&quot;&gt;Link&lt;/a&gt;]]&gt;</dc:description>
<dc:creator>Author / Schweizer Radio und Fernsehn (SRF)</dc:creator>
<dc:contributor>ModeratorIn / Müller Beatrice</dc:contributor>
<dc:contributor>contributor / Koch Ursula /</dc:contributor>
<dc:contributor>Redaktion / Tagesschau</dc:contributor>
<dc:contributor>DRS</dc:contributor>
<dc:identifier>srf-012-5E7F3070-33C4-4B5B-A985-1DB7708E4C40_07</dc:identifier>
<dc:identifier>5E7F3070-33C4-4B5B-A985-1DB7708E4C40_07</dc:identifier>
<dc:publisher>SRF</dc:publisher>
<dc:rights>Rechte bei SRF/SRG</dc:rights>
<dc:subject>POLITIK</dc:subject>
<dc:subject>PARTEI</dc:subject>
<dc:subject>Flash</dc:subject>
<dc:subject>Tagesschau</dc:subject>
<dc:subject>Aktuelle Nachrichten</dc:subject>
<dcterms:extent>00:00:26</dcterms:extent>
<dcterms:issued>1999-04-24</dcterms:issued>
<dcterms:spatial>Westeuropa</dcterms:spatial>
<edm:type>VIDEO</edm:type>
</edm:ProvidedCHO>
<edm:WebResource rdf:about="https://memobase.ch/digital/srf-012-5E7F3070-33C4-4B5B-A985-1DB7708E4C40_07-1">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/WebResource"/>
</edm:WebResource>
<ore:Aggregation rdf:about="https://memobase.ch/record/srf-012-5E7F3070-33C4-4B5B-A985-1DB7708E4C40_07_??">
<rdf:type rdf:resource="http://www.openarchives.org/ore/terms/Aggregation"/>
<wgs84_pos:prefLabel>only test for aggregation</wgs84_pos:prefLabel>
</ore:Aggregation>
</rdf:RDF></metadata>
</record><record>
<header>
<identifier>https://memobase.ch/record/srf-012-C4D65C08-DAE5-474E-95DB-9D1CAF5CDD09_07</identifier>
<datestamp>2021-03-16T09:54:19.128156Z</datestamp>
<setSpec>memobaseSet</setSpec>
</header>
<metadata><rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:crm="http://www.cidoc‐crm.org/cidoc‐crm/" xmlns:wgs84_pos="http://www.w3.org/2004/02/skos/core#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<edm:ProvidedCHO rdf:about="https://memobase.ch/record/srf-012-C4D65C08-DAE5-474E-95DB-9D1CAF5CDD09_07">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/ProvidedCHO"/>
<dc:title>Steigende Hypothekarzinsen</dc:title>
<dc:description>Schweiz &lt;Basel, BS: Hypothekarzinsen-Erhöhung bei der Basler Kantonalbank&lt;br&gt;&lt;br&gt;Sequenzen:&lt;br&gt;0: Interview Werner Marti (°Preisüberwacher) - o.O.&lt;br&gt;1: AA Zürcher Kantonalbank - Zürich, ZH&lt;br&gt;2: Statement Paul Hasenfratz (°Zürcher °Kantonalbank) - Zürich, ZH</dc:description>
<dc:description>Verfügbarkeit auf SRF Play (siehe Link unten) &lt;br&gt; Link zur Sendung: &lt;![CDATA[&lt;a href=&quot;https://www.srf.ch/play/tv/redirect/detail/a2fd8f96-8a74-4a3e-b7d2-74fde30d8a24&quot; target=&quot;_blank&quot;&gt;Link&lt;/a&gt;]]&gt;</dc:description>
<dc:creator>Author / Schweizer Radio und Fernsehn (SRF)</dc:creator>
<dc:contributor>ModeratorIn / Müller Beatrice</dc:contributor>
<dc:contributor>Redaktion / Tagesschau</dc:contributor>
<dc:contributor>contributor / Marti Werner /</dc:contributor>
<dc:contributor>Autor / Baumann Kaspar</dc:contributor>
<dc:contributor>contributor / Hasenfratz Paul /</dc:contributor>
<dc:contributor>DRS</dc:contributor>
<dc:identifier>C4D65C08-DAE5-474E-95DB-9D1CAF5CDD09_07</dc:identifier>
<dc:identifier>srf-012-C4D65C08-DAE5-474E-95DB-9D1CAF5CDD09_07</dc:identifier>
<dc:publisher>SRF</dc:publisher>
<dc:rights>Rechte bei SRF/SRG</dc:rights>
<dc:subject>WIRTSCHAFT</dc:subject>
<dc:subject>HYPOTHEKARZINS</dc:subject>
<dc:subject>HYPOTHEK</dc:subject>
<dc:subject>Aktuelle Nachrichten</dc:subject>
<dc:subject>Tagesschau</dc:subject>
<dc:subject>Flash</dc:subject>
<dcterms:extent>00:01:38</dcterms:extent>
<dcterms:issued>1999-10-20</dcterms:issued>
<dcterms:spatial>Westeuropa</dcterms:spatial>
<edm:type>VIDEO</edm:type>
</edm:ProvidedCHO>
<edm:WebResource rdf:about="https://memobase.ch/digital/srf-012-C4D65C08-DAE5-474E-95DB-9D1CAF5CDD09_07-1">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/WebResource"/>
</edm:WebResource>
<ore:Aggregation rdf:about="https://memobase.ch/record/srf-012-C4D65C08-DAE5-474E-95DB-9D1CAF5CDD09_07_??">
<rdf:type rdf:resource="http://www.openarchives.org/ore/terms/Aggregation"/>
<wgs84_pos:prefLabel>only test for aggregation</wgs84_pos:prefLabel>
</ore:Aggregation>
</rdf:RDF></metadata>
</record><record>
<header>
<identifier>https://memobase.ch/record/rra-001-42</identifier>
<datestamp>2021-03-16T09:54:19.129437Z</datestamp>
<setSpec>memobaseSet</setSpec>
</header>
<metadata><rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:crm="http://www.cidoc‐crm.org/cidoc‐crm/" xmlns:wgs84_pos="http://www.w3.org/2004/02/skos/core#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<edm:ProvidedCHO rdf:about="https://memobase.ch/record/rra-001-42">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/ProvidedCHO"/>
<dc:title>Frauen in Nepal und Maoris in Neuseeland</dc:title>
<dc:description>Frauen in Nepal und Maoris in Neuseeland: 'Once were warriors' ist in den Kinos angelaufen - ASIN berichtet über das Leben der Maoris in Neuseeland und bringt ein Gespräch mit zwei Vertreterinnen von nepalesischen Volksorganisationen.</dc:description>
<dc:date>1995-06-11</dc:date>
<dc:creator>Author / Bianca Miglioretto</dc:creator>
<dc:contributor>Radio LoRa, Zürich</dc:contributor>
<dc:identifier>rra-001-42</dc:identifier>
<dc:identifier>42</dc:identifier>
<dc:language>Deutsch</dc:language>
<dc:publisher>Radio LoRa, Zürich</dc:publisher>
<dc:rights>Radio LoRa, Zürich</dc:rights>
<dc:subject>Thema</dc:subject>
<dc:subject>Frauenhandel</dc:subject>
<dc:subject>Frau</dc:subject>
<dc:subject>Maori</dc:subject>
<dcterms:created>1995-06-11</dcterms:created>
<dcterms:extent>01:18:00</dcterms:extent>
<dcterms:medium>Video8</dcterms:medium>
<dcterms:spatial>Asien</dcterms:spatial>
<dcterms:spatial>Neuseeland</dcterms:spatial>
<dcterms:spatial>Bombai</dcterms:spatial>
<dcterms:spatial>Nepal</dcterms:spatial>
<edm:type>SOUND</edm:type>
</edm:ProvidedCHO>
<edm:WebResource rdf:about="https://memobase.ch/digital/rra-001-42-1">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/WebResource"/>
</edm:WebResource>
<ore:Aggregation rdf:about="https://memobase.ch/record/rra-001-42_??">
<rdf:type rdf:resource="http://www.openarchives.org/ore/terms/Aggregation"/>
<wgs84_pos:prefLabel>only test for aggregation</wgs84_pos:prefLabel>
</ore:Aggregation>
</rdf:RDF></metadata>
</record><record>
<header>
<identifier>https://memobase.ch/record/rxb-004-D0023240DB3EC124F1D878063_wav</identifier>
<datestamp>2021-03-16T09:54:19.130979Z</datestamp>
<setSpec>memobaseSet</setSpec>
</header>
<metadata><rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:crm="http://www.cidoc‐crm.org/cidoc‐crm/" xmlns:wgs84_pos="http://www.w3.org/2004/02/skos/core#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<edm:ProvidedCHO rdf:about="https://memobase.ch/record/rxb-004-D0023240DB3EC124F1D878063_wav">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/ProvidedCHO"/>
<dc:title>K-Tipp 15.11.2006 Big Brother Awards</dc:title>
<dc:description>Dies ist einer von diversen Kultur-Tipps, welche im Jahr 2006 von Radio X ausgestrahlt wurden. Der Inhalt davon ist der Hinweis auf den &quot;Big Brother Awards&quot; zur &quot;Nomination&quot; von Personen, die durch die Überwachung anderer Menschen Datenschutzverletzungen begangen hatten, welcher am 16.11.2006 im Sudhaus in Basel stattfinden würde, vorgestellt vom Mitorganisator Christoph Müller.</dc:description>
<dc:creator>Author / Sabrina Tschachtli</dc:creator>
<dc:contributor>contributor / Christoph Müller</dc:contributor>
<dc:contributor>Radio X</dc:contributor>
<dc:identifier>D0023240DB3EC124F1D878063.wav</dc:identifier>
<dc:identifier>rxb-004-D0023240DB3EC124F1D878063_wav</dc:identifier>
<dc:language>Deutsch</dc:language>
<dc:publisher>Radio X</dc:publisher>
<dc:rights>Radio X</dc:rights>
<dc:subject>Events</dc:subject>
<dc:subject>Kultur</dc:subject>
<dc:subject>Medien</dc:subject>
<dc:subject>Beitrag</dc:subject>
<dcterms:extent>00:03:21</dcterms:extent>
<dcterms:issued>2006-11-15</dcterms:issued>
<dcterms:medium>HD</dcterms:medium>
<dcterms:spatial>Region Basel</dcterms:spatial>
<dcterms:temporal>Gegenwart im Jahr 2006</dcterms:temporal>
<edm:type>SOUND</edm:type>
</edm:ProvidedCHO>
<edm:WebResource rdf:about="https://memobase.ch/digital/rxb-004-D0023240DB3EC124F1D878063_wav-1">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/WebResource"/>
</edm:WebResource>
<ore:Aggregation rdf:about="https://memobase.ch/record/rxb-004-D0023240DB3EC124F1D878063_wav_??">
<rdf:type rdf:resource="http://www.openarchives.org/ore/terms/Aggregation"/>
<wgs84_pos:prefLabel>only test for aggregation</wgs84_pos:prefLabel>
</ore:Aggregation>
</rdf:RDF></metadata>
</record><record>
<header>
<identifier>https://memobase.ch/record/rxb-004-D0023240D7C10124F06E14E82_wav</identifier>
<datestamp>2021-03-16T09:54:19.133484Z</datestamp>
<setSpec>memobaseSet</setSpec>
</header>
<metadata><rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:crm="http://www.cidoc‐crm.org/cidoc‐crm/" xmlns:wgs84_pos="http://www.w3.org/2004/02/skos/core#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<edm:ProvidedCHO rdf:about="https://memobase.ch/record/rxb-004-D0023240D7C10124F06E14E82_wav">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/ProvidedCHO"/>
<dc:title>13.06.03 Interview mit Silvio Fumagalli</dc:title>
<dc:description>Interview mit Silvio Fumagalli, Community Policing Verantwortlicher bei der Basler Polizei zum Wochenthema &quot;Rassismus&quot;. Ein Gespräch über prägenden Erfarung bei der Polizei im Zusammenhang mit Rassismus, Sensibilisierung und Schulung eines Polizisten und Probleme einer Person mit nicht-schweizerischem Hintergrund.</dc:description>
<dc:description>&lt;br&gt; Verwandte Dokumente: &lt;br&gt; &lt;a href=&quot;http://memobase.ch/#document/RadioX-D0023240D7C10124F06EF9CEB_wav&quot; target=&quot;_self&quot;&gt;D0023240D7C10124F06EF9CEB.wav&lt;/a&gt; &lt;br&gt; &lt;a href=&quot;http://memobase.ch/#document/RadioX-D0023240D7C10124F06EF9A97_wav&quot; target=&quot;_self&quot;&gt;D0023240D7C10124F06EF9A97.wav&lt;/a&gt; &lt;br&gt; &lt;a href=&quot;http://memobase.ch/#document/RadioX-D0023240D7C10124F06E14C8B_wav&quot; target=&quot;_self&quot;&gt;D0023240D7C10124F06E14C8B.wav&lt;/a&gt;</dc:description>
<dc:creator>Author / Thierry Gerber</dc:creator>
<dc:contributor>contributor / Silvio Fumagalli</dc:contributor>
<dc:contributor>Radio X</dc:contributor>
<dc:identifier>rxb-004-D0023240D7C10124F06E14E82_wav</dc:identifier>
<dc:identifier>D0023240D7C10124F06E14E82.wav</dc:identifier>
<dc:language>Deutsch</dc:language>
<dc:publisher>Radio X</dc:publisher>
<dc:rights>Radio X</dc:rights>
<dc:subject>Rassismusbekämpfung</dc:subject>
<dc:subject>Gerechtigkeit</dc:subject>
<dc:subject>Politik/Staat</dc:subject>
<dc:subject>Gesellschaft</dc:subject>
<dc:subject>Arbeit</dc:subject>
<dc:subject>Soziales</dc:subject>
<dc:subject>Soziale Sicherheit</dc:subject>
<dc:subject>Integration</dc:subject>
<dc:subject>Arbeitnehmer</dc:subject>
<dc:subject>Diskriminierung</dc:subject>
<dc:subject>Rassismus</dc:subject>
<dc:subject>Talk</dc:subject>
<dcterms:extent>00:35:29</dcterms:extent>
<dcterms:issued>2013-06-03</dcterms:issued>
<dcterms:medium>HD</dcterms:medium>
<edm:type>SOUND</edm:type>
</edm:ProvidedCHO>
<edm:WebResource rdf:about="https://memobase.ch/digital/rxb-004-D0023240D7C10124F06E14E82_wav-1">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/WebResource"/>
</edm:WebResource>
<ore:Aggregation rdf:about="https://memobase.ch/record/rxb-004-D0023240D7C10124F06E14E82_wav_??">
<rdf:type rdf:resource="http://www.openarchives.org/ore/terms/Aggregation"/>
<wgs84_pos:prefLabel>only test for aggregation</wgs84_pos:prefLabel>
</ore:Aggregation>
</rdf:RDF></metadata>
</record><record>
<header>
<identifier>https://memobase.ch/record/rxb-004-DE3D4EAE6BBA212513BA2463F_mpg</identifier>
<datestamp>2021-03-16T09:54:19.136221Z</datestamp>
<setSpec>memobaseSet</setSpec>
</header>
<metadata><rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:crm="http://www.cidoc‐crm.org/cidoc‐crm/" xmlns:wgs84_pos="http://www.w3.org/2004/02/skos/core#" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ore="http://www.openarchives.org/ore/terms/" xmlns:edm="http://www.europeana.eu/schemas/edm/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<edm:ProvidedCHO rdf:about="https://memobase.ch/record/rxb-004-DE3D4EAE6BBA212513BA2463F_mpg">
<rdf:type rdf:resource="http://www.europeana.eu/schemas/edm/ProvidedCHO"/>
<dc:title>11.09.09 Museum der Kulturen_Richtig</dc:title>
<dc:description>Dies ist einer von diversen Kultur-Tipps, welche im Jahr 2011 von Radio X ausgestrahlt wurden. Der Inhalt davon ist der Hinweis auf die Ausstellungen &quot;Chinatown&quot; (7. 9.2011- 6.5. 2012, &quot;EigenSinn - Inspirierende Aspekte der Ethnologie&quot; (7.9.2011-3.2.2012) und &quot;On Stage. Die Kunst der Pekingoper&quot; (7.9.2011-7.3.2012) im Museum der Kulturen Basel, sowie auf Events zur Museums-Neueröffnung, vorgestellt von der Direktorin Anna Schmid und der Eventmanagerin des Museums, Sabrina Way; inkl. Web-Tipp.</dc:description>
<dc:creator>Author / Nathan Leuenberger</dc:creator>
<dc:contributor>contributor / Sabrina Way</dc:contributor>
<dc:contributor>contributor / Anna Schmid</dc:contributor>
<dc:contributor>Radio X</dc:contributor>
<dc:identifier>rxb-004-DE3D4EAE6BBA212513BA2463F_mpg</dc:identifier>
<dc:identifier>DE3D4EAE6BBA212513BA2463F.mpg</dc:identifier>
<dc:language>Deutsch</dc:language>
<dc:publisher>Radio X</dc:publisher>
<dc:rights>Radio X</dc:rights>
<dc:subject>Kultur</dc:subject>
<dc:subject>Ausstellung</dc:subject>
<dc:subject>Events</dc:subject>
<dc:subject>Beitrag</dc:subject>
<dcterms:extent>00:04:16</dcterms:extent>
<dcterms:issued>2011-09-09</dcterms:issued>
<dcterms:medium>HD</dcterms:medium>
<dcterms:spatial>Region Basel</dcterms:spatial>
<dcterms:temporal>Gegenwart im Jahr 2011</dcterms:temporal>