{ "translatorID": "14763d25-8ba0-45df-8f52-b8d1108e7ac9", "label": "Bibliontology RDF", "creator": "Simon Kornblith", "target": "rdf", "minVersion": "2.0", "maxVersion": "", "priority": 50, "configOptions": { "getCollections": "true", "dataMode": "rdf/xml" }, "displayOptions": { "exportNotes": true }, "inRepository": true, "translatorType": 3, "browserSupport": "gcsibv", "lastUpdated": "2022-09-30 10:56:50" } var n = { address:"http://schemas.talis.com/2005/address/schema#", // could also use vcard? bibo:"http://purl.org/ontology/bibo/", ctag:"http://commontag.org/ns#", dcterms:"http://purl.org/dc/terms/", doap:"http://usefulinc.com/ns/doap#", foaf:"http://xmlns.com/foaf/0.1/", link:"http://purl.org/rss/1.0/modules/link/", po:"http://purl.org/ontology/po/", rdf:"http://www.w3.org/1999/02/22-rdf-syntax-ns#", rel:"http://www.loc.gov/loc.terms/relators/", res:"http://purl.org/vocab/resourcelist/schema#", sc:"http://umbel.org/umbel/sc/", sioct:"http://rdfs.org/sioc/types#", z:"http://www.zotero.org/namespaces/export#" }; /** Types should be in the form : [, , ] Item classes should be in the form [[, ]+] This generates the triples (ITEM )+ Subcontainer and container classes should be in the form [, , [, ]*] | null If there is a property to be applied to the container, or if is true, then this generates ITEM CONTAINER (CONTAINER )* **/ // ZOTERO TYPE ITEM CLASS SUBCONTAINER CLASS CONTAINER CLASS var TYPES = { "artwork": [[[n.rdf+"type", n.bibo+"Image"]], null, null], "attachment": [[[n.rdf+"type", n.z+"Attachment"]], null, null], "audioRecording": [[[n.rdf+"type", n.bibo+"AudioDocument"]], null, null], "bill": [[[n.rdf+"type", n.bibo+"Bill"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Code"]]]], "blogPost": [[[n.rdf+"type", n.sioct+"BlogPost"], [n.rdf+"type", n.bibo+"Article"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.sioct+"Weblog"], [n.rdf+"type", n.bibo+"Website"]]]], "book": [[[n.rdf+"type", n.bibo+"Book"]], null, null], "bookSection": [[[n.rdf+"type", n.bibo+"BookSection"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"EditedBook"]]]], "case": [[[n.rdf+"type", n.bibo+"LegalCaseDocument"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"CourtReporter"]]]], "computerProgram": [[[n.rdf+"type", n.sc+"ComputerProgram_CW"], [n.rdf+"type", n.bibo+"Document"]], null, null], "conferencePaper": [[[n.rdf+"type", n.bibo+"Article"]], null, [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Proceedings"]]]], "dictionaryEntry": [[[n.rdf+"type", n.bibo+"Article"]], null, [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.sc+"Dictionary"], [n.rdf+"type", n.bibo+"ReferenceSource"]]]], "document": [[[n.rdf+"type", n.bibo+"Document"]], null, null], "email": [[[n.rdf+"type", n.bibo+"Email"]], null, null], "encyclopediaArticle": [[[n.rdf+"type", n.bibo+"Article"]], null, [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.sc+"Encyclopedia"], [n.rdf+"type", n.bibo+"ReferenceSource"]]]], "forumPost": [[[n.rdf+"type", n.sioct+"BoardPost"], [n.rdf+"type", n.bibo+"Article"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.sioct+"MessageBoard"], [n.rdf+"type", n.bibo+"Website"]]]], "film": [[[n.rdf+"type", n.bibo+"Film"]], null, null], "hearing": [[[n.rdf+"type", n.bibo+"Hearing"]], null, null], "instantMessage": [[[n.rdf+"type", n.sioct+"InstantMessage"], [n.rdf+"type", n.bibo+"PersonalCommunication"]], null, null], "interview": [[[n.rdf+"type", n.bibo+"Interview"]], null, null], "journalArticle": [[[n.rdf+"type", n.bibo+"AcademicArticle"]], [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Issue"]]], [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Journal"]]]], "letter": [[[n.rdf+"type", n.bibo+"Letter"]], null, null], "magazineArticle": [[[n.rdf+"type", n.bibo+"Article"]], [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Issue"]]], [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Magazine"]]]], "manuscript": [[[n.rdf+"type", n.bibo+"Manuscript"]], null, null], "map": [[[n.rdf+"type", n.bibo+"Map"]], null, null], "newspaperArticle": [[[n.rdf+"type", n.bibo+"Article"]], [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Issue"]]], [true, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Newspaper"]]]], "note": [[[n.rdf+"type", n.bibo+"Note"]], null, null], "patent": [[[n.rdf+"type", n.bibo+"Patent"]], null, null], "podcast": [[[n.rdf+"type", n.z+"Podcast"], [n.rdf+"type", n.bibo+"AudioDocument"]], null, null], "presentation": [[[n.rdf+"type", n.bibo+"Slideshow"]], null, null], "radioBroadcast": [[[n.rdf+"type", n.po+"AudioDocument"], [n.rdf+"type", n.po+"Episode"], [n.po+"broadcast_on", n.po+"Radio"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.po+"Programme"]]]], "report": [[[n.rdf+"type", n.bibo+"Report"]], null, null], "statute": [[[n.rdf+"type", n.bibo+"Statute"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Code"]]]], "thesis": [[[n.rdf+"type", n.bibo+"Thesis"]], null, null], "tvBroadcast": [[[n.rdf+"type", n.bibo+"AudioVisualDocument"], [n.rdf+"type", n.po+"Episode"], [n.po+"broadcast_on", n.po+"TV"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.po+"Programme"]]]], "videoRecording": [[[n.rdf+"type", n.bibo+"AudioVisualDocument"]], null, null], "webpage": [[[n.rdf+"type", n.bibo+"Webpage"]], null, [false, n.dcterms+"isPartOf", [[n.rdf+"type", n.bibo+"Website"]]]] }; /** * This is just a map of un-namespaced BIBO item types to Zotero item types */ var BIBO_TYPES = { "Article": "magazineArticle", "Brief": "case", "Chapter": "bookSection", "CollectedDocument": "document", "DocumentPart": "document", "EditedBook": "book", "Excerpt": "note", "Quote": "note", "Film": "videoRecording", "LegalDecision": "case", "LegalDocument": "case", "Legislation": "bill", "Manual": "book", "Performance": "presentation", "PersonalCommunication": "letter", "PersonalCommunicationDocument": "letter", "Slide": "presentation", "Standard": "report", "Website": "webpage" }; var USERITEM = 1; var ITEM = 2; var SUBCONTAINER = 3; var CONTAINER = 4; var ITEM_SERIES = 5; var SUBCONTAINER_SERIES = 6; // not used var CONTAINER_SERIES = 7; /** Fields should be in the form : ([, ] | ) If a is specified, then it is passed the item and should return a set of triples in the form [[, , , ]*] where refers to one of the constants defined above. If is true, then is treated as a literal. If a is not used and is a string, then the parameters generate a triple in the form FIELD_CONTENT where refers to one of the constants defined above. Alternatively, may be an array in the form [, [, ]*, ] This generates the triples ( )* FIELD_CONTENT **/ var FIELDS = { "url": [ITEM, n.bibo+"uri"], "rights": [USERITEM, n.dcterms+"rights"], "series": [CONTAINER_SERIES, n.dcterms+"title"], "volume": [SUBCONTAINER, n.bibo+"volume"], "issue": [SUBCONTAINER, n.bibo+"issue"], "edition": [SUBCONTAINER, n.bibo+"edition"], "place": [CONTAINER, [n.dcterms+"publisher", [[n.rdf+"type", n.foaf+"Organization"]], n.address+"localityName"]], "country": [CONTAINER, [n.dcterms+"publisher", [[n.rdf+"type", n.foaf+"Organization"]], n.address+"countryName"]], "publisher": [CONTAINER, [n.dcterms+"publisher", [[n.rdf+"type", n.foaf+"Organization"]], n.foaf+"name"]], "pages": [ITEM, n.bibo+"pages"], "firstPage": [ITEM, n.bibo+"pageStart"], "ISBN": [function(item) { var isbns = item.ISBN.split(/, ?| /g); var triples = []; for (var i=0; i bestScore) { subNode = statement[2]; bestScore = testScore; } } score += bestScore; } else if (definition.alwaysAdd) { score -= definition.pairs.length; } } return [score, subNode]; } /** * Get USERITEM and SERIES nodes for this type */ Type.prototype.getItemSeriesNodes = function(nodes) { const seriesDefinition = {"alwaysAdd":true, "predicate":n.dcterms+"isPartOf", "pairs":[[n.rdf+"type", n.bibo+"Series"]]}; // get user item node var stmt = Zotero.RDF.getStatementsMatching(null, n.res+"resource", nodes[ITEM]); nodes[USERITEM] = stmt ? stmt[0][0] : nodes[ITEM]; // get ITEM_SERIES node var tmp = this._scoreNodeRelationship(nodes[ITEM], seriesDefinition, 0); var score = tmp[0]; var subNode = tmp[1]; //Zotero.debug("got itemSeries with score "+score); if (score >= 1) nodes[ITEM_SERIES] = subNode; // get SUBCONTAINER_SERIES node tmp = this._scoreNodeRelationship(nodes[SUBCONTAINER], seriesDefinition, 0); score = tmp[0]; subNode = tmp[1]; //Zotero.debug("got subcontainerSeries with score "+score); if (score >= 1) nodes[CONTAINER_SERIES] = subNode; // get CONTAINER_SERIES node tmp = this._scoreNodeRelationship(nodes[CONTAINER], seriesDefinition, 0); score = tmp[0]; subNode = tmp[1]; //Zotero.debug("got containerSeries with score "+score); if (score >= 1) nodes[CONTAINER_SERIES] = subNode; } /** * Add triples to relate nodes. Called after all properties have been added, so we know which nodes * need to be related. */ Type.prototype.addNodeRelations = function(nodes) { // add node relations var list = [ITEM_SERIES, SUBCONTAINER_SERIES, CONTAINER_SERIES]; for (var h=0; h1; j--) { if (Zotero.RDF.getResourceURI(nodes[j]) != Zotero.RDF.getResourceURI(nodes[i])) { Zotero.RDF.addStatement(nodes[j], predicate, nodes[i], false); break; } } } } } /** * Create USERITEM/ITEM/CONTAINER/SUBCONTAINER nodes for this type * @returns {Object} The created nodes */ Type.prototype.createNodes = function(item) { var nodes = {}; nodes[USERITEM] = (item.uri ? item.uri : "#item_"+item.itemID); // come up with an item node URI nodes[ITEM] = null; // try the URL as URI if (item.url) { nodes[ITEM] = encodeURI(item.url); if (usedURIs[nodes[ITEM]]) nodes[ITEM] = null; } // try the DOI as URI if (!nodes[ITEM] && item.DOI) { var doi = item.DOI; if (doi.substr(0, 4) == "doi:") { doi = doi.substr(4); } else if (doi.substr(0, 8) == "urn:doi:") { doi = doi.substr(8); } else if (doi.substr(0, 9) == "info:doi/") { doi = doi.substr(9); } else if (doi.substr(0, 18) == "http://dx.doi.org/") { doi = doi.substr(18); } nodes[ITEM] = "info:doi/"+encodeURI(doi); if (usedURIs[nodes[ITEM]]) nodes[ITEM] = null; } // try the ISBN as URI if (!nodes[ITEM] && item.ISBN) { var isbn = item.ISBN.split(/, ?| /g)[0]; nodes[ITEM] = "urn:isbn:"+encodeURI(isbn); if (usedURIs[nodes[ITEM]]) nodes[ITEM] = null; } // no suitable item URI; fall back to a blank node if (!nodes[ITEM]) nodes[ITEM] = Zotero.RDF.newResource(); usedURIs[Zotero.RDF.getResourceURI(nodes[ITEM])] = true; // attach item node to user item node Zotero.RDF.addStatement(nodes[USERITEM], RDF_TYPE, n.z+"UserItem", false); Zotero.RDF.addStatement(nodes[USERITEM], n.res+"resource", nodes[ITEM], false); // container node nodes[CONTAINER] = (this[CONTAINER] ? Zotero.RDF.newResource() : nodes[ITEM]); // subcontainer node nodes[SUBCONTAINER] = (this[SUBCONTAINER] ? Zotero.RDF.newResource() : nodes[CONTAINER]); // series nodes nodes[ITEM_SERIES] = Zotero.RDF.newResource(); nodes[CONTAINER_SERIES] = (this[CONTAINER] ? Zotero.RDF.newResource() : nodes[ITEM_SERIES]); nodes[SUBCONTAINER_SERIES] = (this[SUBCONTAINER] ? Zotero.RDF.newResource() : nodes[CONTAINER_SERIES]); return nodes; } /** * A class representing a BIBO-to-Zotero literal property mapping */ LiteralProperty = function(field) { this.field = field; this.mapping = FIELDS[field]; if (!this.mapping) { //Zotero.debug("WARNING: unrecognized field "+field+" in Bibliontology RDF; mapping to Zotero namespace"); this.mapping = [ITEM, n.z+field]; } } /** * Maps property from a set of RDF nodes to an item */ LiteralProperty.prototype.mapToItem = function(newItem, nodes) { if (typeof this.mapping[0] == "function") { // function case: triples returned // check function case var content = this.mapping[1](nodes); if (!content) return false; newItem[this.field] = content; } else { var node = nodes[this.mapping[0]]; if (!node) return false; var statements = getStatementsByDefinition(this.mapping[1], node); if (!statements) return false; var content = []; for (var i=0; i bestTypeScore) { bestTypeScore = score; bestType = type; bestNodes = nodes; } } } // skip if this doesn't fit any type very well if (bestTypeScore < 1) { //Zotero.debug("No good type mapping; best type was "+bestType.zoteroType+" with score "+bestTypeScore); continue; } //Zotero.debug("Got item of type "+bestType.zoteroType+" with score "+bestTypeScore); nodes = bestNodes; bestType.getItemSeriesNodes(nodes); // create item var zoteroType = bestType.zoteroType; var newItem = new Zotero.Item(zoteroType); // handle ordinary properties var allCreators = {} for (var i in nodes) { var propertiesHandled = {}; var properties = Zotero.RDF.getArcsOut(nodes[i]); for (var g=0; g\n \n \n 2017-05-28 14:08:38\n libreas.eu\n \n \n http://libreas.eu/ausgabe29/05kim/\n de\n Im Folgenden soll aufgezeigt werden, wie derzeit das Literaturverwaltungsprogramm Zotero innerhalb des Index Theologicus genutzt wird, um unselbstständige Literatur in einem bibliothekarischen Katalogisierungssystem zu erfassen. Die modulare und flexible Architektur der Open Source Software erlaubt es, die bereits kollaborativ zusammengetragene Programmierarbeit zur Datenextraktion mitzunutzen. Das vorgestellte semiautomatische Verfahren bringt auch bei der Verknüpfung von Normdaten erhebliche Vorteile für die Medienbearbeitung. </br> <b>Schlüsselwörter</b>: Literaturverwaltungsprogramm, Zotero, Katalogisierung, Unselbständige Werke, Aufsatzliteratur, Index Theologicus, Online-Bibliographie, WinIBW, Fachinformationsdienst Theologie <hr> This article presents an approach to use the reference management software Zotero within the theological article database Index Theologicus to catalogue article metadata for a library management system. Zotero's Open Source nature and flexible architecture allowed us to seamlessly reuse the vast amount of data extraction routines collaboratively developed for the software. We will show how the semi-automatic workflow we developed will make authority linking fun again. </br> <b>Keywords:</b> Reference Management System, Zotero, Cataloguing, Journal articles, Index Theologicus, Theological database, Academic Information Services for Theology\n Semiautomatische Katalogisierung und Normdatenverknüpfung mit Zotero im Index Theologicus\n \n \n \n \n \n \n \n 29\n 2016\n \n \n LIBREAS. Library Ideas\n 1860-7950\n \n \n \n \n \n \n Timotheus Chang-whae\n Kim\n \n \n Philipp\n Zumstein\n \n\n", "items": [ { "itemType": "journalArticle", "title": "Semiautomatische Katalogisierung und Normdatenverknüpfung mit Zotero im Index Theologicus", "creators": [ { "lastName": "Kim", "firstName": "Timotheus Chang-whae" }, { "lastName": "Zumstein", "firstName": "Philipp" } ], "date": "2016", "ISSN": "1860-7950", "abstractNote": "Im Folgenden soll aufgezeigt werden, wie derzeit das Literaturverwaltungsprogramm Zotero innerhalb des Index Theologicus genutzt wird, um unselbstständige Literatur in einem bibliothekarischen Katalogisierungssystem zu erfassen. Die modulare und flexible Architektur der Open Source Software erlaubt es, die bereits kollaborativ zusammengetragene Programmierarbeit zur Datenextraktion mitzunutzen. Das vorgestellte semiautomatische Verfahren bringt auch bei der Verknüpfung von Normdaten erhebliche Vorteile für die Medienbearbeitung.
Schlüsselwörter: Literaturverwaltungsprogramm, Zotero, Katalogisierung, Unselbständige Werke, Aufsatzliteratur, Index Theologicus, Online-Bibliographie, WinIBW, Fachinformationsdienst Theologie
This article presents an approach to use the reference management software Zotero within the theological article database Index Theologicus to catalogue article metadata for a library management system. Zotero's Open Source nature and flexible architecture allowed us to seamlessly reuse the vast amount of data extraction routines collaboratively developed for the software. We will show how the semi-automatic workflow we developed will make authority linking fun again.
Keywords: Reference Management System, Zotero, Cataloguing, Journal articles, Index Theologicus, Theological database, Academic Information Services for Theology", "issue": "29", "language": "de", "libraryCatalog": "libreas.eu", "publicationTitle": "LIBREAS. Library Ideas", "url": "http://libreas.eu/ausgabe29/05kim/", "attachments": [], "tags": [], "notes": [], "seeAlso": [] } ] } ] /** END TEST CASES **/