Mercurial > hg > classical
changeset 20:c4cb65c436ef classical-rdf
* Simple query utility
author | Chris Cannam |
---|---|
date | Tue, 23 Feb 2010 16:37:49 +0000 |
parents | 559a001e1bf5 |
children | ea477e4cc75c |
files | common/TypeRegistrar.cpp common/common.pro import/Import.cpp import/ImportClassicalComposersOrg.cpp import/import.pro testapp/Loader.cpp testapp/testapp.pro utilities/composer/composer.cpp utilities/composer/composer.pro |
diffstat | 9 files changed, 329 insertions(+), 101 deletions(-) [+] |
line wrap: on
line diff
--- a/common/TypeRegistrar.cpp Mon Feb 22 18:09:55 2010 +0000 +++ b/common/TypeRegistrar.cpp Tue Feb 23 16:37:49 2010 +0000 @@ -96,16 +96,16 @@ void TypeRegistrar::addMappings(BasicStore *store, ObjectMapper *mapper) { - store->addPrefix("foaf", "http://xmlns.com/foaf/0.1/"); - store->addPrefix("mo", "http://purl.org/ontology/mo/"); - store->addPrefix("dc", "http://purl.org/dc/elements/1.1/"); - store->addPrefix("bio", "http://purl.org/vocab/bio/0.1/"); - store->addPrefix("owl", "http://www.w3.org/2002/07/owl#"); - store->addPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); - store->addPrefix("db", "http://dbtune.org/musicbrainz/resource/"); - store->addPrefix("dbv", "http://dbtune.org/musicbrainz/resource/vocab/"); - store->addPrefix("cmn", "http://purl.org/ontology/classicalmusicnav#"); - store->addPrefix("sim", "http://purl.org/ontology/similarity/"); + store->addPrefix("foaf", Uri("http://xmlns.com/foaf/0.1/")); + store->addPrefix("mo", Uri("http://purl.org/ontology/mo/")); + store->addPrefix("dc", Uri("http://purl.org/dc/elements/1.1/")); + store->addPrefix("bio", Uri("http://purl.org/vocab/bio/0.1/")); + store->addPrefix("owl", Uri("http://www.w3.org/2002/07/owl#")); + store->addPrefix("rdfs", Uri("http://www.w3.org/2000/01/rdf-schema#")); + store->addPrefix("db", Uri("http://dbtune.org/musicbrainz/resource/")); + store->addPrefix("dbv", Uri("http://dbtune.org/musicbrainz/resource/vocab/")); + store->addPrefix("cmn", Uri("http://purl.org/ontology/classicalmusicnav#")); + store->addPrefix("sim", Uri("http://purl.org/ontology/similarity/")); store->add(Triple("classical:Composer", "a", store->expand("owl:Class"))); store->add(Triple("classical:Composer", "rdfs:subClassOf", store->expand("mo:MusicArtist"))); @@ -116,12 +116,12 @@ store->add(Triple("property:death", "a", store->expand("owl:ObjectProperty"))); store->add(Triple("property:death", "rdfs:subPropertyOf", store->expand("bio:event"))); - mapper->setObjectTypePrefix("http://dbtune.org/classical/resource/"); - mapper->setPropertyPrefix("http://dbtune.org/classical/resource/vocab/"); - mapper->setRelationshipPrefix("http://dbtune.org/classical/resource/vocab/relationship/"); + mapper->setObjectTypePrefix(Uri("http://dbtune.org/classical/resource/")); + mapper->setPropertyPrefix(Uri("http://dbtune.org/classical/resource/vocab/")); + mapper->setRelationshipPrefix(Uri("http://dbtune.org/classical/resource/vocab/relationship/")); store->addPrefix("type", mapper->getObjectTypePrefix()); - store->addPrefix("classical", mapper->getObjectTypePrefix() + "type/"); + store->addPrefix("classical", Uri(mapper->getObjectTypePrefix().toString() + "type/")); store->addPrefix("property", mapper->getPropertyPrefix()); store->addPrefix("rel", mapper->getRelationshipPrefix());
--- a/common/common.pro Mon Feb 22 18:09:55 2010 +0000 +++ b/common/common.pro Tue Feb 23 16:37:49 2010 +0000 @@ -1,31 +1,10 @@ TEMPLATE = lib TARGET = -CONFIG += release staticlib -#CONFIG += debug staticlib -DEPENDPATH += . -INCLUDEPATH += . ../../turbot -OBJECTS_DIR = o -MOC_DIR = m +load(../platform.prf) -# Input +CONFIG += staticlib + HEADERS += EditDistance.h Objects.h TypeRegistrar.h SOURCES += EditDistance.cpp Objects.cpp TypeRegistrar.cpp -solaris* { - - debug { - QMAKE_CXXFLAGS_DEBUG += -xprofile=tcov - LIBS += -xprofile=tcov - } - - release { - QMAKE_CXXFLAGS_RELEASE += -xpg -g - LIBS += -xpg - } - -} - -linux* { - QMAKE_CXXFLAGS_DEBUG += -Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -O1 -pg -}
--- a/import/Import.cpp Mon Feb 22 18:09:55 2010 +0000 +++ b/import/Import.cpp Tue Feb 23 16:37:49 2010 +0000 @@ -488,12 +488,12 @@ ObjectBuilder::getInstance()->registerClass <HobokenImporter>("ClassicalData::HobokenImporter*"); - BasicStore *store = BasicStore::load("file:importers.ttl"); + BasicStore *store = BasicStore::load(QUrl("file:importers.ttl")); ObjectMapper mapper(store); QObject *parentObject = mapper.loadAllObjects(new QObject()); BasicStore *outstore = new BasicStore(); - outstore->setBaseUri("http://dbtune.org/classical/resource/"); + outstore->setBaseUri(Uri("http://dbtune.org/classical/resource/")); ObjectMapper outmapper(outstore); TypeRegistrar::addMappings(outstore, &outmapper);
--- a/import/ImportClassicalComposersOrg.cpp Mon Feb 22 18:09:55 2010 +0000 +++ b/import/ImportClassicalComposersOrg.cpp Tue Feb 23 16:37:49 2010 +0000 @@ -351,7 +351,9 @@ } if (female != "") { composer->setGender("female"); - } + } else { + composer->setGender("male"); + } m_objects.push_back(composer); }
--- a/import/import.pro Mon Feb 22 18:09:55 2010 +0000 +++ b/import/import.pro Tue Feb 23 16:37:49 2010 +0000 @@ -1,36 +1,12 @@ TEMPLATE = app TARGET = importer -CONFIG += debug -DEPENDPATH += . -INCLUDEPATH += . ../common ../../turbot -OBJECTS_DIR = o -MOC_DIR = m +load(../platform.prf) + +HEADERS += Importer.h ImportClassicalArchives.h ImportClassicalComposersOrg.h ImportClassicalDotNet.h ImportHoboken.h ImportWikipediaComposers.h ImportWikipediaWorks.h ImportWikipediaWorksK.h ImportWikipediaWorksList.h +SOURCES += Import.cpp ImportClassicalArchives.cpp ImportClassicalComposersOrg.cpp ImportClassicalDotNet.cpp ImportHoboken.cpp ImportWikipediaComposers.cpp ImportWikipediaWorks.cpp ImportWikipediaWorksK.cpp ImportWikipediaWorksList.cpp + PRE_TARGETDEPS += ../common/libcommon.a LIBS += ../common/libcommon.a ../../turbot/dataquay/libdataquay.a ../../turbot/ext/libext.a - -# Input -HEADERS += Importer.h ImportClassicalArchives.h ImportClassicalComposersOrg.h ImportClassicalDotNet.h ImportHoboken.h ImportWikipediaComposers.h ImportWikipediaWorks.h ImportWikipediaWorksK.h ImportWikipediaWorksList.h -SOURCES += Import.cpp ImportClassicalArchives.cpp ImportClassicalComposersOrg.cpp ImportClassicalDotNet.cpp ImportHoboken.cpp ImportWikipediaComposers.cpp ImportWikipediaWorks.cpp ImportWikipediaWorksK.cpp ImportWikipediaWorksList.cpp - -solaris* { - - debug { - QMAKE_CXXFLAGS_DEBUG += -xprofile=tcov - LIBS += -xprofile=tcov - } - - release { - QMAKE_CXXFLAGS_RELEASE += -xpg -g - LIBS += -xpg - } -} - -linux* { -DEFINES += TURBOT_PROFILER WANT_TIMING -INCLUDEPATH += ../../turbot/lib/ -LIBPATH += ../../turbot/lib/ -LIBS += -pg -lturbot -}
--- a/testapp/Loader.cpp Mon Feb 22 18:09:55 2010 +0000 +++ b/testapp/Loader.cpp Tue Feb 23 16:37:49 2010 +0000 @@ -44,7 +44,7 @@ int main(int argc, char **argv) { BasicStore *store = new BasicStore(); - store->setBaseUri("http://dbtune.org/classical/resource/"); + store->setBaseUri(Uri("http://dbtune.org/classical/resource/")); ObjectMapper *mapper = new ObjectMapper(store); TypeRegistrar::addMappings(store, mapper);
--- a/testapp/testapp.pro Mon Feb 22 18:09:55 2010 +0000 +++ b/testapp/testapp.pro Tue Feb 23 16:37:49 2010 +0000 @@ -1,40 +1,13 @@ TEMPLATE = app TARGET = testapp -#CONFIG += debug -CONFIG += release -OBJECTS_DIR = o -MOC_DIR = m - -DEPENDPATH += . -INCLUDEPATH += . ../common ../../turbot - -PRE_TARGETDEPS += ../common/libcommon.a +load(../platform.prf) SOURCES += Loader.cpp RESOURCES += testapp.qrc +PRE_TARGETDEPS += ../common/libcommon.a + LIBS += ../common/libcommon.a ../../turbot/dataquay/libdataquay.a ../../turbot/ext/libext.a -solaris* { - - debug { - QMAKE_CXXFLAGS_DEBUG += -xprofile=tcov - LIBS += -xprofile=tcov - } - - release { - QMAKE_CXXFLAGS_RELEASE += -xpg -g - LIBS += -xpg - } -} - -linux* { -QMAKE_CXXFLAGS_DEBUG += -Wall -Woverloaded-virtual -Wextra -Wformat-nonliteral -Wformat-security -Winit-self -O1 -pg - -DEFINES += TURBOT_PROFILER WANT_TIMING -INCLUDEPATH += ../../turbot/lib/ -LIBPATH += ../../turbot/lib/ -LIBS += -pg -lturbot -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utilities/composer/composer.cpp Tue Feb 23 16:37:49 2010 +0000 @@ -0,0 +1,287 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +#include "Objects.h" +#include "TypeRegistrar.h" + +#include <dataquay/BasicStore.h> +#include <dataquay/RDFException.h> +#include <dataquay/objectmapper/ObjectMapper.h> +#include <dataquay/Debug.h> + +#include <QMultiMap> +#include <QFileInfo> + +#include <iostream> + +using namespace Dataquay; +using namespace ClassicalData; +using namespace std; + +ostream &operator<<(ostream &target, const QString &str) +{ + return target << str.toLocal8Bit().data(); +} + +ostream &operator<<(ostream &target, const QUrl &u) +{ + return target << "<" << u.toString() << ">"; +} + + +bool +load(BasicStore *store, QString fileName) +{ + QUrl url = QUrl::fromLocalFile(fileName); + + cerr << "Importing from URL " << url << " ..."; + try { + store->import(url, BasicStore::ImportIgnoreDuplicates, "ntriples"); + } catch (RDFException e) { + cerr << "failed" << endl; + cerr << "Import failed: " << e.what() << endl; + return false; + } + + cerr << " done" << endl; + return true; +} + +void +usage(char *name) +{ + int s = 0; + for (int i = 0; name[i]; ++i) if (name[i] == '/') s = i + 1; + name = name + s; + cerr << "Usage: " << name << " <input-rdf-file> list" << endl; + cerr << "Usage: " << name << " <input-rdf-file> list-uris" << endl; + cerr << "Usage: " << name << " <input-rdf-file> show <uri> [<uri> ...]" << endl; + cerr << "Usage: " << name << " <input-rdf-file> search <text>" << endl; + cerr << "Usage: " << name << " <input-rdf-file> match <text>" << endl; + exit(-1); +} + +static QList<Composer *> allComposers; +static QMap<Composer *, QSet<Work *> > worksMap; + +void +show(Composer *c) +{ + cout << c->property("uri").value<Uri>() << endl; + cout << c->getSortName(true); + QString d = c->getDisplayDates(); + if (d != "") cout << " (" << d << ")"; + if (!c->nationality().empty() || c->period() != "") { + cout << " ["; + bool first = true; + foreach (QString n, c->nationality()) { + if (!first) cout << "/"; + cout << n; + first = false; + } + if (c->period() != "") { + if (!first) cout << ", "; + cout << c->period(); + } + cout << "]"; + } + if (c->gender() != "") { + cout << " *" << c->gender(); + } + if (!worksMap[c].empty()) { + cout << " [" << worksMap[c].size() << " work(s)]"; + } + cout << endl; + foreach (QString a, c->aliases()) { + cout << " - " << a << endl; + } + if (c->remarks() != "") { + cout << " " << c->remarks() << endl; + } + foreach (Document *d, c->pages()) { + cout << " " << d->siteName() << " -> " << d->uri() << endl; + } +} + +void +showBrief(Composer *c) +{ + cout << c->property("uri").value<Uri>() << endl; + cout << c->getSortName(false); + QString d = c->getDisplayDates(); + if (d != "") cout << " (" << d << ")"; + if (!c->nationality().empty() || c->period() != "") { + cout << " ["; + bool first = true; + foreach (QString n, c->nationality()) { + if (!first) cout << "/"; + cout << n; + first = false; + } + if (c->period() != "") { + if (!first) cout << " "; + cout << c->period(); + } + cout << "]"; + } + if (c->gender() != "") { + cout << " *" << c->gender(); + } + if (!worksMap[c].empty()) { + cout << " [" << worksMap[c].size() << " work(s)]"; + } + cout << endl; +} + +void +listBrief(QList<Composer *> composers) +{ + QMultiMap<QString, Composer *> sorted; + foreach (Composer *c, composers) { + sorted.insert(c->getSortName(false), c); + } + foreach (Composer *c, sorted) { + showBrief(c); + } +} + +void +listUris(QList<Composer *> composers) +{ + QMultiMap<Uri, Composer *> sorted; + foreach (Composer *c, composers) { + sorted.insert(c->property("uri").value<Uri>(), c); + } + foreach (Uri uri, sorted.keys()) { + cout << uri << endl; + } +} + +void +showSearchResults(QMultiMap<float, Composer *> matches, int count) +{ + int n = 0; + for (QMultiMap<float, Composer *>::const_iterator i = matches.end(); + i != matches.begin(); ) { + --i; + if (i.key() <= 0) continue; + cout << endl; + if (n == 0) { + cout << "Best match:" << endl; + } else if (n == 1) { + cout << "Other candidate(s):" << endl; + } + cout << "[" << i.key() << "] "; + if (n == 0) show(i.value()); + else showBrief(i.value()); + if (++n > count) break; + } + if (n == 0) cout << "No matches" << endl; + cout << endl; +} + +void +search(QString typing) +{ + cout << "Searching for: " << typing << endl; + QMultiMap<float, Composer *> matches; + foreach (Composer *c, allComposers) { + float value = c->matchTyping(typing); + matches.insert(value, c); + } + showSearchResults(matches, 5); +} + +void +match(QString text) +{ + cout << "Matching: " << text << endl; + QMultiMap<float, Composer *> matches; + QRegExp sre("[\\., -]+"); + QStringList elements = text.toLower().split(sre, QString::SkipEmptyParts); + foreach (Composer *c, allComposers) { + float value = c->matchFuzzyName(elements); + matches.insert(value, c); + } + showSearchResults(matches, 5); +} + +void +showWildcard(QString text) +{ + cout << "Showing URI or wildcard: " << text << endl; + QRegExp re(text, Qt::CaseInsensitive, QRegExp::Wildcard); + foreach (Composer *c, allComposers) { + if (re.exactMatch(c->property("uri").value<Uri>().toString())) { + cout << endl; + show(c); + } + } + cout << endl; +} + +int +main(int argc, char **argv) +{ + if (argc < 3) usage(argv[0]); + QString inFileName = argv[1]; + QString command = argv[2]; + QStringList args; + for (int i = 3; i < argc; ++i) { + args.push_back(argv[i]); + } + + BasicStore *store = new BasicStore(); + store->setBaseUri(Uri("http://dbtune.org/classical/resource/")); + ObjectMapper *mapper = new ObjectMapper(store); + + TypeRegistrar::addMappings(store, mapper); + + if (!load(store, inFileName)) { + cerr << "Failed to load data source" << endl; + return 1; + } + + cerr << "Imported RDF data, mapping to objects..."; + QObject *root = mapper->loadAllObjects(0); + cerr << " done" << endl; + + delete mapper; + delete store; + + allComposers = root->findChildren<Composer *>(); + + QList<Work *> works = root->findChildren<Work *>(); + foreach (Work *w, works) { + Composition *c = w->composition(); + if (c) { + Composer *cp = c->composer(); + if (cp) worksMap[cp].insert(w); + } + } + + if (command == "list") { + listBrief(allComposers); + } else if (command == "list-uris") { + listUris(allComposers); + } else { + if (args.empty()) usage(argv[0]); + if (command == "show") { + foreach (QString s, args) { + if (!s.contains('/') && !s.contains('*')) { + s = "*" + s + "*"; + } + showWildcard(s); + } + } else if (command == "search") { + foreach (QString s, args) { + search(s); + } + } else if (command == "match") { + foreach (QString s, args) { + match(s); + } + } + } + +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utilities/composer/composer.pro Tue Feb 23 16:37:49 2010 +0000 @@ -0,0 +1,11 @@ +TEMPLATE = app +TARGET = composer + +load(../../platform.prf) + +SOURCES += composer.cpp + +PRE_TARGETDEPS += ../../common/libcommon.a + +LIBS += ../../common/libcommon.a ../../../turbot/dataquay/libdataquay.a ../../../turbot/ext/libext.a +