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
+