Commit 4e653dbf authored by Jonas Waeber's avatar Jonas Waeber
Browse files

Update search doc transform for metadata extractor output.

parent 62563e79
Pipeline #11796 passed with stages
in 4 minutes and 35 seconds
......@@ -30,6 +30,7 @@ import org.apache.kafka.streams.StreamsBuilder
import org.apache.kafka.streams.Topology
import org.apache.logging.log4j.LogManager
import org.memobase.model.SearchDoc
import org.memobase.rdf.NS
import org.memobase.settings.SettingsLoader
class KafkaTopology(private val settings: SettingsLoader) {
......@@ -56,14 +57,13 @@ class KafkaTopology(private val settings: SettingsLoader) {
private fun parseJson(data: String): List<JsonObject> {
val result = Klaxon().parseJsonObject(StringReader(data))
return if (result == null) emptyList()
else listOf(result)
return listOf(result)
}
private fun unpackJson(input: JsonObject): Map<String, JsonObject> {
val graph = input["@graph"] as JsonArray<JsonObject>
return graph.map {
if (it["@type"] == "rico:Record") {
if (it["@type"] == NS.rico + "Record") {
Pair("record", it)
} else {
Pair(it["@id"] as String, it)
......
......@@ -25,62 +25,63 @@ import org.memobase.helpers.ReuseStatementMap
import org.memobase.model.LanguageContainer
import org.memobase.model.NameContainer
import org.memobase.model.SearchDoc
import org.memobase.rdf.NS
class SearchDocTransform {
private val log = LogManager.getLogger("SearchDocTransform")
fun transform(input: Map<String, JsonObject>): SearchDoc {
val record = input["record"] ?: error("No record defined in this message.")
val digitalObject = input.values.firstOrNull { it["@type"] == "rico:Instantiation" && it["rico:type"] == "digitalObject" }
val physicalObject = input.values.firstOrNull { it["@type"] == "rico:Instantiation" && it["rico:type"] == "physicalObject" }
val digitalObject = input.values.firstOrNull { it["@type"] == NS.rico + "Instantiation" && it["type"] == "digitalObject" }
val physicalObject = input.values.firstOrNull { it["@type"] == NS.rico + "Instantiation" && it["type"] == "physicalObject" }
val id = record["@id"] as String
val recordIdentifiers = Extract.getEntitiesFromIds("rico:identifiedBy", record, input)
val recordTitles = Extract.getEntitiesFromIds("rico:hasTitle", record, input)
val recordLanguages = Extract.getEntitiesFromIds("rico:hasLanguage", record, input)
val recordRules = Extract.getEntitiesFromIds("rico:regulatedBy", record, input)
val recordIdentifiers = Extract.getEntitiesFromIds("identifiedBy", record, input)
val recordTitles = Extract.getEntitiesFromIds("hasTitle", record, input)
val recordLanguages = Extract.getEntitiesFromIds("hasLanguage", record, input)
val recordRules = Extract.getEntitiesFromIds("regulatedBy", record, input)
val datesCreated = Extract.getEntitiesFromIds("dct:created", record, input)
val datesIssued = Extract.getEntitiesFromIds("dct:issued", record, input)
val temporal = Extract.getEntitiesFromIds("dct:temporal", record, input)
val placesRelated = Extract.getEntitiesFromIds("dct:spatial", record, input)
val placeCaptured = Extract.getEntitiesFromIds("rdau:P60556", record, input)
val datesCreated = Extract.getEntitiesFromIds("created", record, input)
val datesIssued = Extract.getEntitiesFromIds("issued", record, input)
val temporal = Extract.getEntitiesFromIds("temporal", record, input)
val placesRelated = Extract.getEntitiesFromIds("spatial", record, input)
val placeCaptured = Extract.getEntitiesFromIds("P60556", record, input)
val genre = Extract.getEntitiesFromIds("ebucore:hasGenre", record, input)
val subjects = Extract.getEntitiesFromIds("rico:hasSubject", record, input)
val genre = Extract.getEntitiesFromIds("hasGenre", record, input)
val subjects = Extract.getEntitiesFromIds("hasSubject", record, input)
val publishers = Extract.getEntitiesFromIds("rico:publishedBy", record, input)
val producers = Extract.getEntitiesFromIds("rdau:P60441", record, input)
val publishers = Extract.getEntitiesFromIds("publishedBy", record, input)
val producers = Extract.getEntitiesFromIds("P60441", record, input)
val creationRelationAgents =
Extract.getEntitiesFromIds("rico:recordResourceOrInstantiationIsSourceOfCreationRelation", record, input)
Extract.getEntitiesFromIds("recordResourceOrInstantiationIsSourceOfCreationRelation", record, input)
val digitalRules = Extract.getEntitiesFromIds("rico:regulatedBy", digitalObject, input)
val digitalRules = Extract.getEntitiesFromIds("regulatedBy", digitalObject, input)
val physicalRules = Extract.getEntitiesFromIds("rico:regulatedBy", physicalObject, input)
val physicalIdentifiers = Extract.getEntitiesFromIds("rico:identifiedBy", physicalObject, input)
val physicalRules = Extract.getEntitiesFromIds("regulatedBy", physicalObject, input)
val physicalIdentifiers = Extract.getEntitiesFromIds("identifiedBy", physicalObject, input)
val accessPhysical = Extract.typedEntityByType(physicalRules, "rico:type", "access", "rico:name").flatMap { it.toList() }
val accessDigital = Extract.typedEntityByType(digitalRules, "rico:type", "access", "rico:name").flatMap { it.toList() }
val accessPhysical = Extract.typedEntityByType(physicalRules, "type", "access", "name").flatMap { it.toList() }
val accessDigital = Extract.typedEntityByType(digitalRules, "type", "access", "name").flatMap { it.toList() }
val usageDigital = Extract.typedEntityByType(digitalRules, "rico:type", "usage", "schema:sameAs").flatMap { it.toList() }
val format = Extract.carrierType(Extract.getEntitiesFromIds("rico:hasCarrierType", physicalObject, input))
val usageDigital = Extract.typedEntityByType(digitalRules, "type", "usage", "sameAs").flatMap { it.toList() }
val format = Extract.carrierType(Extract.getEntitiesFromIds("hasCarrierType", physicalObject, input))
if (format.isEmpty()) {
log.error("Found no carrier types for record $id.")
}
return SearchDoc(
title = Extract.typedEntityByType(recordTitles, "rico:type", "main", "rico:title"),
seriesTitle = Extract.typedEntityByType(recordTitles, "rico:type", "series", "rico:title"),
broadcastTitle = Extract.typedEntityByType(recordTitles, "rico:type", "broadcast", "rico:title"),
type = record["rico:type"] as String,
title = Extract.typedEntityByType(recordTitles, "type", "main", "title"),
seriesTitle = Extract.typedEntityByType(recordTitles, "type", "series", "title"),
broadcastTitle = Extract.typedEntityByType(recordTitles, "type", "broadcast", "title"),
type = record["type"] as String,
sourceID = try {
Extract.extractSourceId(recordIdentifiers)
} catch (ex: NoSuchElementException) {
log.error("No source id found for record $id")
"NoSourceIdFound"
},
sameAs = Extract.listOfStrings(record["schema:sameAs"]),
abstract = Extract.extractLanguageContainer("dct:abstract", record["dct:abstract"]),
sameAs = Extract.listOfStrings(record["sameAs"]),
abstract = Extract.extractLanguageContainer("abstract", record["abstract"]),
id = id,
institution = listOf(
NameContainer(
......@@ -92,67 +93,67 @@ class SearchDocTransform {
LanguageContainer(listOf("Bestand"), listOf("collection"), listOf("fondo"), emptyList()),
listOf("https://memobase.ch/recordSet/EXAMPLE")
),
descriptiveNote = Extract.extractLanguageContainer("rico:descriptiveNote", record["rico:descriptiveNote"]),
scopeAndContent = Extract.extractLanguageContainer("rico:scopeAndContent", record["rico:scopeAndContent"]),
relatedMaterial = Extract.extractLanguageContainer("dct:relation", record["dct:relation"]),
source = Extract.extractLanguageContainer("rico:source", record["rico:source"]),
descriptiveNote = Extract.extractLanguageContainer("descriptiveNote", record["descriptiveNote"]),
scopeAndContent = Extract.extractLanguageContainer("scopeAndContent", record["scopeAndContent"]),
relatedMaterial = Extract.extractLanguageContainer("relation", record["relation"]),
source = Extract.extractLanguageContainer("source", record["source"]),
temporal = Extract.extractDate(temporal),
dateCreated = Extract.extractDate(datesCreated),
dateIssued = Extract.extractDate(datesIssued),
placeCapture = Extract.extractPlaces(placeCaptured),
placeRelated = Extract.extractPlaces(placesRelated),
place = Extract.facetEntity(placeCaptured + placesRelated, "rico:name"),
rightsHolder = Extract.typedEntityByType(recordRules, "rico:type", "holder", "rico:name"),
memoriavClaim = record["rdau:P60451"] != null,
languageCaption = Extract.typedEntityByType(recordLanguages, "rico:type", "caption", "rico:name"),
languageContent = Extract.typedEntityByType(recordLanguages, "rico:type", "content", "rico:name"),
language = Extract.facetEntity(recordLanguages, "rico:name"),
genre = Extract.facetEntity(genre, "skos:prefLabel"),
keywords = Extract.facetEntity(subjects, "skos:prefLabel"),
agentSubject = Extract.typedEntityByType(subjects, "@type", "rico:Agent", "rico:name"),
personSubject = Extract.typedEntityByType(subjects, "@type", "rico:Person", "rico:name"),
corporateBodySubject = Extract.typedEntityByType(subjects, "@type", "rico:CorporateBody", "rico:name"),
agentProducer = Extract.typedEntityByType(producers, "@type", "rico:Agent", "rico:name"),
personProducer = Extract.typedEntityByType(producers, "@type", "rico:Person", "rico:name"),
corporateBodyProducer = Extract.typedEntityByType(producers, "@type", "rico:CorporateBody", "rico:name"),
agentPublisher = Extract.typedEntityByType(publishers, "@type", "rico:Agent", "rico:name"),
personPublisher = Extract.typedEntityByType(publishers, "@type", "rico:Person", "rico:name"),
corporateBodyPublisher = Extract.typedEntityByType(publishers, "@type", "rico:CorporateBody", "rico:name"),
place = Extract.facetEntity(placeCaptured + placesRelated, "name"),
rightsHolder = Extract.typedEntityByType(recordRules, "type", "holder", "name"),
memoriavClaim = record["P60451"] != null,
languageCaption = Extract.typedEntityByType(recordLanguages, "type", "caption", "name"),
languageContent = Extract.typedEntityByType(recordLanguages, "type", "content", "name"),
language = Extract.facetEntity(recordLanguages, "name"),
genre = Extract.facetEntity(genre, "prefLabel"),
keywords = Extract.facetEntity(subjects, "prefLabel"),
agentSubject = Extract.typedEntityByType(subjects, "@type", "Agent", "name"),
personSubject = Extract.typedEntityByType(subjects, "@type", "Person", "name"),
corporateBodySubject = Extract.typedEntityByType(subjects, "@type", "CorporateBody", "name"),
agentProducer = Extract.typedEntityByType(producers, "@type", "Agent", "name"),
personProducer = Extract.typedEntityByType(producers, "@type", "Person", "name"),
corporateBodyProducer = Extract.typedEntityByType(producers, "@type", "CorporateBody", "name"),
agentPublisher = Extract.typedEntityByType(publishers, "@type", "Agent", "name"),
personPublisher = Extract.typedEntityByType(publishers, "@type", "Person", "name"),
corporateBodyPublisher = Extract.typedEntityByType(publishers, "@type", "CorporateBody", "name"),
agentContributor = Extract.extractTypedCreationRelationAgent(
creationRelationAgents,
input,
creationRelationTypeParam = "contributor",
agentTypeParam = "rico:Agent"
agentTypeParam = NS.rico + "Agent"
),
personContributor = Extract.extractTypedCreationRelationAgent(
creationRelationAgents,
input,
creationRelationTypeParam = "contributor",
agentTypeParam = "rico:Person"
agentTypeParam = NS.rico + "Person"
),
corporateBodyContributor = Extract.extractTypedCreationRelationAgent(
creationRelationAgents,
input,
creationRelationTypeParam = "contributor",
agentTypeParam = "rico:CorporateBody"
agentTypeParam = NS.rico + "CorporateBody"
),
agentCreator = Extract.extractTypedCreationRelationAgent(
creationRelationAgents,
input,
creationRelationTypeParam = "creator",
agentTypeParam = "rico:Agent"
agentTypeParam = NS.rico + "Agent"
),
personCreator = Extract.extractTypedCreationRelationAgent(
creationRelationAgents,
input,
creationRelationTypeParam = "creator",
agentTypeParam = "rico:Person"
agentTypeParam = NS.rico + "Person"
),
corporateBodyCreator = Extract.extractTypedCreationRelationAgent(
creationRelationAgents,
input,
creationRelationTypeParam = "creator",
agentTypeParam = "rico:CorporateBody"
agentTypeParam = NS.rico + "CorporateBody"
),
// TODO: Implement collected agents!
persons = emptyList(),
......@@ -164,23 +165,23 @@ class SearchDocTransform {
// DIGITAL
accessDigital = accessDigital,
durationDigital = Extract.listOfStrings(digitalObject?.get("ebucore:duration")),
colourDigital = Extract.listOfStrings(digitalObject?.get("rdau:P60558")),
digitalObjectNote = Extract.extractLanguageContainer("rico:descriptiveNote", digitalObject?.get("rico:descriptiveNote")),
locator = Extract.listOfStrings(digitalObject?.get("ebucore:locator")),
usageConditionsDigital = Extract.extractLanguageContainer("rico:conditionsOfUse", digitalObject?.get("rico:conditionsOfUse")),
durationDigital = Extract.listOfStrings(digitalObject?.get("duration")),
colourDigital = Extract.listOfStrings(digitalObject?.get("P60558")),
digitalObjectNote = Extract.extractLanguageContainer("descriptiveNote", digitalObject?.get("descriptiveNote")),
locator = Extract.listOfStrings(digitalObject?.get("locator")),
usageConditionsDigital = Extract.extractLanguageContainer("conditionsOfUse", digitalObject?.get("conditionsOfUse")),
usageDigital = usageDigital,
usageDigitalGroup = usageDigital.map { ReuseStatementMap.getValue(it) },
// PHYSICAL
accessPhysical = accessPhysical,
durationPhysical = Extract.listOfStrings(physicalObject?.get("ebucore:duration")),
colourPhysical = Extract.extractLanguageContainer("rdau:P60558", physicalObject?.get("rdau:P60558")),
physicalCharacteristics = Extract.extractLanguageContainer("rico:physicalCharacteristics", physicalObject?.get("rico:physicalCharacteristics")),
physicalObjectNote = Extract.extractLanguageContainer("rico:descriptiveNote", physicalObject?.get("rico:descriptiveNote")),
usageConditionsPhysical = Extract.extractLanguageContainer("rico:conditionsOfUse", physicalObject?.get("rico:conditionsOfUse")),
usagePhysical = Extract.typedEntityByType(physicalRules, "rico:type", "usage", "schema:sameAs").flatMap { it.toList() },
callNumber = Extract.typedEntityByType(physicalIdentifiers, "rico:type", "callNumber", "rico:identifier").flatMap { it.toList() },
durationPhysical = Extract.listOfStrings(physicalObject?.get("duration")),
colourPhysical = Extract.extractLanguageContainer("P60558", physicalObject?.get("P60558")),
physicalCharacteristics = Extract.extractLanguageContainer("physicalCharacteristics", physicalObject?.get("physicalCharacteristics")),
physicalObjectNote = Extract.extractLanguageContainer("descriptiveNote", physicalObject?.get("descriptiveNote")),
usageConditionsPhysical = Extract.extractLanguageContainer("conditionsOfUse", physicalObject?.get("conditionsOfUse")),
usagePhysical = Extract.typedEntityByType(physicalRules, "type", "usage", "sameAs").flatMap { it.toList() },
callNumber = Extract.typedEntityByType(physicalIdentifiers, "type", "callNumber", "identifier").flatMap { it.toList() },
format = format
)
}
......
......@@ -25,6 +25,7 @@ import org.memobase.model.CreatorNameContainer
import org.memobase.model.DateContainer
import org.memobase.model.LanguageContainer
import org.memobase.model.NameContainer
import org.memobase.rdf.NS
object Extract {
private val log = LogManager.getLogger("ExtractionHelper")
......@@ -79,20 +80,20 @@ object Extract {
fun extractDate(entities: List<JsonObject>): List<DateContainer> {
return entities.map { entity ->
val isNormalized = entity.containsKey("rico:normalizedDateValue")
val isNormalized = entity.containsKey("normalizedDateValue")
val date = if (isNormalized) {
entity["rico:normalizedDateValue"] as String
entity["normalizedDateValue"] as String
} else {
entity["rico:expressedDate"] as String
entity["expressedDate"] as String
}
val qualifier = entity["rico:dateQualifier"] as String?
val certainty = entity["rico:certainty"] as String?
val qualifier = entity["dateQualifier"] as String?
val certainty = entity["certainty"] as String?
val facetList = when (entity["@type"] as String) {
"rico:SingleDate" ->
NS.rico + "SingleDate" ->
if (isNormalized)
DateFacetBuilder.buildFromNormalizedSingleDate(date)
else emptyList()
"rico:DateRange" ->
NS.rico + "DateRange" ->
if (isNormalized)
DateFacetBuilder.buildFromNormalizedDateRange(date)
else emptyList()
......@@ -131,14 +132,14 @@ object Extract {
fun extractPlaces(entities: List<JsonObject>): List<LanguageContainer> {
return entities.flatMap {
extractLanguageContainer(it["@id"] as String, it["rico:name"])
extractLanguageContainer(it["@id"] as String, it["name"])
}
}
fun extractSourceId(entities: List<JsonObject>): String {
return entities.first {
it["rico:type"] as String == "original"
}["rico:identifier"] as String? ?: error("Identifier contains no property rico:identifier: $entities.")
it["type"] as String == "original"
}["identifier"] as String? ?: error("Identifier contains no property rico:identifier: $entities.")
}
fun extractTypedCreationRelationAgent(
......@@ -148,13 +149,13 @@ object Extract {
agentTypeParam: String
): List<CreatorNameContainer> {
return creationRelations.mapNotNull { creationRelation ->
val creationRelationType = creationRelation["rico:type"] as String
val creationRelationType = creationRelation["type"] as String
if (creationRelationTypeParam != creationRelationType) return@mapNotNull null
val name = creationRelation["rico:name"] as String
val agent = getEntitiesFromIds("rico:creationRelationHasTarget", creationRelation, input).first()
val name = creationRelation["name"] as String
val agent = getEntitiesFromIds("creationRelationHasTarget", creationRelation, input).first()
val agentType = agent["@type"] as String
if (agentType != agentTypeParam) return@mapNotNull null
val agentName = extractLanguageContainer(agent["@id"] as String, agent["rico:name"])
val agentName = extractLanguageContainer(agent["@id"] as String, agent["name"])
if (agentName.isEmpty()) {
log.error("Agent/Person/CorporateBody without rico:name found: ${agent["@id"]}.")
null
......@@ -198,8 +199,8 @@ object Extract {
fun carrierType(items: List<JsonObject>): List<NameContainer> {
return items.map {
listOfStrings(it["schema:sameAs"]).let { value ->
val name = extractLanguageContainer("carrierType", it["rico:name"]).reduce { acc, languageContainer -> acc.merge(languageContainer) }
listOfStrings(it["sameAs"]).let { value ->
val name = extractLanguageContainer("carrierType", it["name"]).reduce { acc, languageContainer -> acc.merge(languageContainer) }
if (value.isEmpty()) {
NameContainer(name, emptyList())
} else {
......
......@@ -187,7 +187,7 @@ class Test {
1,
"kafkaTest1.yml",
"key"
),
)/*,
TestParam(
"test-2",
2,
......@@ -199,6 +199,6 @@ class Test {
3,
"kafkaTest1.yml",
"key"
)
)*/
)
}
This diff is collapsed.
{"title":[{"de":["Wir Menschen auf der Wega (Tonbildschau als Teil des Informationsprogramms der EKA 1978, Version von 1973 in gekürzter Form)"],"fr":[],"it":[],"un":[]}],"type":"Tonbildschau","sourceID":"IB Becker Audiovisuals / 2","id":"https://memobase.ch/record/AFZ-IB_Becker_Audiovisuals_2","descriptiveNote":[{"de":["Darstellung der Mechanismen, die zur Isolation führen, anhand eines utopischen Beispiels. Überliefert sind: 84 Kleinbild-Diapositive, 1 Audiokassette, Leitfaden (Moderatorenleitfaden für das Informationsprogramm der EKA), 1 Videokopie (VHS, unvollständig), 1 Videokopie (U-Matic, unvollständig)"],"fr":[],"it":[],"un":[]}],"scopeAndContent":[{"de":["Institutionelle Archive und Bestände / Becker Audiovisuals / 2. Tonbildschauen und Multimediaschauen (1968-1997) / 2.1. Programme zur Schulung, Sensibilisierung und Motivation / 2.1.1. Informationsprogramm Wir in der Schweiz (1973-1978)"],"fr":[],"it":[],"un":[]}],"rightsHolder":[{"de":[],"fr":[],"it":[],"un":["Archiv für Zeitgeschichte (ETH Zürich)"]}],"sameAs":["http://onlinearchives.ethz.ch/load.aspx?guid=183eddff-1bc6-4e7b-838e-9d6d783c4104"],"genre":[{"name":{"de":[],"fr":[],"it":[],"un":["Motivation"]},"facet":["Motivation"]},{"name":{"de":[],"fr":[],"it":[],"un":["Ausbildung"]},"facet":["Ausbildung"]}],"keywords":[{"name":{"de":[],"fr":[],"it":[],"un":["Miteinander und Nebeneinander"]},"facet":["Miteinander und Nebeneinander"]},{"name":{"de":[],"fr":[],"it":[],"un":["Fehlinterpretationen und Missverständnisse"]},"facet":["Fehlinterpretationen und Missverständnisse"]},{"name":{"de":[],"fr":[],"it":[],"un":["Arbeit"]},"facet":["Arbeit"]},{"name":{"de":[],"fr":[],"it":[],"un":["Integration und Segregation"]},"facet":["Integration und Segregation"]},{"name":{"de":[],"fr":[],"it":[],"un":["Vorurteile und Fremdenhass"]},"facet":["Vorurteile und Fremdenhass"]},{"name":{"de":[],"fr":[],"it":[],"un":["Teilnahme und Teilhabe"]},"facet":["Teilnahme und Teilhabe"]},{"name":{"de":[],"fr":[],"it":[],"un":["Planet Wega"]},"facet":["Planet Wega"]},{"name":{"de":[],"fr":[],"it":[],"un":["Ausbeutung"]},"facet":["Ausbeutung"]},{"name":{"de":[],"fr":[],"it":[],"un":["Heimat und Fremdheit"]},"facet":["Heimat und Fremdheit"]},{"name":{"de":[],"fr":[],"it":[],"un":["Familie"]},"facet":["Familie"]},{"name":{"de":[],"fr":[],"it":[],"un":["Umgang mit Ausländern"]},"facet":["Umgang mit Ausländern"]}],"languageContent":[{"de":[],"fr":[],"it":[],"un":["deutsch"]}],"language":[{"name":{"de":[],"fr":[],"it":[],"un":["deutsch"]},"facet":["deutsch"]}],"personCreator":[{"name":{"de":["Egon Becker"],"fr":[],"it":[],"un":[]},"relation":"creator"},{"name":{"de":["Egon Becker"],"fr":[],"it":[],"un":[]},"relation":"contributor"}],"corporateBodyProducer":[{"de":["Becker Audio-Visuals (BAV)"],"fr":[],"it":[],"un":[]}],"agentSubject":[{"de":[],"fr":[],"it":[],"un":["Sozialpartner der Schweizer Maschinen- und Metallindustrie (SMMI)"]}],"placeRelated":[{"de":[],"fr":[],"it":[],"un":["Schweiz"]}],"place":[{"name":{"de":[],"fr":[],"it":[],"un":["Schweiz"]},"facet":["Schweiz"]}],"dateCreated":[{"date":"1978","facet":["0~20.Jahrhundert~","1~20.Jahrhundert~1971-1980#"]}],"institution":[{"name":{"de":["Institution"],"fr":["institution"],"it":["istituzione"],"un":[]},"facet":["https://memobase.ch/institution/MEMORIAV"]}],"recordSet":{"name":{"de":["Bestand"],"fr":["collection"],"it":["fondo"],"un":[]},"facet":["https://memobase.ch/recordSet/EXAMPLE"]},"memoriavClaim":true,"locator":["http://digitalisate.afz.ethz.ch/?&guid=bccaf22f8d7f453cbd96469bd21840eb"],"accessDigital":["public"],"usageDigital":["http://rightsstatements.org/vocab/InC/1.0/"],"usageDigitalGroup":["Weiternutzbar unter Bedingungen (Copyright)"],"durationPhysical":["12'50''"],"callNumber":["IB Becker Audiovisuals / 2"],"accessPhysical":["onsite"],"physicalCharacteristics":[{"de":["16:9","mkv ffv1"],"fr":[],"it":[],"un":[]}],"colourPhysical":[{"de":[],"fr":[],"it":[],"un":["farbig"]}],"format":[{"name":{"de":["Kompaktkassette"],"fr":[],"it":[],"un":[]},"facet":["http://www.wikidata.org/entity/Q149757"]},{"name":{"de":["Kleinbild-Diapositive, Audiokassette, VHS, U-Matic, Mittelformat-Diapositive"],"fr":[],"it":[],"un":[]},"facet":[]},{"name":{"de":["VHS"],"fr":[],"it":[],"un":[]},"facet":["http://www.wikidata.org/entity/Q183976"]},{"name":{"de":["Diafilm"],"fr":[],"it":[],"un":[]},"facet":["http://www.wikidata.org/entity/Q166816"]}],"access":["onsite","public"]}
\ No newline at end of file
{"type":"Film","sourceID":"NoSourceIdFound","id":"https://memobase.ch/record/SFW-CJS_0451-4_d","abstract":[{"de":[],"fr":["Communiqué : <br> Pendant la Semaine Suisse un grand magasin de Zurich a consacré à l’aviation une exposition particulièrement bien documentée. <br> <br> Commentaire : <br> Pendant la Semaine Suisse, dans un grand magasin de Zurich une exposition aéronautique évoque les pionniers de notre aviation : le célèbre zinc de Dufaux, / un mémorable décollage de Taddeoli. / Ailleurs nos pilotes militaires, leurs avions et leur premier chef, / Oscar Bider, héros de la jeunesse, comme, plus tard, Walter Mittelholzer. / Une autre œuvre de pionnier : l’avion sans queue de Soldenhoff, le premier appareil de ce genre qui soit utilisable. / Le vol à voile est aussi représenté de façon captivante : un modèle sert à la démonstration des courants thermiques ascendants. / Rien ne manque dans cette exposition pas même une soufflerie. / Rarement tests aérodynamiques furent aussi éloquents. / Notre compagnie nationale d’aviation expose une maquette de sa plus récente acquisition, faite avec l’aide de la Confédération, et voici Kloten terminé, du moins en miniature. / <br> <br> <![CDATA[<a href=\"https://media.zem.ch/01WS/1950/Communique_0451.pdf\" target=\"_blank\">Communiqué_0451.pdf</a>]]>"],"it":[],"un":[]}],"descriptiveNote":[{"de":[],"fr":["Source à mentionner dans des citations et publications : <br> Archives fédérales suisses, J2.143#1996/386#451-2#4*, Ciné-Journal suisse du 03.11.1950, Les ailes (0451-4)"],"it":[],"un":[]}],"rightsHolder":[{"de":[],"fr":[],"it":[],"un":["Cinémathèque suisse, Archives fédérales suisses"]}],"sameAs":["https://www.recherche.bar.admin.ch/recherche/#/fr/recherche/plan-d-archivage/30689062"],"genre":[{"name":{"de":[],"fr":["Cinéjournal"],"it":[],"un":[]},"facet":["Cinéjournal"]}],"corporateBodyCreator":[{"name":{"de":[],"fr":["Ciné-Journal suisse (CJS)"],"it":[],"un":[]},"relation":"Autor"}],"placeRelated":[{"de":[],"fr":["Europe occidentale"],"it":[],"un":[]}],"placeCapture":[{"de":[],"fr":["Zürich, ZH (Schweiz)"],"it":[],"un":[]}],"place":[{"name":{"de":[],"fr":["Zürich, ZH (Schweiz)"],"it":[],"un":[]},"facet":["Zürich, ZH (Schweiz)"]},{"name":{"de":[],"fr":["Europe occidentale"],"it":[],"un":[]},"facet":["Europe occidentale"]}],"dateIssued":[{"date":"18570","facet":[]}],"institution":[{"name":{"de":["Institution"],"fr":["institution"],"it":["istituzione"],"un":[]},"facet":["https://memobase.ch/institution/MEMORIAV"]}],"recordSet":{"name":{"de":["Bestand"],"fr":["collection"],"it":["fondo"],"un":[]},"facet":["https://memobase.ch/recordSet/EXAMPLE"]},"memoriavClaim":true,"locator":["<![CDATA[https://media.zem.ch/01WS/1950/CJS_0451_d.mp4?start=249&end=320]]>"],"durationPhysical":["71"],"colourPhysical":[{"de":[],"fr":["NB"],"it":[],"un":[]}]}
\ No newline at end of file
{
"@context": {
"dc": "http://purl.org/dc/elements/1.1/",
"dct": "http://purl.org/dc/terms/",
"ebucore": "http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#",
"rdau": "http://rdaregistry.info/Elements/u/",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"rico": "https://www.ica.org/standards/RiC/ontology#",
"schema": "http://schema.org/",
"skos": "http://www.w3.org/2004/02/skos/core#"
},
"@graph": [
{
"@id": "https://memobase.ch/instantiation/physical/FER-90469-0",
"@type": "rico:Instantiation",
"ebucore:duration": "02:00:04",
"ebucore:hasMedium": {
"@language": "de",
"@value": "Film 16mm"
},
"rico:conditionsOfUse": {
"@language": "fr",
"@value": "FER a obtenu par RSI le droit d'utilisation \u00e0 but non lucrative dans les domaines acad\u00e9miques, scolaires et de la recherche."
},
"rico:identifiedBy": [
{
"@id": "_:Naff15b3f8b3841159e72b4093d8b7423"
},
{
"@id": "_:Ndc8b007e90dd44858ca8759430b9b7ea"
}
],
"rico:instantiates": {
"@id": "https://memobase.ch/record/FER-90469"
},
"rico:regulatedBy": [
{
"@id": "_:N473f6d0e7256458684243accf2eaf21d"
},
{
"@id": "_:Nbfafd4dacfe245de87b00bb0c55921da"
}
],
"rico:type": "physicalObject"
},
{
"@id": "_:Naff15b3f8b3841159e72b4093d8b7423",
"@type": "rico:Identifier",
"rico:identifier": "A502911",
"rico:type": "callNumber"
},
{
"@id": "_:N473f6d0e7256458684243accf2eaf21d",
"@type": "rico:Rule",
"rico:name": "onsite",
"rico:regulates": {
"@id": "https://memobase.ch/instantiation/physical/FER-90469-0"
},
"rico:type": "access"
},
{
"@id": "_:Ndc8b007e90dd44858ca8759430b9b7ea",
"@type": "rico:Identifier",
"rico:identifier": "https://memobase.ch/instantiation/physical/FER-90469-0",
"rico:type": "main"
},
{
"@id": "_:Nbfafd4dacfe245de87b00bb0c55921da",
"@type": "rico:Rule",
"rico:name": "In Copyright (InC)",
"rico:regulates": {
"@id": "https://memobase.ch/instantiation/physical/FER-90469-0"
},
"rico:type": "usage",
"schema:sameAs": "http://rightsstatements.org/vocab/InC/1.0/"
},
{
"@id": "https://memobase.ch/record/FER-90469",
"@type": "rico:Record",
"dct:abstract": {
"@language": "it",
"@value": "Decima edizione del programma concorso natalizio dedicato all\u2019emigrazione svizzero-italiana in Papua Nuova Guinea, Australia e Nuova Zelanda. A Bougainville incontro con Elenita Spertini-Baumer, originaria di Ascona che racconta le evoluzioni delle isole. \u00c8 venuta con suo marito, geologo che lavoro nel complesso minerario di Paguna. Parla del cantiere delle tribu dell\u2019isola. Tappa a Hong Kong per intervistare il missionario Sady Stoppa di Pedrinate. Dal Ticino la sua madre racconta la sua partenza. Il viaggio si prolunga a Melbourne dove vive il pasticciere Marco Braendli di Ascona. In un orfanotrofio a Nord di Tokyo Riuniti per natale incontra con Suor Maria Motta di Airolo, che ha ricevuto una ricompensa onorifica dall\u2019imperatore giapponese per l\u2019opera nell\u2019orfanotrofio. A Mount Isa in Australia incontro con giovani ticinesi che hanno scelto di emigrare in Australia, come Carlo Giovanola di Ascona, Florido Bizzozzero di Vezia, Antonio Pirola di Bellinzona, Claudio Bettosini di Vezia. Poi nelle miniere di Broken Hill Vincenzo Dorrizzi di Poschiavo racconta la sua scelta di rimanere in Australia. In un inserto Glen Tomasetti di Avegno e Giorgio Cheda di Maggia raccontano l\u2019ondata di emigrazione ticinese 120 anni fa in Australia alla ricerca della fortuna. Poi piccolo servizio sulla capitale australiana Sydney. Segue poi un servizio dedicato a tre donne ticinesi, Rosalba Papina di Mergoscia, Bruna Luchessa di Lavertezzo, Dorina Dedini di Lavertezzo, che hanno lasciato il Ticino per l\u2019Australia, la Nuova Zelanda e la Papua Nuova Guinea. In Nuova Zelanda incontro con la famiglia Cortesi - Zaug di Poschiavo. Si torna a Sydney in compagnia della chimica Silvia Nobile originaria di Campestro. Racconta le sue difficolt\u00e0 in Svizzera per trovare un lavoro in quanto donna laureata. Il servizio si conclude con la giuria per la 10.ma edizione di Riuniti per natale. Il presidente Enrico Celio annuncia l\u2019attribuzione del premio 1973 a Vicente Dorizzi, emigrato da Poschiavo in Australia nel 1920."
},
"dct:created": {
"@id": "_:Nadc7660275aa49baba72a3ed9769ea1c"
},
"dct:issued": {
"@id": "_:N454d1a8ca8874a519432325e5676c3f9"
},
"ebucore:hasGenre": {
"@id": "_:N8d74902d61ea4518bf0c6528746a7b21"
},
"rdau:P60451": {
"@id": "https://memobase.ch/institution/Memoriav"
},
"rdau:P60556": {
"@id": "_:N8b9c27d63da544839d9d82d1263a3033"
},
"rico:hasInstantiation": {
"@id": "https://memobase.ch/instantiation/physical/FER-90469-0"
},
"rico:hasLanguage": {
"@id": "_:N26ae2a2097e1430a9ea21c12df585190"
},
"rico:hasSubject": [
{
"@id": "_:N2f528aede7a74d65882451caab4a4e14"
},
{
"@id": "_:Ndb50ee19e99a40e8ba1f1b05b5c694f7"
}
],
"rico:hasTitle": {
"@id": "_:N84e50b3cc119454692c90fce475ddc33"
},
"rico:heldBy": {
"@id": "https://memobase.ch/institution/FER"
},
"rico:identifiedBy": [
{
"@id": "_:N8423c02534d74c69b89cbce939517709"
},
{
"@id": "_:Ndfa422d68c7a4496be4e920a42b1da44"
}
],
"rico:isPartOf": {
"@id": "https://memobase.ch/recordSet/FER-RPN"
},
"rico:publishedBy": {
"@id": "_:Nbc94a6f10ebc4e6f86741edd8492aad2"
},
"rico:recordResourceOrInstantiationIsSourceOfCreationRelation": [
{
"@id": "_:N828cef0b11b44193a830d50ce99b9379"
},
{
"@id": "_:N493c1f64a7ff4e95825aec5e7cdbe390"
}
],
"rico:regulatedBy": {
"@id": "_:Nefaf578a7c4c4c89a82ca8294df95732"
},
"rico:title": {
"@language": "it",
"@value": "Riuniti per Natale 1973"
},
"rico:type": "TV"
},
{
"@id": "_:N8423c02534d74c69b89cbce939517709",
"@type": "rico:Identifier",
"rico:identifier": "https://memobase.ch/record/FER-90469",
"rico:type": "main"
},
{
"@id": "_:N26ae2a2097e1430a9ea21c12df585190",
"@type": "rico:Language",
"rico:name": {
"@language": "it",
"@value": "Italiano, dialetto ticinese"
},
"rico:type": "content"
},
{
"@id": "_:N2f528aede7a74d65882451caab4a4e14",
"@type": "skos:Concept",
"skos:editorialNote": "Ursprungsfeld: Schlagworte",
"skos:prefLabel": {
"@language": "it",
"@value": "Ticino, emigrazione, viaggi"
}
},
{
"@id": "_:N84e50b3cc119454692c90fce475ddc33",
"@type": "rico:Title",
"rico:title": {
"@language": "it",
"@value": "Riuniti per Natale 1973"
},
"rico:type": "main"
},
{
"@id": "_:N828cef0b11b44193a830d50ce99b9379",
"@type": "rico:CreationRelation",
"rico:creationRelationHasSource": {
"@id": "https://memobase.ch/record/FER-90469"
},
"rico:creationRelationHasTarget": {
"@id": "_:Nc6e12d9e50184e9db2c643a00a5bf593"
},
"rico:type": "creator",
"rico:name": "contributor"
},
{
"@id": "_:Nc6e12d9e50184e9db2c643a00a5bf593",
"@type": "rico:Person",
"rico:agentIsTargetOfCreationRelation": {
"@id": "_:N828cef0b11b44193a830d50ce99b9379"
},
"rico:name": {
"@language"