<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Continuously Updating Query Results over Real-Time Linked Data</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Ruben Taelman</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ruben Verborgh</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Pieter Colpaert</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Erik Mannens</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Rik Van de Walle</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Data Science Lab (Ghent University - iMinds) Sint-Pietersnieuwstraat 41</institution>
          ,
          <addr-line>9000 Ghent</addr-line>
          ,
          <country country="BE">Belgium</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Existing solutions to query dynamic Linked Data sources extend the sparql language, and require continuous server processing for each query. Traditional sparql endpoints accept highly expressive queries, contributing to high server cost. Extending these endpoints for time-sensitive queries increases the server cost even further. To make continuous querying over real-time Linked Data more affordable, we extend the low-cost Triple Pattern Fragments (tpf) interface with support for time-sensitive queries. In this paper, we discuss a framework on top of tpf that allows clients to execute sparql queries with continuously updating results. Our experiments indicate that this extension significantly lowers the server complexity. The trade-off is an increase in the execution time per query. We prove that by moving the complexity of continuously evaluating real-time queries over Linked Data to the clients and thus increasing the bandwidth usage, the cost of server-side interfaces is significantly reduced. Our results show that this solution makes real-time querying more scalable in terms of cpu usage for a large amount of concurrent clients when compared to the alternatives.</p>
      </abstract>
      <kwd-group>
        <kwd>Linked Data</kwd>
        <kwd>Linked Data Fragments</kwd>
        <kwd>sparql</kwd>
        <kwd>continuous querying</kwd>
        <kwd>real-time querying</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        As the Web of Data is a dynamic dataspace, different results may be returned depending
