[Tracker] Response to a question of a company about SPARQL watching
- From: Philip Van Hoof <philip codeminded be>
- To: Tracker mailing list <tracker-list gnome org>
- Subject: [Tracker] Response to a question of a company about SPARQL watching
- Date: Fri, 14 Jun 2013 11:18:13 +0200
Hi team,
I received a series of questions from a company in automotive industry 
about implementing full SPARQL watching in Tracker's store. They told me 
they have something that does periodic requering of queries executed by 
the SPARQL clients.
We of course discussed this during our Nokia sprints a few years ago. 
Because I think the community should also know about our conclusions and 
ideas of back then I'll copy paste my response to the people who sent me 
the questions.
https://live.gnome.org/Tracker/Documentation/SignalsOnChanges
At some point we also wanted to implement full SPARQL query watching or 
triggering or SPARQL views, but due to this being too complex to monitor 
the complete graph of a Nepomuk tree we decided to go for class signals 
instead and let the clients do the remainder themselves (by requering or 
having a more clever update mechanism).
Note the complexity that every change to a relation or literal property 
(with relation I mean a property that is a reference to another object) 
in the root of the Nepomuk tree of your data, can possibly be a trigger 
for any such SPARQL view (or SPARQL watching, however you want to call 
it). This is far more complicated than traditional triggers in most 
database systems, as those triggers usually operate on a single table. 
The complexity is more comparable to query views in products like SQL 
Server or Oracle, on queries that are very complicated (subqueries, 
joins and rather hard expressions on the literals like regular 
expressions in some cases on a decomposed denormalized schema -> not fun 
to implement query views for that). Of course can we make certain 
assumptions about RDF while inserting of statements happens, in relation 
to SPARQL queries. It's probably not impossible because of those 
assumptions that can be made. HOWEVER :-)
The idea behind class signals is that we'll signal the clients that they 
might have to check the results of the query they are showing to the 
user. They can then rerun their own SPARQL query themselves to achieve 
full SPARQL watching (themselves). Such signalling systems aren't 
uncommon in MVVM designs where the view-model will translate the 
incomplete event that came from the model to complete updates on its 
view. (view would in qt be QML, view-model would be a QAbstractItemModel 
(and QSparql has one which you could use to decorate), and the model 
would be for example a QList of the results you get from QSparql or the 
QAbstractItemModel it supports itself).
A reason for that is that we didn't want to make tracker-store stateful 
with relation to the clients.
We didn't want to make it stateful with relation to clients because one 
idea is to one day have a libtracker-sparql that, just like libsqlite 
does for SQL and DB schemas, provides a way for any application to 
provide it with an ontology and then (just) start using SPARQL INSERT 
and SPARQL on that ontology. In this scenario the GNOME desktop (or the 
KDE desktop) would provide the Nepomuk ontology and the GNOME filesystem 
miner would use libtracker-sparql to fill it up. That there is a service 
like tracker-store, activated by D-Bus, is in that design scenario just 
an implementation detail of libtracker-sparql. That then there exists 
something like a semantic desktop is not really because of 
libtracker-sparql but because of the desktop having chosen the same 
Nepomuk based ontology for all of its libtracker-sparql clients 
(including the miners).
In other words is libtracker-sparql just a library that helps you build 
a semantic desktop, instead of "Tracker" providing you with "the" 
semantic desktop.
That means that this tracker-store (in libexec) would be provided by 
libtracker-sparql as a D-Bus activated 'tool' or 'implementation detail' 
that shuts itself down after a period of no-write activity. You can see 
how this can't work well together with full SPARQL watching: unless we 
have a very quick way to know in a stateless (with relation to the 
libtracker-sparql clients) way what results it has for what queries (of 
all the clients) and whether the just arrived SPARQL INSERT influences 
them at startup of the 'tool' / 'implementation detail'. Obviously can't 
this tool's startup time be long, as this would influence badly the 
SPARQL INSERT performance for the libtracker-sparql client doing the 
write query.
Because of that is the class signal signal stateless. And because of 
that we prefer all query state to remain in the libtracker-sparql 
clients themselves.
Meaning that they are responsible for reexecuting the query, and not the 
store. The store will, however, provide hints. Hints based on classes. 
Hence the name class signals.
That DOESN'T mean that the reexecuting can't be done transparently by 
libtracker-sparql (so developers who use of libtracker-sparql must not 
necessarily be aware when using such a higher level feature). Just that 
the executing-of the query, in a full SPARQL watching design, happens in 
the process of the libtracker-sparql client and not in the tracker-store 
process (for aforementioned state reasons).
In fact is QSparql's QAbstractItemModel developed that way already. 
There's just no similar support for something like that in 
libtracker-sparql. Mostly because we didn't want libtracker-sparql to 
depend on Gtk+ for it to provide a GtkTreeModel that does the same thing 
as QSparql's QAbstractItemModel. We could, however, develop a 
libtracker-sparql-gtk+ that builds on top of libtracker-sparql and 
provides a GtkTreeModel that can be used as a view-model in a MVVM 
architecture.
Such a GtkTreeModel and the QSparql QAbstractItemModel are in a MVVM 
design the view-models. If you prefer .NET Prism4 terminology the models 
that I have in mind are in C# called ObservableCollection<T>.  It 
implements INotifyCollectionChanged and INotifyPropertyChanged which 
makes it bindable to a XAML WPF view. XAML WPF views are comparable to 
QML in Qt (and in a oldfashioned way a Glade file in Gtk+).
Note to people on the public mailing list that I gave the .NET's Prism4 
for WPF examples as design principle examples and not because I am in 
any way interested in religious hate opinions on Mono and .NET or 
(seriously) whatever. I also wrote about Qt's QML and QAbstractItemModel 
and about Gtk+.
Kind regards,
Philip
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]