static KTimeZone toKTimeZone(Soprano::Node n) { QString dt = n.dataType().toString(); dt.remove(QRegExp("#tz$")); int idx = dt.lastIndexOf('/'); if (idx > 0) { idx = dt.lastIndexOf('/', idx - 1); } if (idx > 0) { dt.remove(0, idx + 1); } KTimeZone kt = KSystemTimeZones::zone(dt); kDebug(30015) << "input:" << n.dataType().toString() << " output tz.valid:" << kt.isValid() << " timezone:" << dt; if (!kt.isValid()) { // UTC "Zulu" Time if (dt == "2001/XMLSchema#dateTime" && n.toString().endsWith('Z')) { kDebug(30015) << "input:" << n.dataType().toString() << " is UTC..."; kt = KSystemTimeZones::zone("UTC"); } } if (!kt.isValid()) { kt = KSystemTimeZones::zone("UTC"); } return kt; }
// // We don't really care if the indexing level is in the incorrect graph // void Nepomuk2::updateIndexingLevel(const QUrl& uri, int level) { QString uriN3 = Soprano::Node::resourceToN3( uri ); QString query = QString::fromLatin1("select ?g ?l where { graph ?g { %1 kext:indexingLevel ?l . } }") .arg ( uriN3 ); Soprano::Model* model = ResourceManager::instance()->mainModel(); Soprano::QueryResultIterator it = model->executeQuery( query, Soprano::Query::QueryLanguageSparqlNoInference ); QUrl graph; Soprano::Node prevLevel; if( it.next() ) { graph = it[0].uri(); prevLevel = it[1]; it.close(); } if( !graph.isEmpty() ) { QString graphN3 = Soprano::Node::resourceToN3( graph ); QString removeCommand = QString::fromLatin1("sparql delete { graph %1 { %2 kext:indexingLevel %3 . } }") .arg( graphN3, uriN3, prevLevel.toN3() ); model->executeQuery( removeCommand, Soprano::Query::QueryLanguageUser, QLatin1String("sql") ); QString insertCommand = QString::fromLatin1("sparql insert { graph %1 { %2 kext:indexingLevel %3 . } }") .arg( graphN3, uriN3, Soprano::Node::literalToN3(level) ); model->executeQuery( insertCommand, Soprano::Query::QueryLanguageUser, QLatin1String("sql") ); } // Practically, this should never happen, but still else { QScopedPointer<KJob> job( Nepomuk2::setProperty( QList<QUrl>() << uri, KExt::indexingLevel(), QVariantList() << QVariant(level) ) ); job->setAutoDelete(false); job->exec(); } }
QString getId( const Soprano::Node& node ) { if ( node.isResource() ) { return QString::fromLatin1( node.uri().toEncoded() ); } else if ( node.isBlank() ) { return bnodeIdPrefix() + node.toString(); } else { return QString(); } }
QString NG::DotVisitor::vertexDescription(const Soprano::Node & node) { if(node.isBlank()) { static QString blank("blank"); return blank; } else if(node.isLiteral()) return node.toString().replace('\"', "'"); else { // Node is resource return node.uri().toString(); } }
Soprano::Node NG::CopyVisitor::vertexProxy(const Soprano::Node & node) { if(node.isBlank()) return node; if(node.isLiteral()) return node; Soprano::Node answer; QHash< QUrl, QUrl >::const_iterator it = d->proxyUrls->find(node.uri()); if(it == d->proxyUrls->end()) { // Create new // Create new url // FIXME What label should be passed to the generateUniqueUri answer = Soprano::Node( d->targetManager->generateUniqueUri("unknown") ); Q_ASSERT(!answer.uri().isEmpty()); // Add to table //kDebug() << "Adding proxy to " << node.uri() << " : " << answer.uri(); d->proxyUrls->insert(node.uri(), answer.uri()); } else { answer = Soprano::Node(it.value()); } return answer; }
void NG::DotVisitor::enter_edge(const Soprano::Node & currentNode, const Soprano::Node & propertyNode, const Soprano::Node & childNode) { static QString edgeTemplate = QString(" v%1 -> v%2 [label=\"%3\"]\n"); *d->stream << edgeTemplate.arg( vertexID(currentNode), vertexID(childNode), propertyNode.uri().fragment() ); }
void KoRdfCalendarEvent::fromKEvent(KCalCore::Event::Ptr event) { m_dtstart = event->dtStart(); m_dtend = event->dtEnd(); m_summary = event->summary(); m_location = event->location(); m_uid = event->uid(); Soprano::Node n = Soprano::LiteralValue(m_dtstart.dateTime()); KDateTime::Spec tz = toKTimeZone(n); KDateTime roundTrip = VEventDateTimeToKDateTime(n.toString(), tz); kDebug(30015) << "summary:" << m_summary; kDebug(30015) << "location:" << m_location; kDebug(30015) << "uid:" << m_uid; kDebug(30015) << "dtstart:" << m_dtstart; kDebug(30015) << "dtstart.offset:" << m_dtstart.timeZone().currentOffset(); kDebug(30015) << "dtstart.utc:" << m_dtstart.toUtc(); kDebug(30015) << " local.offset:" << KSystemTimeZones::local().currentOffset(); kDebug(30015) << "dtstart.roundTrip:" << roundTrip; kDebug(30015) << "dtend:" << m_dtend; kDebug(30015) << "dtstart.rdfnode:" << n; kDebug(30015) << "dtstart.roundTrip.offset:" << tz.timeZone().currentOffset(); }
QString NG::DotVisitor::vertexID(const Soprano::Node & node) { if(node.isBlank()) { static QString blankTemplate("blank%1"); d->vnum++; return blankTemplate.arg(QString::number(d->vnum)); } else { QHash< Soprano::Node , int >::const_iterator fit = d->vertices.find(node); if(fit == d->vertices.end()) { // Write new node d->vnum++; d->vertices.insert(node, d->vnum); return QString::number(d->vnum); } else { return QString::number(fit.value()); } } }
bool Nepomuk::Types::PropertyPrivate::addProperty( const QUrl& property, const Soprano::Node& value ) { // we avoid subclassing loops (as created for crappy inferencing) by checking for our own uri if( value.isResource() && value.uri() != uri && property == Soprano::Vocabulary::RDFS::subPropertyOf() ) { parents.append( value.uri() ); return true; } else if( property == Soprano::Vocabulary::RDFS::domain() ) { domain = value.uri(); return true; } else if( property == Soprano::Vocabulary::RDFS::range() ) { if ( value.toString().startsWith( Soprano::Vocabulary::XMLSchema::xsdNamespace().toString() ) ) { literalRange = Literal( value.uri() ); } else if ( value.uri() == Soprano::Vocabulary::RDFS::Literal()) { literalRange = Literal( value.uri() ); } else { range = value.uri(); } return true; } else if( property == Soprano::Vocabulary::NRL::minCardinality() ) { minCardinality = value.literal().toInt(); return true; } else if( property == Soprano::Vocabulary::NRL::maxCardinality() ) { maxCardinality = value.literal().toInt(); return true; } else if ( property == Soprano::Vocabulary::NRL::cardinality() ) { cardinality = value.literal().toInt(); return true; } else if ( property == Soprano::Vocabulary::NRL::inverseProperty() ) { inverse = value.uri(); return true; } return false; }
void Worker::run() { m_canceled = false; m_errorText.truncate( 0 ); Soprano::Model* model = Soprano::createModel( Soprano::BackendSettings() << Soprano::BackendSetting( Soprano::BackendOptionStorageMemory ) ); if ( !model ) { m_errorText = i18n( "Failed to create Soprano memory model. Most likely the installation misses Soprano backend plugins" ); return; } model->addStatements( m_data.toList() ); // select all instances that do not have a subject -> these should be the extracted entities Soprano::QueryResultIterator it = model->executeQuery( QString::fromLatin1( "select * where { " "?r a ?type . " "OPTIONAL { ?r <http://s.opencalais.com/1/pred/subject> ?sub . } . " "FILTER(!bound(?sub)) . " "}" ), Soprano::Query::QueryLanguageSparql ); while ( !m_canceled && it.next() ) { Soprano::Node r = it["r"]; Soprano::Graph graph; Soprano::QueryResultIterator it2 = model->executeQuery( QString::fromLatin1( "construct { ?entity ?ep ?eo . ?rel ?relp ?relo . } " "where { " "?entity <http://s.opencalais.com/1/pred/subject> %1 . " "?entity ?ep ?eo . " "?rel a <http://s.opencalais.com/1/type/sys/RelevanceInfo> . " "?rel <http://s.opencalais.com/1/pred/subject> %1 . " "?rel ?relp ?relo . " "}" ) .arg( r.toN3() ), Soprano::Query::QueryLanguageSparql ); while ( !m_canceled && it2.next() ) { graph << it2.currentStatement(); } if ( m_canceled ) break; it2 = model->executeQuery( QString::fromLatin1( "select ?name ?rel ?type ?offset ?length where { " "%1 <http://s.opencalais.com/1/pred/name> ?name . " "%1 a ?type . " "?relInfo a <http://s.opencalais.com/1/type/sys/RelevanceInfo> . " "?relInfo <http://s.opencalais.com/1/pred/subject> %1 . " "?relInfo <http://s.opencalais.com/1/pred/relevance> ?rel . " "?info a <http://s.opencalais.com/1/type/sys/InstanceInfo> . " "?info <http://s.opencalais.com/1/pred/subject> %1 . " "?info <http://s.opencalais.com/1/pred/offset> ?offset . " "?info <http://s.opencalais.com/1/pred/length> ?length . " "}" ) .arg( r.toN3() ), Soprano::Query::QueryLanguageSparql ); if ( !m_canceled && it2.next() ) { Nepomuk::Types::Class type( m_plugin->matchPimoType( it2["type"].uri() ) ); QString name = it2["name"].toString(); // FIXME: actually the opencalais resource should be used as the pimo:hasOtherRepresentation of the pimo thing // but that would mean that Entity needs more information or the graph needs to be really used Scribo::Entity entity( name, type, graph ); do { double rel = it2["rel"].literal().toDouble(); int offset = it2["offset"].literal().toInt(); int length = it2["length"].literal().toInt(); Scribo::TextOccurrence oc; oc.setStartPos( offset ); oc.setLength( length ); oc.setRelevance( rel ); entity.addOccurrence( oc ); kDebug() << type << type.label() << name << rel << offset << length; } while ( !m_canceled && it2.next() ); if ( m_canceled ) break; addNewMatch( entity ); // find relations for the entity Soprano::QueryResultIterator it3 = model->executeQuery( QString::fromLatin1( "select ?verb ?offset ?length ?exact where { " "?s a <http://s.opencalais.com/1/type/em/r/GenericRelations> . " "?s <http://s.opencalais.com/1/pred/relationsubject> %1 . " "?s <http://s.opencalais.com/1/pred/verb> ?verb . " "?info a <http://s.opencalais.com/1/type/sys/InstanceInfo> . " "?info <http://s.opencalais.com/1/pred/subject> ?s . " "?info <http://s.opencalais.com/1/pred/offset> ?offset . " "?info <http://s.opencalais.com/1/pred/length> ?length . " "?info <http://s.opencalais.com/1/pred/exact> ?exact . " "}" ) .arg( r.toN3() ), Soprano::Query::QueryLanguageSparql ); if ( !m_canceled && it3.next() ) { QString verb = it3["verb"].toString(); QString exact = it3["exact"].toString(); int offset = it3["offset"].literal().toInt(); int length = it3["length"].literal().toInt(); // FIXME: get the graph Scribo::Statement s( verb, entity, exact, Soprano::Graph() ); Scribo::TextOccurrence oc; oc.setStartPos( offset ); oc.setLength( length ); s.addOccurrence( oc ); addNewMatch( s ); } } } delete model; }
bool Nepomuk::Types::EntityPrivate::load() { const QString query = QString::fromLatin1( "select ?p ?o where { " "graph ?g { <%1> ?p ?o . } . " "{ ?g a %2 . } UNION { ?g a %3 . } . }" ) .arg( QString::fromAscii( uri.toEncoded() ), Soprano::Node::resourceToN3( Soprano::Vocabulary::NRL::Ontology() ), Soprano::Node::resourceToN3( Soprano::Vocabulary::NRL::KnowledgeBase() ) ); Soprano::QueryResultIterator it = ResourceManager::instance()->mainModel()->executeQuery( query, Soprano::Query::QueryLanguageSparql ); while ( it.next() ) { QUrl property = it.binding( "p" ).uri(); Soprano::Node value = it.binding( "o" ); if ( property == Soprano::Vocabulary::RDFS::label() ) { if ( value.language().isEmpty() ) { label = value.toString(); } else if( value.language() == KGlobal::locale()->language() ) { l10nLabel = value.toString(); } } else if ( property == Soprano::Vocabulary::RDFS::comment() ) { if ( value.language().isEmpty() ) { comment = value.toString(); } else if( value.language() == KGlobal::locale()->language() ) { l10nComment = value.toString(); } } else if ( property == Soprano::Vocabulary::NAO::hasSymbol() ) { icon = KIcon( value.toString() ); } else if ( property == Soprano::Vocabulary::NAO::userVisible() ) { userVisible = value.literal().toBool(); } else { addProperty( property, value ); } } return !it.lastError(); }