on when a question was asked. The end-user might be interested in seeing the query results
update over time, and thus may have to re-execute the entire query over and over again
(i.e., polling). This is, however, not very practical, especially if it is unknown beforehand
when data will change. An additional problem is that many public (even static) sparql
query endpoints suffer from a low availability [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. The unrestricted complexity of sparql
queries [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] combined with the public character of sparql endpoints entails a high server
cost, which makes it expensive to host such an interface with high availability. Dynamic
sparql streaming solutions offer combined access to dynamic data streams and static
background data through continuously executing queries. Because of this continuous
querying, the cost for these servers is even higher than with static querying.
      </p>
      <p>In this work, we therefore devise a solution that enables clients to continuously
evaluate non-high frequency queries by polling specific fragments of the data. The
resulting framework performs this without the server needing to remember any client
state. Its mechanism requires the server to annotate its data so that the client can efficiently
determine when to retrieve fresh data. The generic approach in this paper is applied to
the use case of public transit route planning. It can be used in various other domains
with continuously updating data, such as smart city dashboards, business intelligence, or
sensor networks.</p>
      <p>In the next section, we discuss related research on which our solution will be based.
In Section 3, we present a motivating use case. Section 4 discusses different techniques
to represent dynamic data, after which Section 5 gives an explanation of our proposed
query solution. Next, Section 6 shows an overview of our experimental setup and its
results. Finally, Section 7 discusses the conclusions of this work with further research
opportunities.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Related Work</title>
      <p>In this section, we first explain techniques to perform rdf annotation, which will be used
to determine freshness. Then, we zoom in on possible representations of temporal data
in rdf. We finish by discussing existing sparql streaming extensions and a low-cost
(static) Linked Data publication technique.
2.1</p>
      <p>rdf Annotations
Annotations allow us to attach metadata to triples. We might for example want to say
that a triple is only valid between a certain time interval, or that a triple is only valid in a
certain geographical area.</p>
      <p>
        rdf 1.0 [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] allows triple annotation through reification. This mechanism uses subject,
predicate and object as predicates, which allow the addition of annotations to such reified
rdf triples. The downside of this approach is that one triple is now transformed to three
triples, which significantly increases the total amount of triples.
      </p>
      <p>
        Singleton Properties [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] create unique instances (singletons) of predicates, which
then can be used for further specifying that relationship by for example adding annotations.
New instances of predicates are created by relating them to the old predicate through
the sp:singletonPropertyOf predicate. While this approach requires fewer triples than
reification to represent the same information, it still has the issue of the original triple
being lost, because the predicate is changed in this approach.
      </p>
      <p>
        With rdf 1.1 [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] came graph support, which allows triples to be encapsulated into
named graphs, which can also be annotated. Graph-based annotation requires fewer triples
than both reification and singleton properties when representing the same information. It
only requires the addition of a fourth element to the triple which transforms it to a quad.
This fourth element, the graph, can be used to add the annotations to.
2.2
      </p>
      <sec id="sec-2-1">
        <title>Temporal data in the rdf model</title>
        <p>
          Regular rdf triples cannot express the time and space in which the fact they describe
is true. In domains where data needs to be represented for certain times or time ranges,
these traditional representations should thus be extended. Time labeling [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ] is the process
of annotating triples with their change time, as opposed to making completely new
snapshots of the graph every time a change occurs. Gutierrez et al. made a distinction
between point-based and interval-based labeling, which are interchangeable [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ]. The
former states information about an element at a certain time instant, while the latter states
information at all possible times between two time instants.
        </p>
        <p>
          The authors introduced a temporal vocabulary [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ] for the discussed mechanisms,
which will be referred to as tmp in the remainder of this document. Its core predicates are:
tmp:interval This predicate can be used on a subject to make it valid in a certain time
interval. The range of this property is a time interval, which is represented by the
two mandatory properties tmp:initial and tmp:final.
tmp:instant Used on subjects to make it valid on a certain time instant as a point-based
time representation. The range of this property is xsd:dateTime.
tmp:initial and tmp:final The domain of these predicates is a time interval. Their
range is a xsd:dateTime, and they respectively indicate the start and the end of the
interval-based time representation.
        </p>
        <p>Next to these properties, we will also introduce our own predicate tmp:expiration
with range xsd:dateTime which indicates that the subject is only valid up until the given
time.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.3 sparql Streaming Extensions</title>
        <p>
          Several sparql extensions exist that enable querying over data streams. These data
streams are traditionaly represented as a monotonically non-decreasing stream of triples
that are annotated with their timestamp. These require continuous processing [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ] of
queries because of the constantly changing data.
        </p>
        <p>
          c-sparql [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ] is an approach to querying over static and dynamic data. This system
requires the client to register a query to the server in an extended sparql syntax that
allows the use of windows over dynamic data. This query registration [
          <xref ref-type="bibr" rid="ref3 ref7">3, 7</xref>
          ] must occur
by clients to make sure that the streaming-enabled sparql endpoint can continuously
re-evaluate this query, as opposed to traditional endpoints where the query is evaluated
only once. c-sparql’s execution of queries is based on the combination of a regular
sparql engine with a Data Stream Management System (dsms) [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. The internal model
of c-sparql creates queries that distribute work between the dsms and the sparql engine
to respectively process the dynamic and static data.
        </p>
        <p>
          cqels [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ] is a “white box” approach, as opposed to “black box” approaches like
c-sparql. This means that cqels natively implements all query operators without
transforming it to another language, removing the overhead of delegating it to another
system. According to previous research [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ], cqels performs much better than c-sparql
for large datasets; for simple queries and small datasets the opposite is true.
2.4
        </p>
      </sec>
      <sec id="sec-2-3">
        <title>Triple Pattern Fragments</title>
        <p>
          Experiments have shown that more than half of public sparql endpoints have an
availability of less than 95% [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. A possible contributor to this low availability is the
unrestricted complexity of sparql queries [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ] combined with the unpredictable user and
query load of sparql endpoints. Clients can send arbitrarily complex sparql queries,
which could form a bottleneck in endpoints. Triple Pattern Fragments (tpf) [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ] aim
to solve this issue of high interface cost by moving part of the query processing to the
client, which reduces the server load at the cost of increased query times and bandwidth.
The endpoints are limited to an interface through which only separate triple patterns can
be queried instead of full sparql queries. The client is then responsible for carrying out
the remaining evaluation of complex sparql queries asked by its users.
3
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Use Case</title>
      <p>A guiding use case, based on public transport, will be referred to in the remainder of this
paper. When public transport route planning applications return dynamic data, they can
account for factors such as train delays as part of a continuously updating route plan. In
this use case, different clients need to obtain all train departure information for a certain
station. A static sparql query can be used to retrieve all information using this basic
data model, which can be found in Listing 1.1, the first two triple patterns refer to triples
that contain dynamic data.</p>
      <p>SELECT ?delay ?platform ?headSign ?routeLabel ?departureTime
WHERE {
_:id t:delay ?delay.
_:id t:platform ?platform.
_:id t:departureTime ?departureTime.
_:id t:headSign ?headSign.
_:id t:routeLabel ?routeLabel.</p>
      <p>FILTER (?departureTime &gt; "2015-12-08T10:20:00"^^xsd:dateTime).</p>
      <p>FILTER (?departureTime &lt; "2015-12-08T11:20:00"^^xsd:dateTime).
}
Listing 1.1: The basic sparql query for retrieving all upcoming train departure information in a
certain station. The two first triple patterns are dynamic, the last three are static.
4</p>
    </sec>
    <sec id="sec-4">
      <title>Dynamic Data Representation</title>
      <p>Our solution consists of a partial redistribution of query evaluation workload from the
server to the client, which requires the client to be able to access the server data. There
needs to be a distinction between regular static data and continuously updating dynamic
data in the server’s dataset. For this, we chose to define a certain temporal range in
which these dynamic facts are valid, as a consequence the client will know when the data
becomes invalid and has to fetch new data to remain up-to-date. To capture the temporal
scope of data triples, we annotate this data with time. In this section, we discuss two
different types of time labeling, and different methods to annotate this data.</p>
      <sec id="sec-4-1">
        <title>Time Labeling Types</title>
        <p>We use interval-based labeling to indicate the start and endpoint of the period during
which triples are valid. Point-based labeling is used to indicate the expiration time.</p>
        <p>With expiration times, we only save the latest version of a given fact in a dataset,
assuming that the old version can be removed when a newer one arrives. These expiration
times provide enough information to determine when a certain fact becomes invalid
in time. We use time intervals for storing multiple versions of the same fact, i.e., for
maintaining a history of facts. These time intervals must indicate a start- and endtime
for making it possible to distinguish between different versions of a certain fact. These
intervals cannot overlap in time for the same facts.
4.2</p>
      </sec>
      <sec id="sec-4-2">
        <title>Methods for Time Annotation</title>
        <p>The two time labeling types introduced in the last section can be annotated on triples in
different ways. In Section 2.1 we discussed several methods for rdf annotation. We will
apply time labels to triples using the singleton properties, graphs and implicit graphs
annotation techniques.</p>
        <p>Singleton Properties Singleton properties annotation is done by creating a singleton
property for the predicate of each dynamic triple. Each of these singleton properties can
then be annotated with its time annotation, being either a time interval or expiration times.
Graphs To time-annotate triples using graphs, we can encapsulate triples inside contexts,
and annotate each context graph with a time annotation.</p>
        <p>
          Implicit Graphs A tpf interface gives a unique uri to each fragment corresponding
to a triple pattern, including patterns without variables, i.e., actual triples. Since Triple
Pattern Fragments [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ] are the basis of our solution, we can interpret each fragment
as a graph. We will refer to these as implicit graphs. This uri can then be used as
graph identifier for this triple for adding time information. For example, the uri for the
triple &lt;s&gt; &lt;p&gt; &lt;o&gt; on the tpf interface located at http://example.org/dataset/ is
http://example.org/dataset?subject=s&amp;predicate=p&amp;object=o.
        </p>
        <p>We will execute our use case for each of these annotation methods. In practice,
an annotation method must be chosen depending on the requirements and available
technologies. Each has their own set of advantages and disadvantages, like for example
required triple count.
5</p>
        <p>Query Engine
tpf query evaluation involves server and client software, because the client actively takes
part in the query evaluation, as opposed to traditional sparql endpoints where the server
does all of the work. Our solution allows users to send a normal sparql query to the
local query engine which autonomously detects the dynamic parts of the query and
continuously sends back results from that query to the user.</p>
        <p>Our solution must be able to handle regular sparql 1.1 queries, detect the dynamic
parts, and produce continuously updating results for non-high frequency queries. To
achieve this, we built an extra software layer on top of the existing tpf client that supports
each discussed labeling type and annotation method and is capable of doing dynamic
query transformation and result streaming. We will refer to this layer as the query
streamer. A simplified overview of this architecture can be seen in Figure 1. The rewriter
module internally splits the query up in a static and dynamic query. This splitting is done
by exchanging metadata with the endpoint using small queries. The dynamic query is
formed in such a way that time annotations can be retrieved from its dynamic triples based
on the selected annotation mechanism. The streamer module does the result streaming
by determining the earliest expiration time of the dynamic triples for each resultset and
re-executing the dynamic query based on that time. Once the dynamic query results are
collected, these results are filled into the static query after which it can be executed. These
dynamic and static results are then combined and sent back to the user. A client-side
caching mechanism is applied in the streamer module to cache the static query results
where possible. At the tpf server, dynamic data must be annotated with time depending
on the used combination of labeling type and method. The server expects dynamic data
to be pushed to the platform by an external process with varying data. For the case of
graph-based annotation, we extended the tpf server implementation with quad support.</p>
        <p>Server
Client</p>
        <p>TPF Interface</p>
        <p>external</p>
        <p>Query Streamer
SPARQL
query</p>
        <p>User
query results</p>
        <p>Web
split
queries
metadata</p>
        <p>Basic Graph Iterator</p>
        <p>queries
Rewriter</p>
        <p>Streamer
We set up an experiment to measure the impact of our proposed redistribution of workload
between the client and server by simultaneously executing a set of queries against a
server using our proposed solution. We repeat this experiment for two state-of-the-art
solutions: c-sparql and cqels.</p>
        <p>To test the client and server performance, our experiment consisted of one server
and ten physical clients. Each of these clients can execute from one to twenty unique
concurrent queries based on the use case from Section 3. The data for this experiment
was derived from real-world Belgian railway data using the iRail API1. This results in a
series of 10 to 200 concurrent query executions. This setup was used to test the client
and server performance of different sparql streaming approaches.</p>
        <p>For comparing the efficiency of different time annotation methods and for measuring
the effectiveness of our client-side cache, we measured the execution times of the query
for our use case from Section 3. This measurement was done for different annotation
methods, once with the cache and once without the cache. For discovering the evolution
of the query evaluation efficiency through time, the measurements were done over each
query stream iteration of the query.</p>
        <p>The discussed architecture was implemented2 in JavaScript using Node.js to allow
for easy communication with the existing tpf client.</p>
        <p>
          The tests3 were executed on the Virtual Wall (generation 2) environment from
iMinds [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]. Each machine had two Hexacore Intel E5645 (2.4GHz) cpus with 24 gb ram
and was running Ubuntu 12.04 lts. For cqels, we used version 1.0.1 of the engine [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ].
For c-sparql, this was version 0.9 [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. The dataset for this use case consisted of about
300 static triples, and around 200 dynamic triples that were created and removed each
ten seconds. Even this relatively small dataset size already reveals important differences
in server and client cost, as we will discuss in the paragraphs below.
        </p>
        <p>Server Cost The server performance results from our main experiment can be seen in
Figure 2a. This plot shows a quickly increasing cpu usage for c-sparql and cqels for
higher numbers of concurrent query executions. On the other hand, our solution never
reaches more than one percent of server cpu usage.</p>
        <p>Client Cost The results for the average cpu usage across the duration of the query
evaluation of all clients that sent queries to the server in our main experiment can be seen
in Figure 2b. The clients that were sending c-sparql and cqels queries to the server had
a client cpu usage of nearly zero percent for the whole duration of the query evaluation.
The clients using the client-side query streamer solution that was presented in this work
had an initial cpu peak reaching about 80%, which dropped to about 5% after 4 seconds.
Annotation Methods The execution times for the different annotation methods can
be seen in Figure 3. The execution times for expiration time annotation used are
approximately constant, while the execution times for time intervals significantly increase
over time, for graph-based annotation this increase is not as fast as for the other two
approaches.
1 https://hello.irail.be/api/1-0/
2 The source code for this implementation is available at https://github.com/rubensworks/</p>
        <p>TPFStreamingQueryExecutor
3 The code used to run these experiments with the relevant queries can be found at https:
//github.com/rubensworks/TPFStreamingQueryExecutor-experiments/</p>
      </sec>
      <sec id="sec-4-3">
        <title>Server load</title>
      </sec>
      <sec id="sec-4-4">
        <title>Client load</title>
        <p>In this paper, we researched a solution for querying over dynamic data with a low server
cost, by continuously polling the data based on volatility information. In this section,
we draw conclusions from our evaluation results with regard to server cost, client cost,
performance, and annotation methods.</p>
        <p>
          Server cost Not only is the server cost for our solution more than ten times lower on
average when compared to the alternatives, this cost also increases much slower for a
growing number of simultaneous clients. This makes our proposed solution more scalable
for the server for our tested use case.
Client cost The results for the client load measurements from Section 6 show that our
solution requires more client processing power than c-sparql and cqels The required
client processing power using our solution is clearly much higher than for c-sparql and
cqels. This is because we redistributed the required processing power from the server to
the client. In our solution, it is the client that has to do most of the work for evaluating
queries, which puts less load on the server. The load on the client still remains around 5%
for the largest part of the query evaluation as shown in Figure 2b. Only during the first few
seconds, the query engines cpu usage peaks, which is because of the processor-intensive
rewriting step that needs to be done once at the start of each dynamic query evaluation.
Performance Our solution significantly reduces the required server processing per client,
this complexity is mostly moved to the client. This comparison shows that our technique
allows data providers to offer dynamic data which can be used to continuously evaluate
dynamic queries with a low server cost. Our low-cost publication technique for dynamic
data is useful when the number of potential simultaneous clients is large. When this data
is only required for a small number of clients in a closed off environment and query
evaluation must happen fast, traditional approaches like cqels or c-sparql are advised.
These are only two possible points on the Linked Data Fragments axis [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ], depending
on the publication requirements, combinations of these approaches can be used.
Annotation methods From the results in Section 6, we can conclude that graph-based
annotation results in the lowest execution times. It can also be seen that annotation with
time intervals has the problem of continuously increasing execution times, because of the
continuously growing dataset. Time interval annotation can be desired if we for example
want to maintain the history of certain facts, as opposed to just having the last version of
facts using expiration times. In future work, we will investigate alternative techniques to
support time interval annotation without the continuously increasing execution times.
        </p>
        <p>In this work, the frequency at which our queries are updated is purely data-driven
using time intervals or expiration times. In the future it might be interesting, to provide a
control to the user to change this frequency, if for example this user only desires query
updates at a much lower frequency than the data actually changes.</p>
        <p>
          In future work, it is important to test this approach with a larger variety of use cases.
The time annotation mechanisms we use are generic enough to transform all static facts
to dynamic data for any number of triples. The CityBench [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ] rsp engine benchmark can
for example be used to evaluate these different cases based on city sensor data. These tests
must be scaled (both in terms of clients as in terms of dataset size), so that the maximum
number of concurrent requests can be determined, with respect to the dataset size.
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Acknowledgments</title>
      <p>The described research activities were funded by iMinds and Ghent University, the Institute for the
Promotion of Innovation by Science and Technology in Flanders (IWT), the Fund for Scientific
Research Flanders (FWO Flanders), and the European Union. Ruben Verborgh is a Postdoctoral
Fellow of the Research Foundation Flanders.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Ali</surname>
            ,
            <given-names>M.I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gao</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mileo</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>CityBench: A configurable benchmark to evaluate rsp engines using smart city datasets</article-title>
          .
          <source>In: The Semantic Web - ISWC 2015, Lecture Notes in Computer Science</source>
          , vol.
          <volume>9367</volume>
          , pp.
          <fpage>374</fpage>
          -
          <lpage>389</lpage>
          (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Arasu</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Babcock</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Babu</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cieslewicz</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Datar</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ito</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Motwani</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Srivastava</surname>
            ,
            <given-names>U.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Widom</surname>
          </string-name>
          , J.:
          <article-title>stream: The Stanford data stream management system</article-title>
          .
          <source>Book chapter</source>
          (
          <year>2004</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Barbieri</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Braga</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ceri</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Della Valle</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Grossniklaus</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Stream Reasoning: Where We Got So Far</article-title>
          .
          <source>In: Proceedings of the NeFoRS2010 Workshop</source>
          (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Barbieri</surname>
            ,
            <given-names>D.F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Braga</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ceri</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Valle</surname>
            ,
            <given-names>E.D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Grossniklaus</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Querying rdf streams with c-sparql</article-title>
          .
          <source>SIGMOD Rec</source>
          .
          <volume>39</volume>
          (
          <issue>1</issue>
          ),
          <fpage>20</fpage>
          -
          <lpage>26</lpage>
          (
          <year>Sep 2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Buil-Aranda</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hogan</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Umbrich</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vandenbussche</surname>
          </string-name>
          , P.Y.:
          <article-title>sparql web-querying infrastructure: Ready for action? In: The Semantic Web-ISWC</article-title>
          <year>2013</year>
          , pp.
          <fpage>277</fpage>
          -
          <lpage>293</lpage>
          (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Cyganiak</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wood</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lanthaler</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          <article-title>: rdf 1.1: Concepts and abstract syntax</article-title>
          .
          <source>Recommendation, W3C (Feb</source>
          <year>2014</year>
          ), http://www.w3.org/TR/2014/REC-rdf11
          <string-name>
            <surname>-</surname>
          </string-name>
          concepts-20140225/
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Della</given-names>
            <surname>Valle</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            ,
            <surname>Ceri</surname>
          </string-name>
          , S., van
          <string-name>
            <surname>Harmelen</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fensel</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          :
          <article-title>It's a streaming world! Reasoning upon rapidly changing information</article-title>
          .
          <source>Intelligent Systems, IEEE</source>
          <volume>24</volume>
          (
          <issue>6</issue>
          ),
          <fpage>83</fpage>
          -
          <lpage>89</lpage>
          (
          <year>Nov 2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Gutierrez</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hurtado</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vaisman</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Introducing time into rdf. Knowledge and Data Engineering</article-title>
          , IEEE Transactions on
          <volume>19</volume>
          (
          <issue>2</issue>
          ),
          <fpage>207</fpage>
          -
          <lpage>218</lpage>
          (
          <year>Feb 2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Gutierrez</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hurtado</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vaisman</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Temporal rdf</article-title>
          .
          <source>In: The Semantic Web: Research and Applications</source>
          , pp.
          <fpage>93</fpage>
          -
          <lpage>107</lpage>
          (
          <year>2005</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10. iLab.t, iMinds: Virtual Wall:
          <article-title>wired networks and applications</article-title>
          , http://ilabt.iminds.be/ virtualwall
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Klyne</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Carroll</surname>
          </string-name>
          , J.:
          <article-title>Resource Description Framework (rdf): Concepts and abstract syntax</article-title>
          . Rec.,
          <source>W3C (Feb</source>
          <year>2004</year>
          ), http://www.w3.org/TR/2004/REC-rdf-concepts-
          <volume>20040210</volume>
          /
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Le-Phuoc</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dao-Tran</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Parreira</surname>
            ,
            <given-names>J.X.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hauswirth</surname>
            ,
            <given-names>M.:</given-names>
          </string-name>
          <article-title>A native and adaptive approach for unified processing of linked streams and Linked Data</article-title>
          .
          <source>In: The Semantic Web-ISWC</source>
          <year>2011</year>
          , pp.
          <fpage>370</fpage>
          -
          <lpage>388</lpage>
          (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Levan</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          <article-title>: cqels engine: Instructions on experimenting cqels</article-title>
          , https://code.google.com/ p/cqels/wiki/CQELS_engine
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Nguyen</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bodenreider</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sheth</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Don't like rdf reification? Making statements about statements using singleton property</article-title>
          .
          <source>In: Proceedings of the 23rd International Conference on World Wide Web</source>
          . pp.
          <fpage>759</fpage>
          -
          <lpage>770</lpage>
          . WWW '
          <volume>14</volume>
          , New York, NY, USA (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Pérez</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Arenas</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gutierrez</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Semantics and complexity of sparql</article-title>
          . In: International semantic web conference. vol.
          <volume>4273</volume>
          , pp.
          <fpage>30</fpage>
          -
          <lpage>43</lpage>
          (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16. StreamReasoning:
          <article-title>Continuous sparql (c-sparql) ready to go pack</article-title>
          , http:// streamreasoning.org/download
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Verborgh</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hartig</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>De Meester</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Haesendonck</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>De Vocht</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vander</surname>
            <given-names>Sande</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Cyganiak</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            ,
            <surname>Colpaert</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            ,
            <surname>Mannens</surname>
          </string-name>
          , E., Van de Walle, R.:
          <article-title>Querying datasets on the Web with high availability</article-title>
          .
          <source>In: Proceedings of the 13th International Semantic Web Conference</source>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>