[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    Re: [nepomuk-core/feature/virtuosoInference] /: New resource visibility handling.
From:       Sebastian_Trüg <trueg () kde ! org>
Date:       2012-04-01 10:04:23
Message-ID: 4F782827.9050409 () kde ! org
[Download RAW message or body]

On 03/31/2012 09:20 PM, Vishesh Handa wrote:
> 
> 
> On Sun, Apr 1, 2012 at 12:30 AM, Sebastian Trueg <trueg@kde.org
> <mailto:trueg@kde.org>> wrote:
> 
>     Git commit 9476df60687ecb133ebc9dd2f9c893edc1ab097a by Sebastian Trueg.
>     Committed on 31/03/2012 at 20:46.
>     Pushed by trueg into branch 'feature/virtuosoInference'.
> 
>     New resource visibility handling.
> 
>     Until now the query api would use the nao:userVisible values stored for
>     each resource to determine if a resource should be returned.
>     This requires a lot of nao:userVisible value maintenance and makes for
>     slower queries.
>     The new solution is much simpler: only types have nao:userVisible values
>     and the query api simply checks if the result candidate has a type
>     which is visible.
>     In contrast to the old one the new solution does not allow to hide a
>     sub-class of a visible class. But since we never did that anyway and
>     the resulting queries are faster and it allows us to remove a lot
>     maintenance code (which eats CPU cycles and disk space) the change is
>     worth it.
> 
> 
> I'm not sure about this. I kinda liked being able to hide certain
> resources from "normal" view. I always thought it could be used to hold
> Artem's decision resources. But then it wasn't really used.

Of couse I agree that it would be much nicer. But this is so much
simpler and faster. For certain queries it means <1sec vs. > 10sec. due
to the negation.

> 
> 
>     M  +8    -13   libnepomukcore/query/query.cpp
>     M  +52   -0    services/storage/ontologyloader.cpp
>     M  +2    -1    services/storage/ontologyloader.h
> 
>     http://commits.kde.org/nepomuk-core/9476df60687ecb133ebc9dd2f9c893edc1ab097a
> 
>     diff --git a/libnepomukcore/query/query.cpp
>     b/libnepomukcore/query/query.cpp
>     index 943705d..6e242f4 100644
>     --- a/libnepomukcore/query/query.cpp
>     +++ b/libnepomukcore/query/query.cpp
>     @@ -1,6 +1,6 @@
>      /*
>        This file is part of the Nepomuk KDE project.
>     -   Copyright (C) 2008-2010 Sebastian Trueg <trueg@kde.org
>     <mailto:trueg@kde.org>>
>     +   Copyright (C) 2008-2012 Sebastian Trueg <trueg@kde.org
>     <mailto:trueg@kde.org>>
> 
>        This library is free software; you can redistribute it and/or
>        modify it under the terms of the GNU Library General Public
>     @@ -450,22 +450,17 @@ QString Nepomuk::Query::Query::toSparqlQuery(
>     SparqlFlags sparqlFlags ) const
>         QueryBuilderData qbd( d.constData(), sparqlFlags );
> 
> 
>     -    // We restrict results to user visible types only. There is no
>     need for this with file queries as normally all files are visible.
>         //
>     -    // Here we use an optimizations:
>     -    // The storage service creates "nao:userVisible 1" entries for
>     all visible resources. This contains two optimizations:
>     -    // - We use an integer instead of a boolean because Virtuoso
>     does not support booleans and, thus, Soprano converts
>     -    //   booleans into a fake type which is stored as a string.
>     This makes comparision much slower.
>     -    // - Instead of using crappy inference via "?r a ?t . ?t
>     nao:userVisible true" we can directly check the resources.
>     -    // - Instead of restricting the visibility to 1 we trick the
>     Virtuoso query optimizer so it won't try to use the visibility
>     -    //   as priority. We do this with a filter that does not test
>     for equality. Using "?r nao:userVisible 1" has a drastic
>     -    //   performance impact which the filter has not.
>     +    // We restrict results to user visible types only. There is no
>     need for this with file queries as normally all files are visible.
>     +    // We need the additional type pattern to ensure that the
>     variable ?r is actually available to the filter (in case there is only
>     +    // UNIONs before.
>         //
>         QString userVisibilityRestriction;
>         if( !(queryFlags()&NoResultRestrictions) && !d->m_isFileQuery ) {
>     -        userVisibilityRestriction = QString::fromLatin1("?r %1 %2 .
>     FILTER(%2>0) . ")
>     -              
>      .arg(Soprano::Node::resourceToN3(Soprano::Vocabulary::NAO::userVisible()),
>     -                     qbd.uniqueVarName());
>     +        userVisibilityRestriction = QString::fromLatin1("?r a %1 .
>     FILTER EXISTS { ?r a [ %2 %3 ] . } . ")
>     +                                    .arg(qbd.uniqueVarName(),
>     +                                        
>     Soprano::Node::resourceToN3(Soprano::Vocabulary::NAO::userVisible()),
>     +                                        
>     Soprano::Node::literalToN3(Soprano::LiteralValue(true)));
>         }
> 
> 
>     diff --git a/services/storage/ontologyloader.cpp
>     b/services/storage/ontologyloader.cpp
>     index c06a297..a09665b 100644
>     --- a/services/storage/ontologyloader.cpp
>     +++ b/services/storage/ontologyloader.cpp
>     @@ -27,6 +27,7 @@
>      #include <Soprano/PluginManager>
>      #include <Soprano/StatementIterator>
>      #include <Soprano/Parser>
>     +#include <Soprano/QueryResultIterator>
> 
>      #include <KConfig>
>      #include <KConfigGroup>
>     @@ -42,14 +43,23 @@
>      #include <kpluginfactory.h>
>      #include <kpluginloader.h>
> 
>     +#include <Soprano/Vocabulary/RDFS>
>     +#include <Soprano/Vocabulary/NAO>
>     +#include <Soprano/Vocabulary/XMLSchema>
> 
>      using namespace Soprano;
>     +using namespace Soprano::Vocabulary;
>     +
>     +namespace {
>     +    const char* s_typeVisibilityGraph = "nepomuk:/ctx/typevisibility";
>     +}
> 
>      class Nepomuk::OntologyLoader::Private
>      {
>      public:
>         Private( OntologyLoader* p )
>             : forceOntologyUpdate( false ),
>     +          someOntologyUpdated( false ),
>               q( p ) {
>         }
> 
>     @@ -59,6 +69,9 @@ public:
>         bool forceOntologyUpdate;
>         QStringList desktopFilesToUpdate;
> 
>     +    // true if at least one ontology has been updated
>     +    bool someOntologyUpdated;
>     +
>         void updateOntology( const QString& filename );
> 
>      private:
>     @@ -110,6 +123,8 @@ void
>     Nepomuk::OntologyLoader::Private::updateOntology( const QString&
>     filename )
>         }
> 
>         if( update ) {
>     +        someOntologyUpdated = true;
>     +
>             QString mimeType = df.readEntry( "MimeType", QString() );
> 
>             const Soprano::Parser* parser
>     @@ -179,6 +194,7 @@ Nepomuk::OntologyLoader::~OntologyLoader()
> 
>      void Nepomuk::OntologyLoader::updateLocalOntologies()
>      {
>     +    d->someOntologyUpdated = false;
>         d->desktopFilesToUpdate = KGlobal::dirs()->findAllResources(
>     "xdgdata-ontology", "*.ontology",
>     KStandardDirs::Recursive|KStandardDirs::NoDuplicates );
>         if(d->desktopFilesToUpdate.isEmpty())
>             kError() << "No ontology files found! Make sure the
>     shared-desktop-ontologies project is installed and XDG_DATA_DIRS is
>     set properly.";
>     @@ -201,6 +217,16 @@ void Nepomuk::OntologyLoader::updateNextOntology()
>         else {
>             d->forceOntologyUpdate = false;
>             d->updateTimer.stop();
>     +
>     +        // update graph visibility if something has changed or if
>     we never did it
>     +        const QUrl visibilityGraph =
>     QUrl::fromEncoded(s_typeVisibilityGraph);
>     +        if(d->someOntologyUpdated ||
>     +           !d->model->executeQuery(QString::fromLatin1("ask where {
>     graph %1 { ?s ?p ?o . } }")
>     +                                  
>     .arg(Soprano::Node::resourceToN3(visibilityGraph)),
>     +                                  
>     Soprano::Query::QueryLanguageSparql).boolValue()) {
>     +            updateTypeVisibility();
>     +        }
>     +
>             emit ontologyLoadingFinished(this);
>         }
>      }
>     @@ -229,6 +255,7 @@ void
>     Nepomuk::OntologyLoader::slotGraphRetrieverResult( KJob* job )
>             // TODO: find a way to check if the imported version of the
>     ontology
>             // is newer than the already installed one
>             if ( d->model->updateOntology( graphRetriever->statements(),
>     QUrl()/*graphRetriever->url()*/ ) ) {
>     +            updateTypeVisibility();
>                 emit ontologyUpdated( QString::fromAscii(
>     graphRetriever->url().toEncoded() ) );
>             }
>             else {
>     @@ -237,4 +264,29 @@ void
>     Nepomuk::OntologyLoader::slotGraphRetrieverResult( KJob* job )
>         }
>      }
> 
>     +void Nepomuk::OntologyLoader::updateTypeVisibility()
>     +{
>     +    const QUrl visibilityGraph =
>     QUrl::fromEncoded(s_typeVisibilityGraph);
>     +
>     +    // 1. remove all visibility values we added ourselves
>     +    d->model->removeContext(visibilityGraph);
>     +
>     +    // 2. make rdfs:Resource non-visible (this is required since
>     with KDE 4.9 we introduced a new
>     +    //    way of visibility handling which relies on types alone
>     rather than visibility values on
>     +    //    resources. Any visible type will make all sub-types
>     visible, too. If rdfs:Resource were
>     +    //    visible everything would be.
>     +    d->model->removeAllStatements(RDFS::Resource(),
>     NAO::userVisible(), Soprano::Node());
>     +
>     +    // 3. Set each type visible which is not rdfs:Resource and does
>     not have a non-visible parent
>     +    d->model->executeQuery(QString::fromLatin1("insert into %1 { "
>     +                                               "?t %2 'true'^^%3 . "
>     +                                               "} where { "
>     +                                               "?t a rdfs:Class . "
>     +                                               "filter not exists {
>     ?tt %2 'false'^^%3 .  ?t rdfs:subClassOf ?tt . } }")
>     +                          
>     .arg(Soprano::Node::resourceToN3(visibilityGraph),
>     +                              
>      Soprano::Node::resourceToN3(NAO::userVisible()),
>     +                              
>      Soprano::Node::resourceToN3(XMLSchema::boolean())),
>     +                           Soprano::Query::QueryLanguageSparql);
>     +}
>     +
>      #include "ontologyloader.moc"
>     diff --git a/services/storage/ontologyloader.h
>     b/services/storage/ontologyloader.h
>     index 4e0ce26..d714249 100644
>     --- a/services/storage/ontologyloader.h
>     +++ b/services/storage/ontologyloader.h
>     @@ -1,5 +1,5 @@
>      /* This file is part of the KDE Project
>     -   Copyright (c) 2007-2010 Sebastian Trueg <trueg@kde.org
>     <mailto:trueg@kde.org>>
>     +   Copyright (c) 2007-2012 Sebastian Trueg <trueg@kde.org
>     <mailto:trueg@kde.org>>
> 
>        This library is free software; you can redistribute it and/or
>        modify it under the terms of the GNU Library General Public
>     @@ -91,6 +91,7 @@ namespace Nepomuk {
>             // a little async updating
>             void updateNextOntology();
>             void slotGraphRetrieverResult( KJob* job );
>     +        void updateTypeVisibility();
> 
>         private:
>             class Private;
> 
> 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic