Mercurial > hg > classical
changeset 1:29ca5974905d classical-rdf
* More work on a nice tidy import; get some sensible URIs etc
author | Chris Cannam |
---|---|
date | Thu, 03 Dec 2009 15:42:10 +0000 |
parents | e8f4c2b55fd8 |
children | ff067a1e7e3d |
files | common/Objects.cpp common/Objects.h import/Import.cpp import/ImportClassicalComposersOrg.cpp import/Test.cpp import/importers.ttl |
diffstat | 6 files changed, 1147 insertions(+), 1061 deletions(-) [+] |
line wrap: on
line diff
--- a/common/Objects.cpp Tue Dec 01 17:50:41 2009 +0000 +++ b/common/Objects.cpp Thu Dec 03 15:42:10 2009 +0000 @@ -12,6 +12,39 @@ QMap<QString, Form *> Form::m_map; QMutex Form::m_mutex; +bool +Composer::datesMatch(const Composer *b) const +{ + const Composer *a = this; + + if (a->birth() && b->birth()) { + int ay = a->birth()->year(), by = b->birth()->year(); + if (ay < 1800 || // birth dates before 1700 tend to be vague! + a->birth()->approximate() || + b->birth()->approximate()) { + if (abs(ay - by) > 25) return false; + } else { + if (abs(ay - by) > 1) { + return false; + } + } + } + if (a->death() && b->death()) { + int ay = a->death()->year(), by = b->death()->year(); + if (a->death()->approximate() || b->death()->approximate()) { + if (abs(ay - by) > 10) return false; + } else if (ay < 1700) { + if (abs(ay - by) > 25) return false; + } else if (ay < 1800) { + // cut a bit of slack, but not as much as for birth date + if (abs(ay - by) > 10) return false; + } else { + if (abs(ay - by) > 1) return false; + } + } + return true; +} + QString Composer::getSortName(bool caps) const {
--- a/common/Objects.h Tue Dec 01 17:50:41 2009 +0000 +++ b/common/Objects.h Thu Dec 03 15:42:10 2009 +0000 @@ -291,6 +291,7 @@ const Death *death() const { return m_death; } void setDeath(Death *d) { m_death = d; } + bool datesMatch(const Composer *other) const; // "well enough" QString getSortName(bool caps) const; QString getDisplayDates() const;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/import/Import.cpp Thu Dec 03 15:42:10 2009 +0000 @@ -0,0 +1,862 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +#include "Objects.h" + +#include <dataquay/BasicStore.h> +#include <dataquay/RDFException.h> +#include <dataquay/objectmapper/ObjectMapper.h> +#include <dataquay/objectmapper/ObjectBuilder.h> +#include <dataquay/objectmapper/ContainerBuilder.h> + +#include "ImportClassicalComposersOrg.h" +#include "ImportClassicalDotNet.h" +#include "ImportWikipediaComposers.h" +#include "ImportWikipediaWorks.h" +#include "ImportWikipediaWorksK.h" +#include "ImportWikipediaWorksList.h" +#include "ImportHoboken.h" + +#include <dataquay/Debug.h> + +using namespace ClassicalData; +using namespace Dataquay; + +#include <iostream> +#include <set> + +typedef QMap<QString, QSet<Composer *> > ComposerMap; // name -> composers + +void +addMiscExpansions(Composer *c) +{ + QString n = c->name(); + + DEBUG << "addMiscExpansions: n = " << n << endl; + + // lovely hard-coded special cases go here! some of these are + // needed for works->composer assignments + if (n == "Balakirev, Milii") { + c->addAlias("Mily Balakirev"); + } + if (n.startsWith("Cui, C")) { + c->addAlias(QString::fromUtf8("C\303\251sar Cui")); + } + if (n == "Handel, George Frideric") { + c->addAlias("Handel, Georg Friedrich"); + c->addAlias("Handel"); + } + if (n == "Prokofiev, Sergey") { + c->addAlias("Prokofieff, Sergei"); + c->addAlias("Sergei Prokofieff"); + } + if (n == "Rossini, Gioacchino") { + c->addAlias("Rossini, Gioachino"); + c->addAlias("Gioachino Rossini"); + } + if (n == "Edwards, Richard") { + c->addAlias("Edwardes, Richard"); + c->addAlias("Richard Edwardes"); + c->addAlias("Richard Edwards"); + } + if (n == "Rimsky-Korsakov, Nikolay Andreyevich") { + c->addAlias("Nikolai Rimsky-Korsakov"); + } + if (n.startsWith("Piccinni, Nico")) { + c->addAlias(n); + c->setName(QString::fromUtf8("Piccinni, Niccol\303\262")); + } + if (n == "Tchaikovsky, Pyotr Ilyich") { + c->addAlias("Tchaikovsky, Piotr Ilyitch"); + } + if (n == "Wilhelm Stenhammar") { + c->addAlias("Stenhammar, Vilhelm Eugene"); + c->setName("Stenhammar, Wilhelm"); + c->addAlias(n); + } + if (n == "Mercadante, Saverio Rafaele") { + c->addAlias("Mercadante, Giuseppe"); + } + if (n == "Johann Wenzel Anton Stamitz") { + c->addAlias(n); + c->setName("Stamitz, Johann Wenzel Anton"); + c->addAlias("Stamitz, Jan Vaclav"); + } + if (n == "Mario Castelnuovo-Tedesco") { + c->addAlias("Castelnuovo Tedesco, Mario"); + } + if (n == "Mayr, Simon") { + c->addAlias("Mayr"); + } + + n.replace(", Sr.", " Sr."); + n.replace(", Jr.", " Jr."); + + int comma = n.indexOf(", "); + if (comma > 0 && comma + 2 < n.length()) { + + QString left = n.left(comma); + QString right = n.right(n.length() - comma - 2); + + QRegExp jrsr("( (Sr\\.|Jr\\.|I|II))$"); + if (jrsr.indexIn(right) >= 0) { + left = left + jrsr.cap(1); + right = right.left(right.length()-jrsr.matchedLength()); + } + n = right + " " + left; + } + + if (n != c->name()) c->addAlias(n); + + if (n.contains("Sergey")) { + QString nn(n); + nn.replace("Sergey", "Sergei"); + c->addAlias(nn); + } else if (n.contains("Sergei")) { + QString nn(n); + nn.replace("Sergei", "Sergey"); + c->addAlias(nn); + } + + QRegExp sr("((, )?Sr\\.|Senior|\\(?the elder\\)?)", Qt::CaseInsensitive); + if (sr.indexIn(n) >= 0) { + QString nr = n; + nr.replace(sr.pos(0), sr.matchedLength(), " I"); + nr.replace(" ", " "); + DEBUG << "addMiscExpansions: trying " << nr << " for " << n << endl; + c->addAlias(nr); + } + QRegExp jr("((, )?Jr\\.|Junior|\\(?the younger\\)?)", Qt::CaseInsensitive); + if (jr.indexIn(n) >= 0) { + QString nr = n; + nr.replace(jr.pos(0), jr.matchedLength(), " II"); + nr.replace(" ", " "); + DEBUG << "addMiscExpansions: trying " << nr << " for " << n << endl; + c->addAlias(nr); + } + QString nr = n; + nr.replace("(I)", "I"); + nr.replace("(II)", "II"); + nr.replace("(III)", "III"); + c->addAlias(nr); +} + +bool namesFuzzyMatch(QString an, Composer *b) +{ + // ew! + + QString bn = b->name(); + if (bn == an) return true; + if (b->aliases().contains(an)) return true; + int aSurnameIndex = 0, bSurnameIndex = 0; + if (an.contains(",")) { + an.replace(",", ""); + } else { + aSurnameIndex = -1; + } + if (bn.contains(",")) { + bn.replace(",", ""); + } else { + bSurnameIndex = -1; + } + QStringList nl = an.split(QRegExp("[ -]")); + QStringList bnl = bn.split(QRegExp("[ -]")); + int matchCount = 0; + QString surnameMatch = ""; + if (aSurnameIndex == -1) aSurnameIndex = nl.size()-1; + if (bSurnameIndex == -1) bSurnameIndex = bnl.size()-1; + if (nl[aSurnameIndex][0].isUpper() && + nl[aSurnameIndex] != "Della" && + nl[aSurnameIndex] == bnl[bSurnameIndex]) { + surnameMatch = nl[aSurnameIndex]; + } + foreach (QString elt, nl) { + if (!elt[0].isUpper() || elt == "Della") continue; + if (bnl.contains(elt)) { + ++matchCount; + continue; + } + } + if (matchCount > 1 && surnameMatch != "") { + DEBUG << "namesFuzzyMatch: note: surnameMatch = " << surnameMatch << endl; + return true; + } + return false; +} + +bool +hasBetterName(Composer *c, Composer *other) +{ + if (c->name() == other->name()) return false; + + // Try to guess which of c and other is more likely to have a good + // "canonical form" of the composer's name + + if (c->name().startsWith("van ")) { + return false; // wrong choice of sort for e.g. LvB; should be + // Beethoven, Ludwig van, not van Beethoven, Ludwig + } + if (other->name().startsWith("van ")) { + return true; + } + + if (c->aliases().size() != other->aliases().size()) { + // a rather weak heuristic + return c->aliases().size() > other->aliases().size(); + } + + if (c->name().contains(',') && !other->name().contains(',')) { + // another rather weak heuristic + return true; + } + + return false; +} + +void mergeComposer(Composer *c, ComposerMap &composers) +{ + QString name = c->name(); + + QSet<QString> allNames = c->aliases(); + allNames.insert(name); + + QString dates; + if (c->birth()) { + if (c->death()) { + dates = QString("%1-%2").arg(c->birth()->year()).arg(c->death()->year()); + } else { + dates = QString("%1-").arg(c->birth()->year()); + } + } + if (dates != "") { + allNames.insert(dates); + } + + QSet<Composer *> matches; + + foreach (QString candidateName, allNames) { + QString key = candidateName.toLower(); + if (composers.contains(key)) { + foreach (Composer *candidate, composers[key]) { + if (candidateName == dates) { + if (!namesFuzzyMatch(c->name(), candidate) && + !namesFuzzyMatch(candidate->name(), c)) { + DEBUG << "mergeComposer: Names differ for " << c->name() << " and " << candidate->name() << " (having matched date(s) " << dates << ")" << endl; + continue; + } else { + DEBUG << "mergeComposer: Note: Fuzzy name match for " << c->name() << " and " << candidate->name() << " with date(s) " << dates << endl; + } + } else { + if (!c->datesMatch(candidate)) { + DEBUG << "mergeComposer: Dates differ for " << c->name() << " and " << candidate->name() << endl; + continue; + } + } + matches.insert(candidate); + } + } + } + + if (matches.empty()) { + DEBUG << "mergeComposer: No existing composer with alias matching any alias of " << c->name() << ", adding" << endl; + + if (!c->birth() && !c->death()) { + // laboriously look for fuzzy match across _all_ composers + for (ComposerMap::iterator i = composers.begin(); + i != composers.end(); ++i) { + foreach (Composer *candidate, *i) { + if (namesFuzzyMatch(c->name(), candidate)) { + DEBUG << "mergeComposer: Found fuzzy match for undated composer " << c->name() << " as " << candidate->name() << ", daringly merging" << endl; + matches.insert(candidate); + break; + } + } + if (!matches.empty()) break; + } + } + + if (matches.empty()) { + foreach (QString candidateName, allNames) { + composers[candidateName.toLower()].insert(c); + DEBUG << "added for alias or date " << candidateName << endl; + } + return; + } + } + + if (matches.size() > 1) { + DEBUG << "mergeComposer: More than one composer matches name and date(s) for " << c->name() << " -- something fishy here" << endl; + } + + Composer *other = *matches.begin(); + + DEBUG << "mergeComposer: Merging " << c->name() << " with " << other->name() << endl; + + if (hasBetterName(c, other)) { + other->addAlias(other->name()); + other->setName(c->name()); + } else { + other->addAlias(c->name()); + } + composers[c->name().toLower()].insert(other); + DEBUG << "linking from alias " << c->name() << endl; + + foreach (QString alias, c->aliases()) { + if (alias != other->name() && + !other->aliases().contains(alias)) { + other->addAlias(alias); + composers[alias.toLower()].insert(other); + DEBUG << "linking from alias " << alias << endl; + } + } + + foreach (Document *d, c->pages()) { + bool found = false; + foreach (Document *dd, other->pages()) { + if (d->uri() == dd->uri()) { + found = true; + break; + } + } + if (!found) { + d->setTopic(other); + other->addPage(d); + } + } + + //!!! actually the "approximate" bits of the following are bogus; + // a source reporting birth or death date as approx is probably + // more accurate than one reporting an exact date + + if (c->birth()) { + if (!other->birth() || other->birth()->approximate()) { + other->setBirth(c->birth()); + } + } + + if (c->death()) { + if (!other->death() || other->death()->approximate()) { + other->setDeath(c->death()); + } + } + + if (c->gender() != "") other->setGender(c->gender()); + if (c->nationality() != "") other->setNationality(c->nationality()); + if (c->remarks() != "") other->setRemarks(c->remarks()); + if (c->period() != "") other->setPeriod(c->period()); + +} + +QString +asciify(QString field) +{ + // accented characters etc -- add "ascii version" for dumb search purposes + QString ascii; + for (int i = 0; i < field.length(); ++i) { + QString dc = field[i].decomposition(); + if (dc != "") ascii += dc[0]; + else if (field[i] == QChar(0x00DF)) { + ascii += "ss"; + } else { + ascii += field[i]; + } + } + ascii.replace(QString::fromUtf8("\342\200\231"), "'"); // apostrophe + ascii.replace(QString::fromUtf8("\342\200\222"), "-"); + ascii.replace(QString::fromUtf8("\342\200\223"), "-"); + ascii.replace(QString::fromUtf8("\342\200\224"), "-"); + ascii.replace(QString::fromUtf8("\342\200\225"), "-"); + return ascii; +} + +void +asciify(Composer *c) +{ + QString n = c->name(); + QString asc = asciify(n); + if (asc != n && !c->aliases().contains(asc)) c->addAlias(asc); + foreach (QString alias, c->aliases()) { + asc = asciify(alias); + if (asc != alias && !c->aliases().contains(asc)) c->addAlias(asc); + } +} + +void +asciify(Work *w) +{ + QString n = w->name(); + QString asc = asciify(n); + if (asc != n && !w->aliases().contains(asc)) w->addAlias(asc); + foreach (QString alias, w->aliases()) { + asc = asciify(alias); + if (asc != alias && !w->aliases().contains(asc)) w->addAlias(asc); + } +} + +void +assignUri(Store *s, Composer *c) +{ + static QSet<QString> convSet; + QString conv = c->name(); + if (!conv.contains(",")) { + QStringList sl = conv.split(" "); + if (!sl.empty()) { + sl.push_front(sl[sl.size()-1]); + sl.removeLast(); + conv = sl.join(" "); + DEBUG << "assignUri: " << c->name() << " -> " << conv << endl; + } + } + conv = asciify(conv); + conv.replace(" ", "_"); + conv.replace("-", "_"); + conv.replace(QRegExp("[^a-zA-Z0-9_-]"), ""); + conv = conv.toLower(); + QString initial = conv; + int i = 2; + while (convSet.contains(conv)) { + conv = QString("%1__%2").arg(initial).arg(i); + i++; + } + convSet.insert(conv); + c->setProperty("uri", s->expand(":composer/" + conv)); +} + +void +assignUri(Store *s, Work *w, Composer *c) +{ + QString pfx = c->property("uri").toUrl().toString(); + DEBUG << "pfx = " << pfx << endl; + if (!pfx.contains("composer/")) pfx = ""; + + static QSet<QString> convSet; + + QString conv = w->catalogue(); + if (conv == "") conv = w->opus(); + conv = conv.replace(".", ""); + bool hasOpus = (conv != ""); + if (conv == "") conv = w->name().toLower(); + if (w->number() != "") conv = conv + "_no" + w->number(); + conv = asciify(conv); + conv.replace(" ", "_"); + conv.replace("-", "_"); + conv.replace(":", "_"); + conv.replace(QRegExp("[^a-zA-Z0-9_-]"), ""); + + if (pfx != "") conv = pfx + "/work/" + conv; + + // I think actually for works we want to merge duplicates rather than + // assign them separate URIs, _unless_ they lack a viable opus number + if (!hasOpus) { + QString initial = conv; + int i = 2; + while (convSet.contains(conv)) { + conv = QString("%1__%2").arg(initial).arg(i); + i++; + } + } + convSet.insert(conv); + + w->setProperty("uri", conv); +} + +void +addDbpediaResource(Store *store, QObject *o, QString s) +{ + QUrl u = o->property("uri").toUrl(); + if (u == QUrl()) return; + if (s.startsWith("http://en.wikipedia.org/wiki/")) { + store->add(Triple(u, + "mo:wikipedia", + QUrl(s))); + s.replace("http://en.wikipedia.org/wiki/", + "http://dbpedia.org/resource/"); + store->add(Triple(u, + "owl:sameAs", + QUrl(s))); + } +} + +int main(int argc, char **argv) +{ + qRegisterMetaType<HistoricalEvent *> + ("ClassicalData::HistoricalEvent*"); + qRegisterMetaType<Birth *> + ("ClassicalData::Birth*"); + qRegisterMetaType<Death *> + ("ClassicalData::Death*"); + qRegisterMetaType<Composition *> + ("ClassicalData::Composition*"); + qRegisterMetaType<Work *> + ("ClassicalData::Work*"); + qRegisterMetaType<Movement *> + ("ClassicalData::Movement*"); + qRegisterMetaType<Composer *> + ("ClassicalData::Composer*"); + qRegisterMetaType<Document *> + ("ClassicalData::Document*"); + qRegisterMetaType<Form *> + ("ClassicalData::Form*"); + qRegisterMetaType<QSet<Work *> > + ("QSet<ClassicalData::Work*>"); + qRegisterMetaType<QSet<Movement *> > + ("QSet<ClassicalData::Movement*>"); + qRegisterMetaType<QSet<Document *> > + ("QSet<ClassicalData::Document*>"); + qRegisterMetaType<QSet<Form *> > + ("QSet<ClassicalData::Form*>"); + qRegisterMetaType<QSet<QString> > + ("QSet<QString>"); + + qRegisterMetaType<ClassicalComposersOrgImporter *> + ("ClassicalData::ClassicalComposersOrgImporter*"); + qRegisterMetaType<ClassicalDotNetImporter *> + ("ClassicalData::ClassicalDotNetImporter*"); + qRegisterMetaType<WikipediaComposersImporter *> + ("ClassicalData::WikipediaComposersImporter*"); + qRegisterMetaType<WikipediaWorksImporter *> + ("ClassicalData::WikipediaWorksImporter*"); + qRegisterMetaType<WikipediaWorksKImporter *> + ("ClassicalData::WikipediaWorksKImporter*"); + qRegisterMetaType<WikipediaWorksListImporter *> + ("ClassicalData::WikipediaWorksListImporter*"); + qRegisterMetaType<HobokenImporter *> + ("ClassicalData::HobokenImporter*"); + + ObjectBuilder::getInstance()->registerClass + <HistoricalEvent>("ClassicalData::HistoricalEvent*"); + ObjectBuilder::getInstance()->registerClass + <Birth>("ClassicalData::Birth*"); + ObjectBuilder::getInstance()->registerClass + <Death>("ClassicalData::Death*"); + ObjectBuilder::getInstance()->registerClass + <Composition>("ClassicalData::Composition*"); + ObjectBuilder::getInstance()->registerClass + <Work, QObject>("ClassicalData::Work*"); + ObjectBuilder::getInstance()->registerClass + <Movement, QObject>("ClassicalData::Movement*"); + ObjectBuilder::getInstance()->registerClass + <Composer, QObject>("ClassicalData::Composer*"); + ObjectBuilder::getInstance()->registerClass + <Document, QObject>("ClassicalData::Document*"); + ObjectBuilder::getInstance()->registerClass + <Form, QObject>("ClassicalData::Form*"); + + ObjectBuilder::getInstance()->registerClass + <ClassicalComposersOrgImporter>("ClassicalData::ClassicalComposersOrgImporter*"); + ObjectBuilder::getInstance()->registerClass + <ClassicalDotNetImporter>("ClassicalData::ClassicalDotNetImporter*"); + ObjectBuilder::getInstance()->registerClass + <WikipediaComposersImporter>("ClassicalData::WikipediaComposersImporter*"); + ObjectBuilder::getInstance()->registerClass + <WikipediaWorksImporter>("ClassicalData::WikipediaWorksImporter*"); + ObjectBuilder::getInstance()->registerClass + <WikipediaWorksKImporter>("ClassicalData::WikipediaWorksKImporter*"); + ObjectBuilder::getInstance()->registerClass + <WikipediaWorksListImporter>("ClassicalData::WikipediaWorksListImporter*"); + ObjectBuilder::getInstance()->registerClass + <HobokenImporter>("ClassicalData::HobokenImporter*"); + + ContainerBuilder::getInstance()->registerContainer + <QString, QSet<QString> > + ("QString", "QSet<QString>", ContainerBuilder::SetKind); + + ContainerBuilder::getInstance()->registerContainer + <Work*, QSet<Work*> > + ("ClassicalData::Work*", "QSet<ClassicalData::Work*>", + ContainerBuilder::SetKind); + + ContainerBuilder::getInstance()->registerContainer + <Movement*, QSet<Movement*> > + ("ClassicalData::Movement*", "QSet<ClassicalData::Movement*>", + ContainerBuilder::SetKind); + + ContainerBuilder::getInstance()->registerContainer + <Document*, QSet<Document*> > + ("ClassicalData::Document*", "QSet<ClassicalData::Document*>", + ContainerBuilder::SetKind); + + ContainerBuilder::getInstance()->registerContainer + <Form*, QSet<Form*> > + ("ClassicalData::Form*", "QSet<ClassicalData::Form*>", + ContainerBuilder::SetKind); + + BasicStore *store = BasicStore::load("file:importers.ttl"); + ObjectMapper mapper(store); + QObject *parentObject = mapper.loadAllObjects(new QObject()); + + BasicStore *outstore = new BasicStore(); + outstore->setBaseUri("http://dbtune.org/classical/resource/"); + ObjectMapper outmapper(outstore); + + outmapper.setPropertyStorePolicy(ObjectMapper::StoreIfChanged); + + outmapper.setObjectTypePrefix("http://dbtune.org/classical/resource/"); + outmapper.setPropertyPrefix("http://dbtune.org/classical/resource/vocab/"); + outmapper.setRelationshipPrefix("http://dbtune.org/classical/resource/vocab/relationship/"); + + outstore->addPrefix("type", outmapper.getObjectTypePrefix()); + outstore->addPrefix("classical", outmapper.getObjectTypePrefix() + "type/"); + outstore->addPrefix("property", outmapper.getPropertyPrefix()); + outstore->addPrefix("rel", outmapper.getRelationshipPrefix()); + + outstore->addPrefix("foaf", "http://xmlns.com/foaf/0.1/"); + outstore->addPrefix("mo", "http://purl.org/ontology/mo/"); + outstore->addPrefix("dc", "http://purl.org/dc/elements/1.1/"); + outstore->addPrefix("bio", "http://purl.org/vocab/bio/0.1/"); + outstore->addPrefix("owl", "http://www.w3.org/2002/07/owl#"); + outstore->addPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); + outstore->addPrefix("db", "http://dbtune.org/musicbrainz/resource/"); + outstore->addPrefix("dbv", "http://dbtune.org/musicbrainz/resource/vocab/"); + + outmapper.addTypeMapping("ClassicalData::Composer", "classical:Composer"); + outmapper.addPropertyMapping("ClassicalData::Composer", "pages", "foaf:page"); + outmapper.addPropertyMapping("ClassicalData::Composer", "name", "foaf:name"); + outmapper.addPropertyMapping("ClassicalData::Composer", "aliases", "dbv:alias"); + outmapper.addPropertyMapping("ClassicalData::Composer", "birth", "property:birth"); + outmapper.addPropertyMapping("ClassicalData::Composer", "death", "property:death"); + + outmapper.addTypeMapping("ClassicalData::Birth", "bio:Birth"); + outmapper.addTypeMapping("ClassicalData::Death", "bio:Death"); + outmapper.addPropertyMapping("ClassicalData::Birth", "year", "bio:date"); + outmapper.addPropertyMapping("ClassicalData::Death", "year", "bio:date"); + outmapper.addPropertyMapping("ClassicalData::Birth", "place", "bio:place"); + outmapper.addPropertyMapping("ClassicalData::Death", "place", "bio:place"); + + outmapper.addTypeMapping("ClassicalData::Document", "foaf:Document"); + outmapper.addPropertyMapping("ClassicalData::Document", "topic", "foaf:primaryTopic"); + + outmapper.addTypeMapping("ClassicalData::Work", "mo:MusicalWork"); + + outmapper.addPropertyMapping("ClassicalData::Work", "composition", "mo:composed_in"); + outmapper.addPropertyMapping("ClassicalData::Work", "opus", "mo:opus"); + outmapper.addPropertyMapping("ClassicalData::Work", "catalogue", "mo:catalogue"); + outmapper.addPropertyMapping("ClassicalData::Work", "number", "mo:number"); + outmapper.addPropertyMapping("ClassicalData::Work", "partOf", "dc:isPartOf"); + outmapper.addPropertyMapping("ClassicalData::Work", "parts", "dc:hasPart"); + outmapper.addPropertyMapping("ClassicalData::Work", "pages", "foaf:page"); + outmapper.addPropertyMapping("ClassicalData::Work", "forms", "property:form"); + outmapper.addPropertyMapping("ClassicalData::Work", "key", "mo:key"); + outmapper.addPropertyMapping("ClassicalData::Work", "aliases", "dbv:alias"); + outmapper.addPropertyMapping("ClassicalData::Work", "name", "dc:title"); + + outmapper.addTypeMapping("ClassicalData::Composition", "mo:Composition"); + outmapper.addPropertyMapping("ClassicalData::Composition", "composer", "mo:composer"); + outmapper.addPropertyMapping("ClassicalData::Composition", "works", "mo:produced_work"); + + outstore->add(Triple("classical:Composer", "a", outstore->expand("owl:Class"))); + outstore->add(Triple("classical:Composer", "rdfs:subClassOf", outstore->expand("mo:MusicArtist"))); + + outstore->add(Triple("property:birth", "a", outstore->expand("owl:ObjectProperty"))); + outstore->add(Triple("property:birth", "rdfs:subPropertyOf", outstore->expand("bio:event"))); + + outstore->add(Triple("property:death", "a", outstore->expand("owl:ObjectProperty"))); + outstore->add(Triple("property:death", "rdfs:subPropertyOf", outstore->expand("bio:event"))); + + QList<Importer *> importers = parentObject->findChildren<Importer *>(); + std::cerr << "have " << importers.size() << " importers" << std::endl; + + ComposerMap composers; + + QList<Composer *> dated; + QList<Composer *> undated; + + QList<Work *> works; + QList<Composition *> compositions; + QList<QObject *> other; + + foreach (Importer *importer, importers) { + QObjectList objects = importer->getImportedObjects(); + foreach (QObject *o, objects) { + Composer *c; + if ((c = qobject_cast<Composer *>(o))) { + addMiscExpansions(c); + asciify(c); + if (c->birth() || c->death()) dated.push_back(c); + else undated.push_back(c); + continue; + } + Work *w; + if ((w = qobject_cast<Work *>(o))) { + asciify(w); + works.push_back(w); + continue; + } + Composition *cn; + if ((cn = qobject_cast<Composition *>(o))) { + compositions.push_back(cn); + continue; + } + } + } + + // get all the dated composers merged before attempting to match + // the undated ones + foreach (Composer *c, dated) { + mergeComposer(c, composers); + } + foreach (Composer *c, undated) { + mergeComposer(c, composers); + } + + QObjectList toStore; + + QSet<Composer *> cset; + for (ComposerMap::iterator i = composers.begin(); i != composers.end(); ++i) { + foreach (Composer *c, i.value()) { + if (!cset.contains(c)) { + assignUri(outstore, c); + toStore.push_back(c); + cset.insert(c); + } + foreach (Document *d, c->pages()) { + QString s = d->uri().toString(); + addDbpediaResource(outstore, c, s); + } + } + } + + QSet<QString> storedUris; + + foreach (Work *w, works) { + Composition *cn = w->composition(); + if (!cn) continue; + if (!cn->composer()) { + QString cname = cn->composerName(); + if (cname != "") { + if (!composers.contains(cname.toLower())) { + DEBUG << "Failed to assign Composition to composer: no composer matches name " << cname << endl; + } else { + QSet<Composer *> cs = composers[cname.toLower()]; + if (cs.empty()) { + DEBUG << "Failed to assign Composition to composer: no composer matches name " << cname << endl; + } else if (cs.size() > 1) { + DEBUG << "Failed to assign Composition to composer: " + << cs.size() << " composers match name " << cname << endl; + } else { + cn->setComposer(*cs.begin()); + } + } + } else { + DEBUG << "Failed to assign Composition to composer: composer name is empty" << endl; + } + } + + if (cn->composer()) { + assignUri(outstore, w, cn->composer()); + } + + foreach (Document *d, w->pages()) { + QString s = d->uri().toString(); + addDbpediaResource(outstore, w, s); + if (!storedUris.contains(s)) { + toStore.push_back(d); + storedUris.insert(s); + } + } + + QString u = w->property("uri").toUrl().toString(); + if (u == "" || !storedUris.contains(u)) { + toStore.push_back(w); + if (u != "") storedUris.insert(u); + } + } + + try { + outmapper.storeAllObjects(toStore); + + } catch (RDFException e) { + std::cerr << "Caught RDF exception: " << e.what() << std::endl; + } + + DEBUG << "Stored, now saving" << endl; + + outstore->save("test-out.ttl"); + + DEBUG << "Saved" << endl; + + + QMultiMap<QString, Composer *> cmap; + foreach (Composer *c, cset) { + QString n = c->getSortName(true); + cmap.insert(n, c); + } + + std::cout << "Composers: " << cmap.size() << std::endl; + + for (QMultiMap<QString, Composer *>::iterator i = cmap.begin(); + i != cmap.end(); ++i) { + + QString n = i.key(); + Composer *c = i.value(); + + std::cout << n.toStdString(); + + QString d = c->getDisplayDates(); + if (d != "") std::cout << " (" << d.toStdString() << ")"; + std::cout << std::endl; + } + + std::cout << std::endl; + + std::cout << "Works by composer:" << std::endl; + + for (QMultiMap<QString, Composer *>::iterator i = cmap.begin(); + i != cmap.end(); ++i) { + + QString n = i.key(); + Composer *c = i.value(); + + std::set<Work *, Work::Ordering> wmap; + foreach (Work *w, works) { + Composition *cn = w->composition(); + if (!cn) continue; + if (cn->composer() != c) continue; + if (w->partOf()) continue; + wmap.insert(w); + } + + if (wmap.empty()) continue; + + std::cout << n.toStdString() << std::endl; + + foreach (Work *w, wmap) { + std::cout << " * "; + std::cout << w->name().toStdString(); + if (w->catalogue() != "") { + std::cout << " [" << w->catalogue().toStdString() << "]"; + } + if (w->opus() != "") { + std::cout << " [op. " << w->opus().toStdString() << "]"; + } + std::cout << std::endl; + std::set<Work *, Work::Ordering> orderedParts; + foreach (Work *ww, w->parts()) { + orderedParts.insert(ww); + } + foreach (Work *ww, orderedParts) { + std::cout << " "; + if (ww->number() != "") { + std::cout << ww->number().toStdString() << ". "; + } + std::cout << ww->name().toStdString(); + if (ww->catalogue() != "" && ww->catalogue() != w->catalogue()) { + std::cout << " [" << ww->catalogue().toStdString() << "]"; + } + if (ww->opus() != "" && ww->opus() != w->opus()) { + std::cout << " [op. " << ww->opus().toStdString() << "]"; + } + std::cout << std::endl; + } + } + + std::cout << std::endl; + } + + delete outstore; + + DEBUG << "Done" << endl; + + +} + +
--- a/import/ImportClassicalComposersOrg.cpp Tue Dec 01 17:50:41 2009 +0000 +++ b/import/ImportClassicalComposersOrg.cpp Thu Dec 03 15:42:10 2009 +0000 @@ -262,7 +262,7 @@ all.replace(QRegExp("^.*<div id=\"main\">"), ""); QRegExp matcher - ("<li><a href=\"([^\"]+)\">([^<]+)(<small>([^<]*)</small>)?</a> \\((\\*?)([0-9]+)[^0-9)]*([0-9]+)?\\)\\s*([^\\s])?</li>"); + (QString::fromUtf8("<li><a href=\"([^\"]+)\">([^<]+)(<small>([^<]*)</small>)?</a> \\((\\*?)([0-9]+)([^0-9)]*)([0-9]+)?\\)\\s*([^\\s])?</li>")); int pos = 0, count = 0; while ((pos = matcher.indexIn(all, pos)) != -1) { @@ -272,9 +272,11 @@ QString page = matcher.cap(1); QString name = matcher.cap(2); + QString star = matcher.cap(5); QString birth = matcher.cap(6); - QString death = matcher.cap(7); - QString female = matcher.cap(8); + QString dagger = matcher.cap(7); + QString death = matcher.cap(8); + QString female = matcher.cap(9); DEBUG << "Item " << count << ": page = " << page @@ -314,6 +316,25 @@ d->setSiteName("Classical Composers Database"); composer->addPage(d); } + + if (birth != "" && death == "") { + if (star == "" && dagger != QString::fromUtf8("\342\200\240")) { + DEBUG << "Unexpected \"dagger\" character" << dagger << endl; + birth = ""; + } + if (star == "" && dagger == "") { + DEBUG << "Only one date in date range (" << birth << "), but no star or dagger -- ignoring" << endl; + birth = ""; + } else if (star != "" && dagger != "") { + DEBUG << "Date range features both star and dagger -- ignoring" << endl; + birth = ""; + } else if (dagger != "") { + DEBUG << "dagger found: setting death to " << birth << endl; + death = birth; + birth = ""; + } + } + if (birth != "") { Birth *e = new Birth(birth.toInt()); composer->setBirth(e);
--- a/import/Test.cpp Tue Dec 01 17:50:41 2009 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,831 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -#include "Objects.h" - -#include <dataquay/BasicStore.h> -#include <dataquay/RDFException.h> -#include <dataquay/objectmapper/ObjectMapper.h> -#include <dataquay/objectmapper/ObjectBuilder.h> -#include <dataquay/objectmapper/ContainerBuilder.h> - -#include "ImportClassicalComposersOrg.h" -#include "ImportClassicalDotNet.h" -#include "ImportWikipediaComposers.h" -#include "ImportWikipediaWorks.h" -#include "ImportWikipediaWorksK.h" -#include "ImportWikipediaWorksList.h" -#include "ImportHoboken.h" - -#include <dataquay/Debug.h> - -using namespace ClassicalData; -using namespace Dataquay; - -#include <iostream> -#include <set> - -typedef QMap<QString, QSet<Composer *> > ComposerMap; // name -> composers - -bool datesMatch(Composer *a, Composer *b) -{ - if (a->birth() && b->birth()) { - if (abs(a->birth()->year() - b->birth()->year()) > 1) { - if ((!a->birth()->approximate() && !b->birth()->approximate()) || - (abs(a->birth()->year() - b->birth()->year()) > 10)) { - return false; - } - } - } - if (a->death() && b->death()) { - if (abs(a->death()->year() - b->death()->year()) > 1) { - if ((!a->death()->approximate() && !b->death()->approximate()) || - (abs(a->death()->year() - b->death()->year()) > 10)) { - return false; - } - } - } - return true; -} - -void -addMiscExpansions(Composer *c) -{ - QString n = c->name(); - - DEBUG << "addMiscExpansions: n = " << n << endl; - - // lovely hard-coded special cases go here! some of these are - // needed for works->composer assignments - if (n == "Balakirev, Milii") { - c->addAlias("Mily Balakirev"); - } - if (n.startsWith("Cui, C")) { - c->addAlias(QString::fromUtf8("C\303\251sar Cui")); - } - if (n == "Handel, George Frideric") { - c->addAlias("Handel, Georg Friedrich"); - c->addAlias("Handel"); - } - if (n == "Mayr, Simon") { - c->addAlias("Mayr"); - } - - n.replace(", Sr.", " Sr."); - n.replace(", Jr.", " Jr."); - - int comma = n.indexOf(", "); - if (comma > 0 && comma + 2 < n.length()) { - - QString left = n.left(comma); - QString right = n.right(n.length() - comma - 2); - - QRegExp jrsr("( (Sr\\.|Jr\\.|I|II))$"); - if (jrsr.indexIn(right) >= 0) { - left = left + jrsr.cap(1); - right = right.left(right.length()-jrsr.matchedLength()); - } - n = right + " " + left; - } - - if (n != c->name()) c->addAlias(n); - - if (n.contains("Sergey")) { - QString nn(n); - nn.replace("Sergey", "Sergei"); - c->addAlias(nn); - } - - QRegExp sr("((, )?Sr\\.|Senior|\\(?the elder\\)?)", Qt::CaseInsensitive); - if (sr.indexIn(n) >= 0) { - QString nr = n; - nr.replace(sr.pos(0), sr.matchedLength(), " I"); - nr.replace(" ", " "); - DEBUG << "addMiscExpansions: trying " << nr << " for " << n << endl; - c->addAlias(nr); - } - QRegExp jr("((, )?Jr\\.|Junior|\\(?the younger\\)?)", Qt::CaseInsensitive); - if (jr.indexIn(n) >= 0) { - QString nr = n; - nr.replace(jr.pos(0), jr.matchedLength(), " II"); - nr.replace(" ", " "); - DEBUG << "addMiscExpansions: trying " << nr << " for " << n << endl; - c->addAlias(nr); - } - QString nr = n; - nr.replace("(I)", "I"); - nr.replace("(II)", "II"); - nr.replace("(III)", "III"); - c->addAlias(nr); -} - -bool namesFuzzyMatch(QString an, Composer *b) -{ - // ew! - - QString bn = b->name(); - if (bn == an) return true; - if (b->aliases().contains(an)) return true; - int aSurnameIndex = 0, bSurnameIndex = 0; - if (an.contains(",")) { - an.replace(",", ""); - } else { - aSurnameIndex = -1; - } - if (bn.contains(",")) { - bn.replace(",", ""); - } else { - bSurnameIndex = -1; - } - QStringList nl = an.split(QRegExp("[ -]")); - QStringList bnl = bn.split(QRegExp("[ -]")); - int matchCount = 0; - QString surnameMatch = ""; - if (aSurnameIndex == -1) aSurnameIndex = nl.size()-1; - if (bSurnameIndex == -1) bSurnameIndex = bnl.size()-1; - if (nl[aSurnameIndex][0].isUpper() && - nl[aSurnameIndex] != "Della" && - nl[aSurnameIndex] == bnl[bSurnameIndex]) { - surnameMatch = nl[aSurnameIndex]; - } - foreach (QString elt, nl) { - if (!elt[0].isUpper() || elt == "Della") continue; - if (bnl.contains(elt)) { - ++matchCount; - continue; - } - } - if (matchCount > 1 && surnameMatch != "") { - DEBUG << "namesFuzzyMatch: note: surnameMatch = " << surnameMatch << endl; - return true; - } - return false; -} - -bool -hasBetterName(Composer *c, Composer *other) -{ - if (c->name() == other->name()) return false; - - // Try to guess which of c and other is more likely to have a good - // "canonical form" of the composer's name - - if (c->name().startsWith("van ")) { - return false; // wrong choice of sort for e.g. LvB; should be - // Beethoven, Ludwig van, not van Beethoven, Ludwig - } - if (other->name().startsWith("van ")) { - return true; - } - - if (c->aliases().size() != other->aliases().size()) { - // a rather weak heuristic - return c->aliases().size() > other->aliases().size(); - } - - if (c->name().contains(',') && !other->name().contains(',')) { - // another rather weak heuristic - return true; - } - - return false; -} - -void mergeComposer(Composer *c, ComposerMap &composers) -{ - QString name = c->name(); - - QSet<QString> allNames = c->aliases(); - allNames.insert(name); - - QString dates; - if (c->birth()) { - if (c->death()) { - dates = QString("%1-%2").arg(c->birth()->year()).arg(c->death()->year()); - } else { - dates = QString("%1-").arg(c->birth()->year()); - } - } - if (dates != "") { - allNames.insert(dates); - } - - QSet<Composer *> matches; - - foreach (QString candidateName, allNames) { - QString key = candidateName.toLower(); - if (composers.contains(key)) { - foreach (Composer *candidate, composers[key]) { - if (candidateName == dates) { - if (!namesFuzzyMatch(c->name(), candidate) && - !namesFuzzyMatch(candidate->name(), c)) { - DEBUG << "mergeComposer: Names differ for " << c->name() << " and " << candidate->name() << " (having matched date(s) " << dates << ")" << endl; - continue; - } else { - DEBUG << "mergeComposer: Note: Fuzzy name match for " << c->name() << " and " << candidate->name() << " with date(s) " << dates << endl; - } - } else { - if (!datesMatch(c, candidate)) { - DEBUG << "mergeComposer: Dates differ for " << c->name() << " and " << candidate->name() << endl; - continue; - } - } - matches.insert(candidate); - } - } - } - - if (matches.empty()) { - DEBUG << "mergeComposer: No existing composer with alias matching any alias of " << c->name() << ", adding" << endl; - - if (!c->birth() && !c->death()) { - // laboriously look for fuzzy match across _all_ composers - for (ComposerMap::iterator i = composers.begin(); - i != composers.end(); ++i) { - foreach (Composer *candidate, *i) { - if (namesFuzzyMatch(c->name(), candidate)) { - DEBUG << "mergeComposer: Found fuzzy match for undated composer " << c->name() << " as " << candidate->name() << ", daringly merging" << endl; - matches.insert(candidate); - break; - } - } - if (!matches.empty()) break; - } - } - - if (matches.empty()) { - foreach (QString candidateName, allNames) { - composers[candidateName.toLower()].insert(c); - DEBUG << "added for alias or date " << candidateName << endl; - } - return; - } - } - - if (matches.size() > 1) { - DEBUG << "mergeComposer: More than one composer matches name and date(s) for " << c->name() << " -- something fishy here" << endl; - } - - Composer *other = *matches.begin(); - - DEBUG << "mergeComposer: Merging " << c->name() << " with " << other->name() << endl; - - if (hasBetterName(c, other)) { - other->addAlias(other->name()); - other->setName(c->name()); - } else { - other->addAlias(c->name()); - } - composers[c->name().toLower()].insert(other); - DEBUG << "linking from alias " << c->name() << endl; - - foreach (QString alias, c->aliases()) { - if (alias != other->name() && - !other->aliases().contains(alias)) { - other->addAlias(alias); - composers[alias.toLower()].insert(other); - DEBUG << "linking from alias " << alias << endl; - } - } - - foreach (Document *d, c->pages()) { - bool found = false; - foreach (Document *dd, other->pages()) { - if (d->uri() == dd->uri()) { - found = true; - break; - } - } - if (!found) { - d->setTopic(other); - other->addPage(d); - } - } - - //!!! actually the "approximate" bits of the following are bogus; - // a source reporting birth or death date as approx is probably - // more accurate than one reporting an exact date - - if (c->birth()) { - if (!other->birth() || other->birth()->approximate()) { - other->setBirth(c->birth()); - } - } - - if (c->death()) { - if (!other->death() || other->death()->approximate()) { - other->setDeath(c->death()); - } - } - - if (c->gender() != "") other->setGender(c->gender()); - if (c->nationality() != "") other->setNationality(c->nationality()); - if (c->remarks() != "") other->setRemarks(c->remarks()); - if (c->period() != "") other->setPeriod(c->period()); - -} - -QString -asciify(QString field) -{ - // accented characters etc -- add "ascii version" for dumb search purposes - QString ascii; - for (int i = 0; i < field.length(); ++i) { - QString dc = field[i].decomposition(); - if (dc != "") ascii += dc[0]; - else if (field[i] == QChar(0x00DF)) { - ascii += "ss"; - } else { - ascii += field[i]; - } - } - ascii.replace(QString::fromUtf8("\342\200\231"), "'"); // apostrophe - ascii.replace(QString::fromUtf8("\342\200\222"), "-"); - ascii.replace(QString::fromUtf8("\342\200\223"), "-"); - ascii.replace(QString::fromUtf8("\342\200\224"), "-"); - ascii.replace(QString::fromUtf8("\342\200\225"), "-"); - return ascii; -} - -void -asciify(Composer *c) -{ - QString n = c->name(); - QString asc = asciify(n); - if (asc != n && !c->aliases().contains(asc)) c->addAlias(asc); - foreach (QString alias, c->aliases()) { - asc = asciify(alias); - if (asc != alias && !c->aliases().contains(asc)) c->addAlias(asc); - } -} - -void -asciify(Work *w) -{ - QString n = w->name(); - QString asc = asciify(n); - if (asc != n && !w->aliases().contains(asc)) w->addAlias(asc); - foreach (QString alias, w->aliases()) { - asc = asciify(alias); - if (asc != alias && !w->aliases().contains(asc)) w->addAlias(asc); - } -} - -void -assignUri(Store *s, Composer *c) -{ - static QSet<QString> convSet; - QString conv = c->name(); - if (!conv.contains(",")) { - QStringList sl = conv.split(" "); - if (!sl.empty()) { - sl.push_front(sl[sl.size()-1]); - sl.removeLast(); - conv = sl.join(" "); - DEBUG << "assignUri: " << c->name() << " -> " << conv << endl; - } - } - conv = asciify(conv); - conv.replace(" ", "_"); - conv.replace("-", "_"); - conv.replace(QRegExp("[^a-zA-Z0-9_-]"), ""); - conv = conv.toLower(); - QString initial = conv; - int i = 1; - while (convSet.contains(conv)) { - conv = QString("%1__%2").arg(initial).arg(i); - i++; - } - convSet.insert(conv); - c->setProperty("uri", s->expand(":composer_" + conv)); -} - -void -assignUri(Store *s, Work *w, Composer *c) -{ - QString pfx = c->property("uri").toUrl().toString(); - DEBUG << "pfx = " << pfx << endl; - if (!pfx.contains("composer_")) pfx = ""; - else pfx.replace(QRegExp("^.*composer_"), ""); - - static QSet<QString> convSet; - QString conv = w->catalogue(); - if (conv == "") conv = w->opus(); - conv = conv.replace(".", ""); - bool hasOpus = (conv != ""); - if (conv == "") conv = w->name(); - if (w->number() != "") conv = conv + "_no" + w->number(); - if (pfx != "") conv = pfx + "_" + conv; - conv = asciify(conv); - conv.replace(" ", "_"); - conv.replace("-", "_"); - conv.replace(":", "_"); - conv.replace(QRegExp("[^a-zA-Z0-9_-]"), ""); - conv = conv.toLower(); - // I think actually for works we want to merge duplicates rather than - // assign them separate URIs, _unless_ they lack a viable opus number - if (!hasOpus) { - QString initial = conv; - int i = 1; - while (convSet.contains(conv)) { - conv = QString("%1__%2").arg(initial).arg(i); - i++; - } - } - convSet.insert(conv); - w->setProperty("uri", s->expand(":work_" + conv)); -} - -void -addDbpediaResource(Store *store, QObject *o, QString s) -{ - QUrl u = o->property("uri").toUrl(); - if (u == QUrl()) return; - if (s.startsWith("http://en.wikipedia.org/wiki/")) { - store->add(Triple(u, - "mo:wikipedia", - QUrl(s))); - s.replace("http://en.wikipedia.org/wiki/", - "http://dbpedia.org/resource/"); - store->add(Triple(u, - "owl:sameAs", - QUrl(s))); - } -} - -int main(int argc, char **argv) -{ - qRegisterMetaType<HistoricalEvent *> - ("ClassicalData::HistoricalEvent*"); - qRegisterMetaType<Birth *> - ("ClassicalData::Birth*"); - qRegisterMetaType<Death *> - ("ClassicalData::Death*"); - qRegisterMetaType<Composition *> - ("ClassicalData::Composition*"); - qRegisterMetaType<Work *> - ("ClassicalData::Work*"); - qRegisterMetaType<Movement *> - ("ClassicalData::Movement*"); - qRegisterMetaType<Composer *> - ("ClassicalData::Composer*"); - qRegisterMetaType<Document *> - ("ClassicalData::Document*"); - qRegisterMetaType<Form *> - ("ClassicalData::Form*"); - qRegisterMetaType<QSet<Work *> > - ("QSet<ClassicalData::Work*>"); - qRegisterMetaType<QSet<Movement *> > - ("QSet<ClassicalData::Movement*>"); - qRegisterMetaType<QSet<Document *> > - ("QSet<ClassicalData::Document*>"); - qRegisterMetaType<QSet<Form *> > - ("QSet<ClassicalData::Form*>"); - qRegisterMetaType<QSet<QString> > - ("QSet<QString>"); - - qRegisterMetaType<ClassicalComposersOrgImporter *> - ("ClassicalData::ClassicalComposersOrgImporter*"); - qRegisterMetaType<ClassicalDotNetImporter *> - ("ClassicalData::ClassicalDotNetImporter*"); - qRegisterMetaType<WikipediaComposersImporter *> - ("ClassicalData::WikipediaComposersImporter*"); - qRegisterMetaType<WikipediaWorksImporter *> - ("ClassicalData::WikipediaWorksImporter*"); - qRegisterMetaType<WikipediaWorksKImporter *> - ("ClassicalData::WikipediaWorksKImporter*"); - qRegisterMetaType<WikipediaWorksListImporter *> - ("ClassicalData::WikipediaWorksListImporter*"); - qRegisterMetaType<HobokenImporter *> - ("ClassicalData::HobokenImporter*"); - - ObjectBuilder::getInstance()->registerClass - <HistoricalEvent>("ClassicalData::HistoricalEvent*"); - ObjectBuilder::getInstance()->registerClass - <Birth>("ClassicalData::Birth*"); - ObjectBuilder::getInstance()->registerClass - <Death>("ClassicalData::Death*"); - ObjectBuilder::getInstance()->registerClass - <Composition>("ClassicalData::Composition*"); - ObjectBuilder::getInstance()->registerClass - <Work, QObject>("ClassicalData::Work*"); - ObjectBuilder::getInstance()->registerClass - <Movement, QObject>("ClassicalData::Movement*"); - ObjectBuilder::getInstance()->registerClass - <Composer, QObject>("ClassicalData::Composer*"); - ObjectBuilder::getInstance()->registerClass - <Document, QObject>("ClassicalData::Document*"); - ObjectBuilder::getInstance()->registerClass - <Form, QObject>("ClassicalData::Form*"); - - ObjectBuilder::getInstance()->registerClass - <ClassicalComposersOrgImporter>("ClassicalData::ClassicalComposersOrgImporter*"); - ObjectBuilder::getInstance()->registerClass - <ClassicalDotNetImporter>("ClassicalData::ClassicalDotNetImporter*"); - ObjectBuilder::getInstance()->registerClass - <WikipediaComposersImporter>("ClassicalData::WikipediaComposersImporter*"); - ObjectBuilder::getInstance()->registerClass - <WikipediaWorksImporter>("ClassicalData::WikipediaWorksImporter*"); - ObjectBuilder::getInstance()->registerClass - <WikipediaWorksKImporter>("ClassicalData::WikipediaWorksKImporter*"); - ObjectBuilder::getInstance()->registerClass - <WikipediaWorksListImporter>("ClassicalData::WikipediaWorksListImporter*"); - ObjectBuilder::getInstance()->registerClass - <HobokenImporter>("ClassicalData::HobokenImporter*"); - - ContainerBuilder::getInstance()->registerContainer - <QString, QSet<QString> > - ("QString", "QSet<QString>", ContainerBuilder::SetKind); - - ContainerBuilder::getInstance()->registerContainer - <Work*, QSet<Work*> > - ("ClassicalData::Work*", "QSet<ClassicalData::Work*>", - ContainerBuilder::SetKind); - - ContainerBuilder::getInstance()->registerContainer - <Movement*, QSet<Movement*> > - ("ClassicalData::Movement*", "QSet<ClassicalData::Movement*>", - ContainerBuilder::SetKind); - - ContainerBuilder::getInstance()->registerContainer - <Document*, QSet<Document*> > - ("ClassicalData::Document*", "QSet<ClassicalData::Document*>", - ContainerBuilder::SetKind); - - ContainerBuilder::getInstance()->registerContainer - <Form*, QSet<Form*> > - ("ClassicalData::Form*", "QSet<ClassicalData::Form*>", - ContainerBuilder::SetKind); - - BasicStore *store = BasicStore::load("file:importers.ttl"); - ObjectMapper mapper(store); - QObject *parentObject = mapper.loadAllObjects(new QObject()); - - BasicStore *outstore = new BasicStore(); - ObjectMapper outmapper(outstore); - - outmapper.setPropertyStorePolicy(ObjectMapper::StoreIfChanged); - - outstore->addPrefix("type", outmapper.getObjectTypePrefix()); - outstore->addPrefix("classical", outmapper.getObjectTypePrefix() + "ClassicalData/"); - outstore->addPrefix("property", outmapper.getPropertyPrefix()); - outstore->addPrefix("rel", outmapper.getRelationshipPrefix()); - outstore->addPrefix("foaf", "http://xmlns.com/foaf/0.1/"); - outstore->addPrefix("mo", "http://purl.org/ontology/mo/"); - outstore->addPrefix("dc", "http://purl.org/dc/elements/1.1/"); - outstore->addPrefix("bio", "http://purl.org/vocab/bio/0.1/"); - outstore->addPrefix("owl", "http://www.w3.org/2002/07/owl#"); - outstore->addPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); - - outmapper.addPropertyMapping("ClassicalData::Composer", "pages", - outstore->expand("foaf:page")); - outmapper.addPropertyMapping("ClassicalData::Composer", "name", - outstore->expand("foaf:name")); - outmapper.addPropertyMapping("ClassicalData::Composer", "aliases", - outstore->expand("property:also_known_as")); - outmapper.addPropertyMapping("ClassicalData::Document", "topic", - outstore->expand("foaf:primaryTopic")); - - outmapper.addTypeMapping("ClassicalData::Work", - outstore->expand("mo:MusicalWork")); - outmapper.addPropertyMapping("ClassicalData::Work", "composition", - outstore->expand("mo:composed_in")); - outmapper.addPropertyMapping("ClassicalData::Work", "opus", - outstore->expand("mo:opus")); - outmapper.addPropertyMapping("ClassicalData::Work", "k6", - outstore->expand("mo:k6")); - outmapper.addPropertyMapping("ClassicalData::Work", "bwv", - outstore->expand("mo:bwv")); - outmapper.addPropertyMapping("ClassicalData::Work", "number", - outstore->expand("mo:number")); - outmapper.addPropertyMapping("ClassicalData::Work", "partOf", - outstore->expand("dc:isPartOf")); - outmapper.addPropertyMapping("ClassicalData::Work", "parts", - outstore->expand("dc:hasPart")); - outmapper.addPropertyMapping("ClassicalData::Work", "pages", - outstore->expand("foaf:page")); - outmapper.addPropertyMapping("ClassicalData::Work", "forms", - outstore->expand("property:form")); - outmapper.addPropertyMapping("ClassicalData::Work", "key", - outstore->expand("mo:key")); - outmapper.addPropertyMapping("ClassicalData::Work", "aliases", - outstore->expand("property:also_known_as")); - outmapper.addPropertyMapping("ClassicalData::Work", "name", - outstore->expand("dc:title")); - - outmapper.addTypeMapping("ClassicalData::Composition", - outstore->expand("mo:Composition")); - outmapper.addPropertyMapping("ClassicalData::Composition", "composer", - outstore->expand("mo:composer")); - outmapper.addPropertyMapping("ClassicalData::Composition", "works", - outstore->expand("mo:produced_work")); - - outstore->add(Triple("classical:Composer", "a", - outstore->expand("owl:Class"))); - outstore->add(Triple("classical:Composer", "rdfs:subClassOf", - outstore->expand("mo:MusicArtist"))); - - QList<Importer *> importers = parentObject->findChildren<Importer *>(); - std::cerr << "have " << importers.size() << " importers" << std::endl; - - ComposerMap composers; - - QList<Composer *> dated; - QList<Composer *> undated; - - QList<Work *> works; - QList<Composition *> compositions; - QList<QObject *> other; - - foreach (Importer *importer, importers) { - QObjectList objects = importer->getImportedObjects(); - foreach (QObject *o, objects) { - Composer *c; - if ((c = qobject_cast<Composer *>(o))) { - addMiscExpansions(c); - asciify(c); - if (c->birth() || c->death()) dated.push_back(c); - else undated.push_back(c); - continue; - } - Work *w; - if ((w = qobject_cast<Work *>(o))) { - asciify(w); - works.push_back(w); - continue; - } - Composition *cn; - if ((cn = qobject_cast<Composition *>(o))) { - compositions.push_back(cn); - continue; - } - } - } - - // get all the dated composers merged before attempting to match - // the undated ones - foreach (Composer *c, dated) { - mergeComposer(c, composers); - } - foreach (Composer *c, undated) { - mergeComposer(c, composers); - } - - QObjectList toStore; - - QSet<Composer *> cset; - for (ComposerMap::iterator i = composers.begin(); i != composers.end(); ++i) { - foreach (Composer *c, i.value()) { - if (!cset.contains(c)) { - assignUri(outstore, c); - toStore.push_back(c); - cset.insert(c); - } - foreach (Document *d, c->pages()) { - QString s = d->uri().toString(); - addDbpediaResource(outstore, c, s); - } - } - } - - QSet<QString> storedUris; - - foreach (Work *w, works) { - Composition *cn = w->composition(); - if (!cn) continue; - if (!cn->composer()) { - QString cname = cn->composerName(); - if (cname != "") { - if (!composers.contains(cname.toLower())) { - DEBUG << "Failed to assign Composition to composer: no composer matches name " << cname << endl; - } else { - QSet<Composer *> cs = composers[cname.toLower()]; - if (cs.empty()) { - DEBUG << "Failed to assign Composition to composer: no composer matches name " << cname << endl; - } else if (cs.size() > 1) { - DEBUG << "Failed to assign Composition to composer: " - << cs.size() << " composers match name " << cname << endl; - } else { - cn->setComposer(*cs.begin()); - } - } - } else { - DEBUG << "Failed to assign Composition to composer: composer name is empty" << endl; - } - } - - if (cn->composer()) { - assignUri(outstore, w, cn->composer()); - } - - foreach (Document *d, w->pages()) { - QString s = d->uri().toString(); - addDbpediaResource(outstore, w, s); - toStore.push_back(d); - } - - QString u = w->property("uri").toUrl().toString(); - if (u == "" || !storedUris.contains(u)) { - toStore.push_back(w); - if (u != "") storedUris.insert(u); - } - } - - try { - outmapper.storeAllObjects(toStore); - - } catch (RDFException e) { - std::cerr << "Caught RDF exception: " << e.what() << std::endl; - } - - DEBUG << "Stored, now saving" << endl; - - outstore->save("test-out.ttl"); - - DEBUG << "Saved" << endl; - - - QMultiMap<QString, Composer *> cmap; - foreach (Composer *c, cset) { - QString n = c->getSortName(true); - cmap.insert(n, c); - } - - std::cout << "Composers: " << cmap.size() << std::endl; - - for (QMultiMap<QString, Composer *>::iterator i = cmap.begin(); - i != cmap.end(); ++i) { - - QString n = i.key(); - Composer *c = i.value(); - - std::cout << n.toStdString(); - - QString d = c->getDisplayDates(); - if (d != "") std::cout << " (" << d.toStdString() << ")"; - std::cout << std::endl; - } - - std::cout << std::endl; - - std::cout << "Works by composer:" << std::endl; - - for (QMultiMap<QString, Composer *>::iterator i = cmap.begin(); - i != cmap.end(); ++i) { - - QString n = i.key(); - Composer *c = i.value(); - - std::set<Work *, Work::Ordering> wmap; - foreach (Work *w, works) { - Composition *cn = w->composition(); - if (!cn) continue; - if (cn->composer() != c) continue; - if (w->partOf()) continue; - wmap.insert(w); - } - - if (wmap.empty()) continue; - - std::cout << n.toStdString() << std::endl; - - foreach (Work *w, wmap) { - std::cout << " * "; - std::cout << w->name().toStdString(); - if (w->catalogue() != "") { - std::cout << " [" << w->catalogue().toStdString() << "]"; - } - if (w->opus() != "") { - std::cout << " [op. " << w->opus().toStdString() << "]"; - } - std::cout << std::endl; - std::set<Work *, Work::Ordering> orderedParts; - foreach (Work *ww, w->parts()) { - orderedParts.insert(ww); - } - foreach (Work *ww, orderedParts) { - std::cout << " "; - if (ww->number() != "") { - std::cout << ww->number().toStdString() << ". "; - } - std::cout << ww->name().toStdString(); - if (ww->catalogue() != "" && ww->catalogue() != w->catalogue()) { - std::cout << " [" << ww->catalogue().toStdString() << "]"; - } - if (ww->opus() != "" && ww->opus() != w->opus()) { - std::cout << " [op. " << ww->opus().toStdString() << "]"; - } - std::cout << std::endl; - } - } - - std::cout << std::endl; - } - - delete outstore; - - DEBUG << "Done" << endl; - - -} - -
--- a/import/importers.ttl Tue Dec 01 17:50:41 2009 +0000 +++ b/import/importers.ttl Thu Dec 03 15:42:10 2009 +0000 @@ -6,704 +6,704 @@ :cdn a classical:ClassicalDotNetImporter ; - property:source <file:source-data/classical.net/masterindex.php> . + property:source <file:../source-data/classical.net/masterindex.php> . :wkiA a classical:WikipediaComposersImporter ; - property:source <file:source-data/en.wikipedia.org/composers/List_of_Renaissance_composers> . + property:source <file:../source-data/en.wikipedia.org/composers/List_of_Renaissance_composers> . :wkiM a classical:WikipediaComposersImporter ; - property:source <file:source-data/en.wikipedia.org/composers/Medieval_composers> . + property:source <file:../source-data/en.wikipedia.org/composers/Medieval_composers> . :wkiB a classical:WikipediaComposersImporter ; - property:source <file:source-data/en.wikipedia.org/composers/List_of_Baroque_composers> . + property:source <file:../source-data/en.wikipedia.org/composers/List_of_Baroque_composers> . :wkiC a classical:WikipediaComposersImporter ; - property:source <file:source-data/en.wikipedia.org/composers/List_of_Classical_era_composers> . + property:source <file:../source-data/en.wikipedia.org/composers/List_of_Classical_era_composers> . :wkiD a classical:WikipediaComposersImporter ; - property:source <file:source-data/en.wikipedia.org/composers/List_of_Romantic-era_composers> . + property:source <file:../source-data/en.wikipedia.org/composers/List_of_Romantic-era_composers> . :wkiE a classical:WikipediaComposersImporter ; - property:source <file:source-data/en.wikipedia.org/composers/List_of_20th-century_classical_composers_by_birth_date> . + property:source <file:../source-data/en.wikipedia.org/composers/List_of_20th-century_classical_composers_by_birth_date> . :wkiF a classical:WikipediaComposersImporter ; - property:source <file:source-data/en.wikipedia.org/composers/List_of_21st-century_classical_composers_by_birth_date> . + property:source <file:../source-data/en.wikipedia.org/composers/List_of_21st-century_classical_composers_by_birth_date> . :cciA a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstA> . + property:source <file:../source-data/classical-composers.org/firstA> . :cciB a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstB> . + property:source <file:../source-data/classical-composers.org/firstB> . :cciC a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstC> . + property:source <file:../source-data/classical-composers.org/firstC> . :cciD a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstD> . + property:source <file:../source-data/classical-composers.org/firstD> . :cciE a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstE> . + property:source <file:../source-data/classical-composers.org/firstE> . :cciF a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstF> . + property:source <file:../source-data/classical-composers.org/firstF> . :cciG a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstG> . + property:source <file:../source-data/classical-composers.org/firstG> . :cciH a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstH> . + property:source <file:../source-data/classical-composers.org/firstH> . :cciI a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstI> . + property:source <file:../source-data/classical-composers.org/firstI> . :cciJ a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstJ> . + property:source <file:../source-data/classical-composers.org/firstJ> . :cciK a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstK> . + property:source <file:../source-data/classical-composers.org/firstK> . :cciL a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstL> . + property:source <file:../source-data/classical-composers.org/firstL> . :cciM a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstM> . + property:source <file:../source-data/classical-composers.org/firstM> . :cciN a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstN> . + property:source <file:../source-data/classical-composers.org/firstN> . :cciO a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstO> . + property:source <file:../source-data/classical-composers.org/firstO> . :cciP a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstP> . + property:source <file:../source-data/classical-composers.org/firstP> . :cciQ a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstQ> . + property:source <file:../source-data/classical-composers.org/firstQ> . :cciR a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstR> . + property:source <file:../source-data/classical-composers.org/firstR> . :cciS a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstS> . + property:source <file:../source-data/classical-composers.org/firstS> . :cciT a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstT> . + property:source <file:../source-data/classical-composers.org/firstT> . :cciU a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstU> . + property:source <file:../source-data/classical-composers.org/firstU> . :cciV a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstV> . + property:source <file:../source-data/classical-composers.org/firstV> . :cciW a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstW> . + property:source <file:../source-data/classical-composers.org/firstW> . :cciX a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstX> . + property:source <file:../source-data/classical-composers.org/firstX> . :cciY a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstY> . + property:source <file:../source-data/classical-composers.org/firstY> . :cciZ a classical:ClassicalComposersOrgImporter ; - property:source <file:source-data/classical-composers.org/firstZ> . + property:source <file:../source-data/classical-composers.org/firstZ> . # These ones need more work: #:wki_216 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Antonio_Vivaldi> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Antonio_Vivaldi> . # mangling of Mazeppa #:wki_345 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Pyotr_Ilyich_Tchaikovsky> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Pyotr_Ilyich_Tchaikovsky> . # classification levels all wrong (many works listed at ** level) #:wki_354 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Sergei_Prokofiev> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Sergei_Prokofiev> . # tabular form #:wki_201 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_chorale_harmonisations_by_Johann_Sebastian_Bach> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_chorale_harmonisations_by_Johann_Sebastian_Bach> . :hob a classical:HobokenImporter ; - property:source <file:source-data/hoboken-klassika/sorted-with-hrefs-and-hob> . + property:source <file:../source-data/hoboken-klassika/sorted-with-hrefs-and-hob> . :wki_198 a classical:WikipediaWorksKImporter ; - property:source <file:source-data/en.wikipedia.org/works/K%C3%B6chel_catalogue> . + property:source <file:../source-data/en.wikipedia.org/works/K%C3%B6chel_catalogue> . ## metapage only ##:wki_199 a classical:WikipediaWorksListImporter ; -## property:source <file:source-data/en.wikipedia.org/works/List_of_Schubert_compositions_by_D_number> . +## property:source <file:../source-data/en.wikipedia.org/works/List_of_Schubert_compositions_by_D_number> . :wki_200 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_cantatas_by_Johann_Sebastian_Bach> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_cantatas_by_Johann_Sebastian_Bach> . :wki_202 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_and_literary_works_by_Hector_Berlioz> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_and_literary_works_by_Hector_Berlioz> . :wki_203 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Aaron_Copland> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Aaron_Copland> . #:wki_204 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Akil_Mark_Koci> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Akil_Mark_Koci> . :wki_205 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Alban_Berg> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Alban_Berg> . :wki_206 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Alexander_Borodin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Alexander_Borodin> . :wki_207 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Alexander_Glazunov> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Alexander_Glazunov> . :wki_208 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Alexander_Scriabin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Alexander_Scriabin> . #:wki_209 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Anton%C3%ADn_Dvo%C5%99%C3%A1k> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Anton%C3%ADn_Dvo%C5%99%C3%A1k> . # tabular #:wki_210 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Anton%C3%ADn_Dvo%C5%99%C3%A1k_by_Burghauser_number> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Anton%C3%ADn_Dvo%C5%99%C3%A1k_by_Burghauser_number> . :wki_211 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Bruckner> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Bruckner> . :wki_212 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Diabelli> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Diabelli> . :wki_213 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Reicha> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Reicha> . :wki_214 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Rubinstein> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Anton_Rubinstein> . # messy, doesn't work -- do we care? :wki_215 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Antonio_Salieri> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Antonio_Salieri> . :wki_217 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Aram_Khachaturian> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Aram_Khachaturian> . :wki_218 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Arthur_Bliss> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Arthur_Bliss> . :wki_219 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Arthur_Honegger> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Arthur_Honegger> . :wki_220 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_B%C3%A9la_Bart%C3%B3k> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_B%C3%A9la_Bart%C3%B3k> . :wki_221 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Bed%C5%99ich_Smetana> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Bed%C5%99ich_Smetana> . :wki_222 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Benjamin_Britten> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Benjamin_Britten> . :wki_223 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Bohuslav_Martin%C5%AF> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Bohuslav_Martin%C5%AF> . :wki_224 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_C%C3%A9sar_Cui> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_C%C3%A9sar_Cui> . :wki_225 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_C%C3%A9sar_Franck> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_C%C3%A9sar_Franck> . :wki_226 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Camille_Saint-Sa%C3%ABns> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Camille_Saint-Sa%C3%ABns> . :wki_227 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Czerny> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Czerny> . :wki_228 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Maria_von_Weber> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Maria_von_Weber> . :wki_229 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Nielsen> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Nielsen> . :wki_230 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Philipp_Emanuel_Bach> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Carl_Philipp_Emanuel_Bach> . #:wki_231 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Carlo_d%27Ordonez> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Carlo_d%27Ordonez> . :wki_232 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Charles-Valentin_Alkan> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Charles-Valentin_Alkan> . :wki_233 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Charles_Ives> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Charles_Ives> . :wki_234 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Charles_Wuorinen> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Charles_Wuorinen> . :wki_235 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Claude_Debussy> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Claude_Debussy> . :wki_236 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Claude_Debussy_by_Lesure_Numbers> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Claude_Debussy_by_Lesure_Numbers> . :wki_237 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Constant_Lambert> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Constant_Lambert> . :wki_238 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Darius_Milhaud> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Darius_Milhaud> . :wki_239 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Daron_Hagen> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Daron_Hagen> . :wki_240 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_David_Maslanka> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_David_Maslanka> . :wki_241 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Dieterich_Buxtehude> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Dieterich_Buxtehude> . :wki_242 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Django_Reinhardt> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Django_Reinhardt> . :wki_243 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Dmitri_Shostakovich> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Dmitri_Shostakovich> . :wki_244 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Edvard_Grieg> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Edvard_Grieg> . :wki_245 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Edward_Elgar> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Edward_Elgar> . :wki_246 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Einojuhani_Rautavaara> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Einojuhani_Rautavaara> . #:wki_247 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Emilio_Pujol> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Emilio_Pujol> . :wki_248 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Erik_Satie> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Erik_Satie> . :wki_249 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Ernest_Chausson> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Ernest_Chausson> . :wki_250 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Eug%C3%A8ne_Bozza> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Eug%C3%A8ne_Bozza> . #:wki_251 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Fabio_Vacchi> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Fabio_Vacchi> . :wki_252 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Fanny_Mendelssohn> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Fanny_Mendelssohn> . :wki_253 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Felix_Mendelssohn> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Felix_Mendelssohn> . :wki_254 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Ferdinando_Carulli> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Ferdinando_Carulli> . :wki_255 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Fernando_Sor> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Fernando_Sor> . :wki_256 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Fr%C3%A9d%C3%A9ric_Chopin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Fr%C3%A9d%C3%A9ric_Chopin> . :wki_257 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Fran%C3%A7ois_Couperin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Fran%C3%A7ois_Couperin> . :wki_258 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Francisco_Tarrega> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Francisco_Tarrega> . :wki_259 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Lachner> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Lachner> . :wki_260 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Liszt_(S.1_-_S.350)> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Liszt_(S.1_-_S.350)> . :wki_261 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Liszt_(S.351_-_S.999)> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Liszt_(S.351_-_S.999)> . :wki_262 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Schubert> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Franz_Schubert> . :wki_263 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Friedrich_Kuhlau> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Friedrich_Kuhlau> . :wki_264 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Fritz_Kreisler> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Fritz_Kreisler> . :wki_265 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Gabriel_Faur%C3%A9> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Gabriel_Faur%C3%A9> . :wki_266 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Georg_B%C3%B6hm> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Georg_B%C3%B6hm> . :wki_267 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_George_Enescu> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_George_Enescu> . :wki_268 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_George_Frideric_Handel> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_George_Frideric_Handel> . :wki_269 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_George_Gershwin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_George_Gershwin> . :wki_270 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_George_Onslow> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_George_Onslow> . :wki_271 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Georges_Bizet> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Georges_Bizet> . :wki_272 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Germaine_Tailleferre> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Germaine_Tailleferre> . :wki_273 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Giacinto_Scelsi> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Giacinto_Scelsi> . :wki_274 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Gioachino_Rossini> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Gioachino_Rossini> . :wki_275 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Giovanni_Bottesini> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Giovanni_Bottesini> . :wki_276 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Giovanni_Pierluigi_da_Palestrina> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Giovanni_Pierluigi_da_Palestrina> . :wki_277 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Girolamo_Frescobaldi> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Girolamo_Frescobaldi> . :wki_278 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Giuseppe_Verdi> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Giuseppe_Verdi> . :wki_279 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Gregory_Short> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Gregory_Short> . :wki_280 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Guillaume_de_Machaut> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Guillaume_de_Machaut> . :wki_281 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Gustav_Holst> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Gustav_Holst> . :wki_282 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Harrison_Birtwistle> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Harrison_Birtwistle> . :wki_283 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Heinrich_Sch%C3%BCtz> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Heinrich_Sch%C3%BCtz> . :wki_284 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Heitor_Villa-Lobos> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Heitor_Villa-Lobos> . :wki_285 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Henry_Purcell> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Henry_Purcell> . :wki_286 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Henryk_G%C3%B3recki> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Henryk_G%C3%B3recki> . :wki_287 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Herbert_Howells> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Herbert_Howells> . :wki_288 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Howard_Skempton> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Howard_Skempton> . :wki_289 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Iannis_Xenakis> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Iannis_Xenakis> . :wki_290 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Igor_Stravinsky> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Igor_Stravinsky> . :wki_291 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_James_Scott> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_James_Scott> . :wki_292 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Jan_Ladislav_Dussek> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Jan_Ladislav_Dussek> . :wki_293 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Jean-Baptiste_Lully> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Jean-Baptiste_Lully> . :wki_294 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Jean_Sibelius> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Jean_Sibelius> . :wki_295 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Jennifer_Higdon> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Jennifer_Higdon> . :wki_296 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Adolph_Hasse> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Adolph_Hasse> . :wki_297 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Christian_Bach> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Christian_Bach> . :wki_298 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Jakob_Froberger> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Jakob_Froberger> . :wki_299 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Joachim_Quantz> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Joachim_Quantz> . :wki_300 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Nepomuk_Hummel> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Nepomuk_Hummel> . :wki_301 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Pachelbel> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Pachelbel> . :wki_302 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Sebastian_Bach> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Sebastian_Bach> . :wki_303 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Strauss_II> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johann_Strauss_II> . :wki_304 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Johannes_Brahms> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Johannes_Brahms> . :wki_305 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_John_Cage> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_John_Cage> . :wki_306 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_John_Philip_Sousa> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_John_Philip_Sousa> . :wki_307 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Josef_Suk> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Josef_Suk> . :wki_308 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Joseph_Martin_Kraus> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Joseph_Martin_Kraus> . #:wki_309 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Juan_Mar%C3%ADa_Solare> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Juan_Mar%C3%ADa_Solare> . :wki_310 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Karlheinz_Stockhausen> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Karlheinz_Stockhausen> . :wki_311 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Karol_Szymanowski> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Karol_Szymanowski> . :wki_312 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Krzysztof_Penderecki> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Krzysztof_Penderecki> . :wki_313 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Kurt_Atterberg> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Kurt_Atterberg> . :wki_314 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_L%C3%A9o_Delibes> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_L%C3%A9o_Delibes> . :wki_315 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Leo%C5%A1_Jan%C3%A1%C4%8Dek> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Leo%C5%A1_Jan%C3%A1%C4%8Dek> . :wki_316 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Leo_Sowerby> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Leo_Sowerby> . :wki_317 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Lorenzo_Perosi> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Lorenzo_Perosi> . :wki_318 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Louis_Couperin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Louis_Couperin> . :wki_319 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Luciano_Berio> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Luciano_Berio> . :wki_320 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Ludwig_van_Beethoven> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Ludwig_van_Beethoven> . :wki_321 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Luigi_Boccherini> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Luigi_Boccherini> . :wki_322 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Lukas_Foss> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Lukas_Foss> . :wki_323 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Malcolm_Williamson> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Malcolm_Williamson> . #:wki_324 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Matteo_Carcassi> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Matteo_Carcassi> . :wki_325 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Maurice_Ravel> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Maurice_Ravel> . :wki_326 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Mauro_Giuliani> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Mauro_Giuliani> . :wki_327 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Max_Bruch> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Max_Bruch> . :wki_328 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Max_Reger> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Max_Reger> . :wki_329 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Michael_Haydn> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Michael_Haydn> . :wki_330 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Mieczyslaw_Weinberg> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Mieczyslaw_Weinberg> . :wki_331 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Mily_Balakirev> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Mily_Balakirev> . :wki_332 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Modest_Mussorgsky> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Modest_Mussorgsky> . :wki_333 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Moritz_Moszkowski> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Moritz_Moszkowski> . :wki_334 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Muzio_Clementi> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Muzio_Clementi> . #:wki_335 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Nicholas_Lens> . # who? +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Nicholas_Lens> . # who? :wki_336 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Nikolai_Kapustin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Nikolai_Kapustin> . :wki_337 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Nikolai_Rimsky-Korsakov> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Nikolai_Rimsky-Korsakov> . :wki_338 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Olivier_Messiaen> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Olivier_Messiaen> . :wki_339 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Otto_Albert_Tich%C3%BD> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Otto_Albert_Tich%C3%BD> . :wki_340 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Paul_Hindemith> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Paul_Hindemith> . :wki_341 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Paul_Juon> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Paul_Juon> . :wki_342 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Paul_Moravec> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Paul_Moravec> . :wki_343 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Philip_Glass> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Philip_Glass> . :wki_344 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Pierre_Boulez> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Pierre_Boulez> . :wki_346 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Rebecca_Clarke> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Rebecca_Clarke> . :wki_347 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Reynaldo_Hahn> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Reynaldo_Hahn> . :wki_348 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Richard_Strauss> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Richard_Strauss> . :wki_349 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Richard_Wagner> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Richard_Wagner> . :wki_350 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Robert_Schumann> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Robert_Schumann> . :wki_351 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Robert_Simpson> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Robert_Simpson> . :wki_352 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Samuel_Barber> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Samuel_Barber> . :wki_353 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Scott_Joplin> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Scott_Joplin> . :wki_355 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Sergei_Rachmaninoff> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Sergei_Rachmaninoff> . :wki_356 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Sergei_Taneyev> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Sergei_Taneyev> . :wki_357 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Sigismond_Thalberg> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Sigismond_Thalberg> . :wki_358 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Simon_Mayr> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Simon_Mayr> . :wki_359 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_T%C5%8Dru_Takemitsu> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_T%C5%8Dru_Takemitsu> . :wki_360 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Takashi_Yoshimatsu> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Takashi_Yoshimatsu> . :wki_361 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Thomas_Ad%C3%A8s> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Thomas_Ad%C3%A8s> . :wki_362 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Thomas_Arne> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Thomas_Arne> . :wki_363 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Thomas_Tallis> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Thomas_Tallis> . :wki_364 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Tomaso_Albinoni> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Tomaso_Albinoni> . :wki_365 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Victor_Herbert> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Victor_Herbert> . :wki_366 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Vincent_d%27Indy> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Vincent_d%27Indy> . #:wki_367 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Wilhelm_Kienzl> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Wilhelm_Kienzl> . :wki_368 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_William_Byrd> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_William_Byrd> . :wki_369 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Witold_Lutos%C5%82awski> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Witold_Lutos%C5%82awski> . :wki_370 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Wolfgang_Amadeus_Mozart> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Wolfgang_Amadeus_Mozart> . :wki_371 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_compositions_by_Zden%C4%9Bk_Fibich> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_compositions_by_Zden%C4%9Bk_Fibich> . :wki_372 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_concert_arias,_songs_and_canons_by_Wolfgang_Amadeus_Mozart> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_concert_arias,_songs_and_canons_by_Wolfgang_Amadeus_Mozart> . :wki_373 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_dances_and_marches_by_Ziehrer> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_dances_and_marches_by_Ziehrer> . :wki_374 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_fugal_works_by_Johann_Sebastian_Bach> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_fugal_works_by_Johann_Sebastian_Bach> . :wki_375 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_musical_compositions_by_Arthur_Sullivan> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_musical_compositions_by_Arthur_Sullivan> . :wki_376 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_operas_by_Handel> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_operas_by_Handel> . :wki_377 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_operas_by_Mayr> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_operas_by_Mayr> . #:wki_378 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_recorded_compositions_by_Ferruccio_Busoni> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_recorded_compositions_by_Ferruccio_Busoni> . :wki_379 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Felix_Mendelssohn> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Felix_Mendelssohn> . :wki_380 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Franz_Schubert> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Franz_Schubert> . :wki_381 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Johannes_Brahms> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Johannes_Brahms> . :wki_382 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Robert_Schumann> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Robert_Schumann> . :wki_383 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Wolfgang_Amadeus_Mozart> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_solo_piano_compositions_by_Wolfgang_Amadeus_Mozart> . :wki_384 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_songs_and_arias_of_Johann_Sebastian_Bach> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_songs_and_arias_of_Johann_Sebastian_Bach> . #:wki_386 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_symphonies_in_F_major> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_symphonies_in_F_major> . :wki_387 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/List_of_works_by_Karl_von_Ordonez> . + property:source <file:../source-data/en.wikipedia.org/works/List_of_works_by_Karl_von_Ordonez> . #:wki_388 a classical:WikipediaWorksListImporter ; -# property:source <file:source-data/en.wikipedia.org/works/List_of_works_for_the_stage_by_Wagner> . +# property:source <file:../source-data/en.wikipedia.org/works/List_of_works_for_the_stage_by_Wagner> . :wki_389 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/Schubert_compositions_D_number_1-504> . + property:source <file:../source-data/en.wikipedia.org/works/Schubert_compositions_D_number_1-504> . :wki_390 a classical:WikipediaWorksListImporter ; - property:source <file:source-data/en.wikipedia.org/works/Schubert_compositions_D_number_505-998> . + property:source <file:../source-data/en.wikipedia.org/works/Schubert_compositions_D_number_505-998> .