<!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>SPARQL Micro-Services: Lightweight Integration of Web APIs and Linked Data</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Franck Michel</string-name>
          <email>franck.michel@cnrs.fr</email>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Catherine Faron-Zucker</string-name>
          <email>faron@i3s.unice.fr</email>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Fabien Gandon</string-name>
          <email>fabien.gandon@inria.fr</email>
          <xref ref-type="aff" rid="aff4">4</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Web API, SPARQL, micro-service, Data Integration, Linked Data,</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Linked Data on the Web, April 2018, Lyon, France</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>.</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>JSON-LD</institution>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>University Côte d'Azur</institution>
          ,
          <addr-line>CNRS, Inria, I3S</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>University Côte d'Azur</institution>
          ,
          <addr-line>Inria, CNRS, I3S</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
        <aff id="aff4">
          <label>4</label>
          <institution>University Côte d'Azur</institution>
          ,
          <addr-line>Inria, CNRS, I3S</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2018</year>
      </pub-date>
      <abstract>
        <p>Web APIs are a prominent source of machine-readable information. We hypothesize that harnessing the Semantic Web standards to enable automatic combination of Linked Data and non-RDF Web APIs data could trigger novel cross-fertilization scenarios. To achieve this goal, we define the SPARQL Micro-Service architecture. A SPARQL micro-service is a lightweight, task-specific SPARQL endpoint that provides access to a small, resource-centric, virtual graph, while dynamically assigning dereferenceable URIs to Web API resources that do not have URIs beforehand. The graph is delineated by the Web API service being wrapped, the arguments passed to this service, and the restricted types of RDF triples that this SPARQL micro-service is designed to spawn. In this context, we argue that full SPARQL expressiveness can be supported eficiently without jeopardizing servers availability. Eventually, we believe that an ecosystem of SPARQL micro-services could emerge from independent service providers, enabling Linked Data-based applications to glean pieces of data from a wealth of distributed, scalable and reliable services. We describe an experimentation where we dynamically augment biodiversity-related Linked Data with data from Flickr, MusicBrainz and the Macauley scientific media library.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>INTRODUCTION</title>
      <p>
        Web APIs are a common means for Web portals and data producers
to enable HTTP-based, machine-processable access to their data.
They are a prominent source of information1 pertaining to topics
as diverse as entertainment, finance, social networks, government
or scientific information. Many of them follow a REST or
“RESTlike” architecture2 ensuring a relatively uniform access to resource
descriptions. In a similar perspective, Linked Data [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] seek the
publication of machine-readable data on the Web, but go one step
beyond. Connecting related RDF datasets brings about the ability to
query and make sense of distributed knowledge graphs, provided
119,000+ Web APIs are registered on ProgrammableWeb.com as of January 2018.
2REST-like refers to loosely-defined architectures complying with some REST
principles but relaxing others.
      </p>
      <p>
        Verborgh et al. defined a framework to analyze and compare
diferent Linked Data query interfaces [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ]: a response to a query
3Almost 10,000 knowledge graphs are inventoried by LODStats as of January 2018
(http://lodstats.aksw.org/).
4https://goo.gl/BqMC21
5http://ogp.me/
against such an interface is called a Linked Data Fragment (LDF).
Different LDF types can be sorted by the granularity of their querying
mechanism, as depicted on Figure 1: on the left hand-side, querying
consists of a mere download operation and clients bear the full cost
of evaluating queries against RDF dumps; on the right hand-side,
SPARQL enables expressing specific queries but endpoints fully
bear the evaluation cost. Between these two extremes lies a
spectrum of intermediate approaches: a Linked Data document results
from a URI dereferencing; a Triple Pattern Fragment [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ] (TPF)
results from evaluating a single triple pattern against an RDF dataset.
TPFs succeed in balancing the query evaluation cost between the
client and the server, thereby enabling better server availability
and eficiency than full-fledged SPARQL endpoints. Still, we can
think of solutions wherein servers can compute more expressive
queries (more than just a triple pattern) without jeopardizing their
sustainability.
      </p>
      <p>
        In this paper, we address the specific goal of combining Web APIs
data and Linked Data. We propose an additional type of Linked
Data Fragment interface called SPARQL Micro-Services, by
analogy with the popular micro-services architecture that structures
an application as a collection of lightweight, loosely-coupled
services designed for a specific task [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ]. A SPARQL micro-service is a
lightweight method to query a Web API using SPARQL. It provides
access to a small, resource-centric, virtual graph, while dynamically
assigning dereferenceable URIs to Web API resources that do not
have URIs beforehand. This graph corresponds to a fragment of
the whole dataset served by the Web API, delineated by (i) the Web
API service that is bridged by this SPARQL micro-service; (ii) the
arguments passed to this Web API service; and (iii) the restricted
types of RDF triples that this SPARQL micro-service is designed
to spawn. Since a query is evaluated against a somewhat limited
graph, its processing cost can be kept low. Hence, unlike Triple
Pattern Fragments, SPARQL micro-services allow full SPARQL
expressiveness without risking server overloading. They are depicted
on Figure 1, half-way between TPF and SPARQL.
      </p>
      <p>The rest of this article is organized as follows. Section 2 first
reminds the micro-service architectural principles and sketches
how these could apply to the development of Linked Data-based
applications. Then, sections 3 and 4 define in more details the
SPARQL micro-service architecture. In sections 5 and 6 we present
our implementation and the experimentation we have conducted.
Related works are discussed in section 7 while the last section sums
up our approach and suggests future leads.
2</p>
    </sec>
    <sec id="sec-2">
      <title>MICRO-SERVICE AND LINKED</title>
    </sec>
    <sec id="sec-3">
      <title>DATA-BASED APPLICATIONS</title>
      <p>
        The term micro-service refers to an architectural style, also called
ifne-grained SOA , where an application consists of a collection of
services that are loosely coupled, fine-grained (designed to fulfill
a single function) and independently deployable [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ]. There is no
standard definition of micro-services at this point, however a
consensus is emerging about commonly agreed upon principles [
        <xref ref-type="bibr" rid="ref30 ref5">5, 30</xref>
        ].
Compared to traditional monolithic applications, the micro-service
architectural style improves modularity by making applications
easier to develop, maintain and test. Development teams are typically
geared towards continuous refactoring, delivery and deployment of
the services they are responsible for, independently of other teams.
More complex services are achieved by composition on top of these
ifne-grained services.
      </p>
      <p>
        Micro-services have been increasingly adopted during the last six
to seven years, not only by major Web companies who inspired this
architecture, but also by many other companies that need to speed
up the development and deployment of their services. Like any
architecture style, the experience shows that micro-services have
pitfalls of their own6. In particular, figuring out the appropriate size
of a micro-service (its functional scope) is critical in many aspects.
Nevertheless, leveraging these principles may help in the design of
distributed, modular Linked Data-based applications structured as
a collection of lightweight, loosely-coupled services. These services
would typically be RDF stores, URI dereferencing services, SPARQL
endpoints, Linked Data Platform [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] compliant services, etc.
Lightweight container technologies, such as the popular Docker7, could
underpin the quick and elastic deployment of such Linked
Databased applications, enabling on-demand scaling up or down by
simply starting or stopping instances of these services.
      </p>
      <p>The SPARQL micro-service architecture is a proposition towards
this goal. We think of SPARQL micro-services as independent
software units being developed along with the arising of needs. A
microservice development team focuses on one Web API at a time, defines
how to wrap a few services, tests and publishes them. Instead of
being constrained to use specific technologies within a monolithic
application, the team picks the programming language(s), Semantic
Web stack and other third-party technologies that it deems most
appropriate for a specific service.</p>
      <sec id="sec-3-1">
        <title>6https://www.infoq.com/news/2014/08/failing-microservices 7https://www.docker.com.</title>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>THE SPARQL MICRO-SERVICE</title>
    </sec>
    <sec id="sec-5">
      <title>ARCHITECTURE</title>
    </sec>
    <sec id="sec-6">
      <title>Definition</title>
      <p>
        A SPARQL micro-service Sµ is a wrapper of a service Sw of a Web
API. It behaves as a regular SPARQL endpoint insofar as it
supports the SPARQL Query Language [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] (including all query forms:
SELECT, ASK, CONSTRUCT, DESCRIBE) and the SPARQL
Protocol [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. It is thus invoked over HTTP/HTTPS by passing a SPARQL
query (argument query in the GET or URL-encoded POST
methods, or HTTP payload in the direct POST method) and optional
default and named graph URIs (arguments default-graph-uri and
named-graph-uri).
      </p>
      <p>Additionally, Sµ accepts a possibly empty set Arдw of
arguments that are specific to the service being wrapped. They are
passed to Sµ as parameters on the HTTP query string; in turn, Sµ
passes them on to Sw . Accordingly, while the URL of a regular
SPARQL endpoint is typically of the form “http://hostname/sparql”,
a SPARQL micro-service is invoked with additional parameters,
like “http://hostname/sparql?param1=value1&amp;param2=value2”.</p>
      <p>The semantics of a SPARQL micro-service difers from that of a
standard SPARQL endpoint insofar as the SPARQL protocol treats
a service URL as a black box, i.e. it does not identify nor interprets
URL parameters in any way. By contrast, a SPARQL micro-service
is a configurable SPARQL endpoint whose set Arдw of arguments
delineates the scope of the virtual graph that is being queried.
Thence, each pair (Sµ , Arдw ) is a standard SPARQL endpoint. As we
see it, the graph accessed through (Sµ , Arдw ) is typically
resourcecentric and corresponds to a small fragment of the dataset served
by the Web API.</p>
      <p>Figure 2 illustrates the SPARQL micro-service architecture in the
case of the implementation we describe further on in section 5. Sµ
evaluates a SPARQL query against an RDF graph that it builds at
run-time following Algorithm 1 (the algorithm’s steps are depicted
on Figure 2). Note that how the transformation at step (3) is carried
out is implementation-dependent. In the case of JSON-based Web
APIs, our implementation first applies a JSON-LD profile to the Web
API response and optionally executes a SPARQL INSERT query
to yield additional triples. However, various other methods may
be used at this point, involving e.g. diferent flavors of mapping,
reasoning or rule processing.</p>
      <p>Algorithm 1 Evaluation of a SPARQL query by a SPARQL
microservice Sµ .</p>
      <p>(1) Sµ receives a SPARQL query Q along with arguments Arдw .
(2) Sµ invokes the Web API service Sw with the arguments in
Arдw . The response is a fragment Fw of the dataset served
by the Web API.
(3) Sµ translates Fw into a Linked Data Fragment FLD and loads
it into a triple store as a temporary graph G.</p>
      <p>(4) Sµ evaluates Q against G and returns the result to the client.
3.2</p>
    </sec>
    <sec id="sec-7">
      <title>Caching Strategy</title>
      <p>Querying Web APIs is often a time-consuming task, as suggested by
the measures we report in section 6. Thus, when possible, defining
caching strategies may be necessary to achieve the performance
expected by some applications. There typically exist many
syntactical variants of the same SPARQL query. Such that classic HTTP
proxy servers set up between SPARQL clients and servers fail to
reach eficient cache reuse. By contrast, Web API queries allow a
lesser syntactical variability. Therefore, in the context of SPARQL
micro-services, enforcing a cache strategy on the Web API side
should ensure better cache reuse. Typically, Web API queries could
be used to index either the Web API responses or the temporary
graphs produced from them.</p>
      <p>Furthermore, some Web APIs provide data expiration
information (such as the Expires, Cache-Control and/or Last-Modified HTTP
headers) on which a caching system can rely to figure out a caching
strategy. When no such information is provided, a SPARQL
microservice may authoritatively decide on an appropriate expiration
period depending on the type of service being wrapped.
3.3</p>
    </sec>
    <sec id="sec-8">
      <title>Errors Management</title>
      <p>A typical client’s SPARQL query may invoke several SPARQL
microservices simultaneously using multiple SERVICE clauses. The
failure of a non-critical micro-service (due e.g. to a network error or a
Web API error) should not hinder processing the other ones and
returning partial results. Hence, a client may use the SILENT
keyword to ignore errors from a SPARQL micro-service, and possibly
embed SERVICES clauses within OPTIONAL clauses to allow for
the production of partial results (this is exemplified later on in
Listing 4).
{ "photos ": {
"page ": 1, "pages ": "22689" ,
"photo ": [
{ "id ": "38427227466" , "title ": " Brooklyn Bridge sunset ",
"owner ": "33634811 @N07 ", "ownername ": " Franck Michel ",
"secret ": "100 fa110d0 ", "server ": "4542" , "farm ": 5 }
} }</p>
      <sec id="sec-8-1">
        <title>Listing 1: Snippet from an example Flickr Web API response</title>
        <p>
          (top), and equivalent RDF triples in the Turtle syntax [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]
produced by applying a simple JSON-LD profile (bottom).
        </p>
      </sec>
    </sec>
    <sec id="sec-9">
      <title>3.4 Example</title>
      <p>
        We now illustrate Algorithm 1 with an example based on Flickr’s
Web API8. Let Sw be the Flickr service that retrieves photos posted
in a specific group and having a specific tag 9. Arдw (the arguments
of Sw ) comprises two arguments, group_id and tags. A SPARQL
micro-service Sµ wraps Sw . In step 1, a client willing to retrieve the
URLs of photos matching some specific group and tags executes a
SPARQL query “SELECT ?img WHERE {?photo foaf:depiction ?img.}”
against Sµ . Using the SPARQL HTTP GET method [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], Sµ is invoked
as follows:
http :// hostname / flickr / getPhotosByGroupByTag ?
group_id =35034350743 @N01 &amp;tags = bridge &amp;
query = SELECT \%20\%3 Fimg \%20 WHERE \%20\%7 B\%3 Fphoto \
      </p>
      <p>\%20 foaf \%3 Adepiction \%20\%3 Fimg .\%7 D
Interestingly enough, this is precisely the invocation that would be
performed by the SERVICE clause in the following SPARQL query:
SELECT ?img WHERE {</p>
      <p>SERVICE &lt;http :// hostname / flickr / getPhotosByGroupByTag ? \
group_id =35034350743 @N01 &amp; tags =bridge &gt;
{ ? photo foaf : depiction ?img. }
}</p>
      <p>In step 2, Sµ invokes Sw with the arguments of Arдw in addition
to other arguments possibly required by the Web API (for the sake
of clarity we have left over some technical arguments). Listing 1
(top) sketches a snippet of the response to this query:
https :// api. flickr .com/ services / rest /?
method = flickr . groups . pools . getPhotos &amp; format = json &amp;
group_id =35034350743 @N01 &amp;tags = bridge</p>
      <p>
        Step 3 is implementation dependent. The prototype
implementation presented in section 5 draws on the method proposed by the
JSON-LD specification [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ] to interpret regular JSON content as a
serialized RDF graph. The resulting graph G is stored into a triple
store, and an optional SPARQL INSERT query yields additional
triples using relevant domain vocabularies.
      </p>
      <p>Finally, in step 4, Sµ evaluates the client’s SPARQL query against
G and returns the response in one of the media types supported by
the SPARQL client (following a regular content negotiation).</p>
      <sec id="sec-9-1">
        <title>8https://www.flickr.com/services/api/ 9https://www.flickr.com/services/api/flickr.groups.pools.getPhotos.html</title>
      </sec>
    </sec>
    <sec id="sec-10">
      <title>3.5 Discussion</title>
      <p>In this proposition, a design decision is to pass the arguments of
Arдw to Sµ as HTTP query string parameters. Arguably, other
solutions may be adopted. Below we discuss the respective benefits
and drawbacks of some alternatives we identified.</p>
      <p>A first alternative consists in defining one predicate for each
argument, e.g.:
prefix api: &lt;http :// sms.i3s. unice .fr/ schema /&gt;
SELECT ?img WHERE {</p>
      <p>SERVICE &lt;http :// hostname / flickr / getPhotosByGroupByTag &gt;
{ ? photo foaf : depiction ?img;
api: group_id "806927 @N20 ";
api: tags " bridge ".
}</p>
      <p>}
At a first sight, making the arguments explicit can seem compelling
as they can be used in other triples of the graph pattern. Besides,
such a SPARQL micro-service is a standard SPARQL endpoint since
there is no more variable part in the service endpoint URL. Several
concerns should be pointed out however. (i) This solution requires
that each SPARQL micro-service be defined along with its own
bespoke terms, whereas we seek a solution wherein only terms of
well-adopted vocabularies would be exposed. (ii) In this example,
the group_id and tags arguments are meaningful for the end user.
But some services may require more technical arguments that we
typically do not want to define as ontological terms. (iii)
Furthermore, this solution questions the nature of the subject to which the
arguments are associated. Again, in this specific example, declaring
the group_id and tags as properties of the photographic resource
?photo is an acceptable choice, but this would be inappropriate
with internal or technical service parameters.</p>
      <p>
        This issue can be solved by associating the arguments to a
separate resource depicting the service itself. This is exemplified in the
second alternative that, furthermore, defines a vocabulary to pass
the arguments in a uniform manner. Note that existing vocabularies
may be tapped for that matter, such as Hydra [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] or the HTTP
Vocabulary in RDF [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. In the example below, additional triple
patterns define an instance of the hypothetical api:Service class,
that takes arguments declared with the api:param predicate.
prefix api: &lt;http :// sms.i3s. unice .fr/ schema /&gt;
SELECT ?img WHERE {
      </p>
      <p>SERVICE &lt;http :// hostname / flickr / getPhotosByGroupByTag &gt;
{ ? photo foaf : depiction ?img.</p>
      <p>[] a api: Service ;
api: param [ api: name " group_id "; api: value "806927 @N20 " ];
api: param [ api: name " tags "; api: value ?tag ].
}
}</p>
      <p>].</p>
      <p>A slight variation could state that the service URL itself is an
instance of api:Service; the arguments would then configure an
execution of this service with predicate api:execution, e.g.:
&lt;http :// hostname / flickr / getPhotosByGroupByTag &gt;
a api: Service ;
api: execution [
api: param [ api: name " group_id "; api: value "806927 @N20 " ];
api: param [ api: name " tags "; api: value ?tag ].</p>
      <p>While these alternatives avoid defining new predicates for each
micro-service, the additional triples bear a somewhat artificial
semantics: they provide the service with information as to how to
process the other parts of the graph pattern, but they do not
actually refer to nor describe the photographic resources that the graph
pattern aims to match.</p>
      <p>In a third alternative, the service arguments are passed as SPARQL
variables with pre-defined names, e.g. ?group_id and ?tags in the
example below:
SELECT ?img WHERE {</p>
      <p>SERVICE &lt;http :// hostname / flickr / getPhotosByGroupByTag &gt;
{ ? photo foaf : depiction ?img.
}
}</p>
      <p>BIND ("806927 @N20 " AS ? group_id )</p>
      <p>BIND (" bridge " AS ? tags )
Similarly to the previous alternative, variables ?group_id and ?tags
are artificial insofar as they provide the service with information
as to how to process the other parts of the graph pattern.</p>
      <p>The solution proposed in this article is a trade-of meant to satisfy
certain goals. Above, we have discussed some alternative solutions,
and others may probably be figured out. We believe that further
discussions should be engaged to assess the benefits and concerns
of these alternatives with respect to the contexts and goals.
4</p>
    </sec>
    <sec id="sec-11">
      <title>ASSIGNING URIS TO WEB API RESOURCES</title>
      <p>Web APIs often provide resource descriptions that rely on internal,
proprietary identifiers. For instance, Listing 1 mentions the photo
identifier “38427227466” that has no meaning beyond the scope of
Flickr’s Web API. One may argue that the URL of this photo’s Web
page could serve as a URI, but this would just approve a questionable
practice that confuses a resource (a photographic work in this case)
with an HTML representation thereof.</p>
      <p>
        Therefore, bridging Web APIs and Linked Data not only requires
to enable SPARQL querying of Web APIs, but also to dynamically
create URIs that identify Web API resources. Furthermore,
according to Linked Data best practices [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], it should be possible to look
up these URIs in order to retrieve a description of the resources
in a negotiated media type. Conventionally, dereferencing a URI
returns a set of RDF triples where the URI is either in the subject or
object positions. This is typically achieved through a CONSTRUCT
or DESCRIBE SPARQL query form.
      </p>
      <p>Implementing URI dereferencing with SPARQL micro-services
is straightforward. It only requires two things:
(i) Decide on the domain name and URIs scheme. Following up on
the example in section 3, we define the URI scheme of Flickr photo
resources as “http://example.org/ld/flickr/photo/&lt;photo_id&gt;”.
(ii) Set up a Web server to deal with this URI scheme. When the
Web server receives a look-up for a URI that matches the scheme,
it dynamically builds a query string to invoke the relevant SPARQL
micro-service. Technically, the Web server acts as a reverse proxy:
it queries the SPARQL micro-service and transparently proxies the
response back to the client. Figure 3 sketches this architecture.</p>
      <p>Let us assume the getPhotoById SPARQL micro-service retrieves
photos by their identifier. If the Web server receives a look-up for the
URI “http://example.org/ld/flickr/photo/38427227466”, it invokes
the getPhotoById micro-service with the following query string:
http :// hostname / flickr / getPhotosById ?
photo_id =38427227466&amp;
query = DESCRIBE \%20\%3 Chttp \%3A\%2F\%2 Fexample .org \%2 Fld \
\%2 Fflickr \%2 Fphoto \%2 F38427227466 \%3E
The value of argument “query” is the URL-encoded string for:
DESCRIBE &lt;http://example.org/ld/flickr/photo/38427227466&gt;.
The response to this query will be proxied back to the client in one
of the negotiated media types.</p>
      <p>Hence, by smartly designing SPARQL micro-services, we can
build a consistent ecosystem where some micro-services respond
to SPARQL queries by translating Web API internal identifiers
into URIs, and some micro-services (possibly the same) are able to
dereference these URIs.</p>
    </sec>
    <sec id="sec-12">
      <title>5 IMPLEMENTATION</title>
      <p>To evaluate the architecture proposed in section 3, we have
developed a prototype implementation in the PHP language, available
on Github10 under the Apache 2.0 license. This prototype complies
with the choices pictured in Figure 2: it assumes that Web APIs are
able to provide a JSON response, and thence requires each SPARQL
micro-service to provide a JSON-LD profile as a first mapping step
towards RDF.</p>
      <p>
        SPARQL queries. The processing of SPARQL queries is
implemented as depicted in Figure 2. First, a JSON-LD profile is applied
to the Web API JSON response. Following up on the example
introduced in section 3, Sµ applies to the API response the JSON-LD
profile below, that turns each JSON field name into an ad hoc RDF
predicate within namespace “http://sms.i3s.unice.fr/schema/” (note
that any arbitrary complex profile may be used at this point):
{"@context ": {"@vocab ": " http :// sms.i3s. unice .fr/ schema /"}}.
The resulting graph G, depicted in Listing 1 (bottom), is stored in
the Corese-KGRAM in-memory triple store [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. It exhibits
proprietary, technical predicates such as servers and farms identifiers, that
are likely irrelevant for a Linked Data representation. The Flickr
API documentation describes how to reconstruct photos and user
pages URLs from these fields, but this involves the concatenation of
values from distinct fields, that JSON-LD is typically not expressive
enough to describe. Therefore, in a second step, Sµ executes the
INSERT query shown in Listing 2 to augment G with triples based
on well-adopted or domain-specific vocabularies (Schema.org, foaf
and Dublin Core in our example).
10https://github.com/frmichel/sparql-micro-service
prefix api : &lt;http :// sms . i3s . unice .fr/ schema /&gt;
prefix foaf : &lt;http :// xmlns . com / foaf /0.1/ &gt;
prefix schema : &lt;http :// schema . org /&gt;
prefix dce : &lt;http :// purl . org /dc/ elements /1.1/ &gt;
INSERT {
? photoUri a schema : Photograph ;
foaf : depiction ? img ;
schema : author ? authorUrl ; dce : creator ? authorName ;
dce : title ? title .
} WHERE {
? photo api :id ?id; api : secret ? secret ;
api : server ? server ; api : farm ? farm ;
api : title ? title ;
api : owner ? owner ; api : ownername ? authorName .
      </p>
      <sec id="sec-12-1">
        <title>Listing 2: Insertion of RDF triples based on well-adopted vocabularies (Schema.org, FOAF, Dublin Core).</title>
        <p>Finally, Sµ evaluates the client’s SPARQL query against G and
returns the response that, in the example, consists of a solution
binding presented below in the SPARQL Results JSON format:
{ "head ": { " vars ": [ " img " ] }, "results ": {
"bindings ": [
{ " img ": {
"type ": " uri ",
"value ": " https :// farm5 . staticflickr . com /4542/ \</p>
        <p>38427227466 _100fa110d0_z . jpg " }
} ] } }</p>
        <p>URIs dereferencing. In the URIs dereferencing solution
portrayed in section 4, the Web server’s URL rewriting engine appends
a SPARQL query to the SPARQL micro-service invocation. In our
example, this query is simply “DESCRIBE &lt;uri&gt;”. Nevertheless,
some use cases may require more complex CONSTRUCT queries
to produce richer triples. Since the query must be URL-encoded,
this method may become cumbersome and dificult to maintain.
To avoid this issue, our implementation proposes a more flexible
and maintainable alternative: each micro-service may provide a
CONSTRUCT query that shall be used to produce the answer to
the URI dereferencing query.</p>
        <p>Deploying a new SPARQL micro-service. Within this
prototype, deploying a new SPARQL micro-service simply consists of
provisioning four files among which two are optional:
• config.ini : a configuration file that declares the arguments
expected by the micro-service and the Web API invocation
query string.
• profile.jsonld : the JSON-LD profile used to interpret the Web</p>
        <p>API response as an RDF graph;
• insert.sparql (optional): used to augment the graph with
additional triples;
• construct.sparql (optional): used to produce the response to</p>
        <p>URI dereferencing queries.</p>
        <p>In our experience, deploying a new SPARQL micro-service within
our prototype is a matter of one or two hours in simple cases. The
most time-consuming task lies in reading the Web API
documentation. Thenceforth, a developer defines the API query string and the
arguments passed to the SPARQL micro-service. Lastly, she writes
the JSON-LD profile and the optional INSERT and CONSTRUCT
queries that carry out the mappings toward domain vocabularies.</p>
        <p>Our prototype consists of only 350 lines of code, in addition
to the RDF and JSON-LD libraries that it relies on. If a Web API
requires specific actions that cannot be described using the config.ini
configuration file ( e.g. intermediate query, authentication process),
the developer can customize a provided script, allowing for more
lfexibility. The interested reader can look at an example in service
macaulaylibrary/getAudioByTaxon.</p>
        <p>Docker Deployment. In addition to the code available on Github,
we have created two Docker images published on Docker hub11: one
image runs the Corese-KGRAM RDF store and SPARQL endpoint,
while the other provides an Apache Web server with the SPARQL
micro-services described in section 6. They can be deployed by
running a single command, as instructed in the Github README.
Note that, for the sake of simplicity, we have defined a single image
hosting several micro-services. Nevertheless, more in line with
common micro-service practices, it would make sense to define one
image per service, enabling the independent deployment of each
service.</p>
      </sec>
    </sec>
    <sec id="sec-13">
      <title>6 EXPERIMENTATION</title>
      <p>
        To evaluate the efectiveness and eficiency of our approach, we
carried out a series of tests related to the use case that initially
motivated this work, in the context of biodiversity. In a joint initiative
with the French National Museum of Natural History, we have
produced a dataset called TAXREF-LD, a Linked Data representation
of the French taxonomic register of living beings [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. TAXREF-LD
models over 236.000 taxa as OWL classes while the scientific names
used to refer to taxa are modeled as SKOS concepts. It is accessible
through a public SPARQL endpoint12, and all taxa and scientific
names URIs are dereferenceable.
      </p>
      <p>To dynamically enrich the description of a taxon in TAXREF-LD
with data from various Web APIs, we developed three SPARQL
micro-services based on the prototype presented in section 5 (the
code is available along with the rest of the project code on Github):
(1) flickr/getPhotosByGroupByTag , already described in section
3, is used to search the Encyclopedia of Life Flickr group13 for
photos of a given taxon. Photos of this group are tagged with
the scientific name of the taxon they represent, formatted as
“taxonomy:binomial=&lt;scientific name &gt;”.
(2) macaulaylibrary/getAudioByTaxon retrieves audio
recordings for a given taxon name from the Macaulay Library14, a
scientific media archive related to birds, amphibians, fishes
and mammals.
(3) musicbrainz/getSongByName searches the MusicBrainz
music information encyclopedia15 for music tunes whose title
match a given name with a minimum confidence of 90%.</p>
    </sec>
    <sec id="sec-14">
      <title>6.1 Test Setting</title>
      <p>We wrote several test queries that invoke TAXREF-LD’s SPARQL
endpoint along with one, two or three of the SPARQL micro-services
11https://hub.docker.com/u/frmichel/
12http://taxref.mnhn.fr/sparql
13https://www.flickr.com/groups/806927@N20
14https://www.macaulaylibrary.org/
15https://musicbrainz.org/
prefix rdfs : &lt;http :// www.w3.org /2000/01/ rdf - schema #&gt;
prefix owl: &lt;http :// www.w3.org /2002/07/ owl#&gt;
prefix schema : &lt;http :// schema .org/&gt;
SELECT ? species ? audioUrl WHERE {</p>
      <p>SERVICE &lt;https :// erebe -vm2.i3s. unice .fr :8890/ sparql &gt; {
? genus a owl: Class ; rdfs : label " Delphinus ".</p>
      <p>?s rdfs : subClassOf ? genus ; rdfs : label ? species .
Listing 3: Dynamic construction of a SPARQL micro-service
endpoint URL: the first SERVICE clause retrieves the species
(sub-classes) of genus Delphinus. For each species, the
second SERVICE clause invokes a SPARQL micro-service to
retrieve associated audio recordings.
prefix rdfs : &lt;http :// www.w3.org /2000/01/ rdf - schema #&gt;
prefix owl: &lt;http :// www.w3.org /2002/07/ owl#&gt;
prefix foaf : &lt;http :// xmlns .com/ foaf /0.1/ &gt;
prefix schema : &lt;http :// schema .org/&gt;
CONSTRUCT {
? species # from TAXREF -LD
schema : subjectOf ? photo ; # from Flickr
foaf : depiction ?img; # from Flickr
schema : contentUrl ? audioUrl ; # from the Macaulay Library
schema : subjectOf ? page . # from MusicBrainz
} WHERE {</p>
      <p>SERVICE &lt;https :// erebe -vm2.i3s. unice .fr :8890/ sparql &gt;</p>
      <p>{ ? species a owl: Class ; rdfs : label " Delphinus delphis ". }
OPTIONAL {</p>
      <p>SERVICE SILENT &lt;https :// erebe -vm2.i3s. unice .fr/sparql -ms/
flickr / getPhotosByGroupByTag ? group_id =806927 @N20
&amp; tags = taxonomy : binomial = Delphinus + delphis &gt;
{ ? photo foaf : depiction ?img. }
}
}
}</p>
      <p>}
OPTIONAL {</p>
      <p>SERVICE SILENT &lt;https :// erebe -vm2.i3s. unice .fr/sparql -ms/
macaulaylibrary / getAudioByTaxon ? name = Delphinus + delphis &gt;
{ [] schema : contentUrl ? audioUrl . }
OPTIONAL {</p>
      <p>SERVICE SILENT &lt;https :// erebe -vm2.i3s. unice .fr/sparql -ms/
musicbrainz / getSongByName ? name = Delphinus + delphis &gt;
{ [] schema : sameAs ? page . }</p>
      <sec id="sec-14-1">
        <title>Listing 4: SPARQL query Q enriches the Linked Data representation of taxon Delphinus delphis using SPARQL microservices to retrieve data from Flickr, the Macaulay Library and MusicBrainz.</title>
        <p>mentioned above. Each SPARQL micro-service is invoked within a
dedicated SPARQL SERVICE clause. The micro-service endpoint
URL is built either dynamically and bound to a SPARQL variable as
exemplified in Listing 3, or statically as exemplified in Listing 4.</p>
        <p>
          We used two diferent SPARQL engines to evaluate the test
queries: Corese-KGRAM [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] and Virtuoso OS Edition16. The queries
in Listings 3 and 4 were properly executed on Corese-KGRAM. By
16Virtuoso OS Edition: http://vos.openlinksw.com/owiki/wiki/VOS/
contrast, only queries with static service URLs as in Listing 4 could
be executed on Virtuoso. Indeed, Virtuoso cannot evaluate a
SERVICE clause wherein the service endpoint is given by a variable.
Note that this feature is not in the normative part of the SPARQL
1.1 Federated Query recommendation [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ], although it is part of
the SPARQL 1.1 grammar. Hence, an implementation may choose
to address this feature or not, but the semantics is not formally
defined.
        </p>
        <p>The tests were performed on a Scientific Linux 6.9 server running
on a virtual machine equipped with 16 CPU cores and 48 GB of
RAM. The server hosts a copy of TAXREF-LD’s dataset (9.6 million
triples) on a Virtuoso OS Edition server 7.20. Its SPARQL endpoint
is accessible at URL “https://erebe-vm2.i3s.unice.fr:8890/sparql”.</p>
        <p>The server also hosts the three SPARQL micro-services. They are
accessed at URL “https://erebe-vm2.i3s.unice.fr/sparql-ms/&lt;Web
API&gt;/&lt;service name&gt;”.</p>
      </sec>
    </sec>
    <sec id="sec-15">
      <title>6.2 Test Results</title>
      <p>Query Q, in Listing 4, consists of a CONSTRUCT query form. It
retrieves from TAXREF-LD the URI of the common dolphin species
(Delphinus delphis) that it enriches with 15 photos retrieved from
Flickr, 28 audio recordings from the Macaulay Library, and 1 music
tune from MusicBrainz. Figure 4 portrays a snippet of the response
to this query in the Turtle syntax, along with photos, audio
recordings pictures and a MusicBrainz Web page.</p>
      <p>Table 1 reports the execution time of query Q, averaged over
iffteen runs against the Corese-KGRAM SPARQL engine. Column
“Triples in temp. graph” gives the number of triples generated (i)
by applying the JSON-LD profile to the API response, and (ii) the
optional INSERT query (to spawn the triples that JSON-LD cannot
yield). Column “Triples in resp.” gives the number of triples that
match query Q’s graph pattern. Strikingly, the Web API query
execution is accountable for over 95.6% of the execution time. The
overhead imposed by the SPARQL micro-service consistently ranges
from 16ms to 30ms, accounting for 2% of the total time for Macauley
library’s API to 4.35% for Flickr’s API.</p>
      <p>The evaluation of query Q takes an average 2.93s ± 0.75. Let us
underline that this time is tightly bound to the SPARQL engine’s
evaluation strategy. The Corese-KGRAM engine evaluates each
SERVICE clause sequentially, although they may be evaluated in
parallel since there is no dependency between them. By contrast,
the Virtuoso SPARQL engine seems to adopt a far worse strategy:
not only it invokes the SERVICE clauses sequentially although they
do not show any dependency, but more importantly it invokes each
SERVICE clause once for each solution retrieved from previously
evaluated SERVICE clauses. In our tests, it invoked the Flickr service
28 times, i.e. once for each solution of the Macauley library
microservice, thus entailing a very poor evaluation time. At this point, it
remains unclear whether this is the result of a specific evaluation
strategy or a bug.</p>
      <p>
        The response to query Q (Figure 4) contains URIs generated on
the fly using Flickr’s internal photo identifiers such as
“http://erebevm2.i3s.unice.fr/ld/flickr/photo/31173090936”. When looking them
up, an additional SPARQL micro-service dereferences them to an
RDF document describing the photo. Hence, we have come up with
a consistent set of SPARQL micro-services able to evaluate SPARQL
Abundant literature has been concerned with the integration of
disparate data sources since the early 1990’s [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ]. Classically,
wrappers implement the mediation from the models of multiple data
sources towards a target vocabulary or ontology. A query
federation engine handles a user query, determining which data sources
might have relevant information for the query, deciding on a query
plan and recombining the partial results obtained from the multiple
sources. Our work is concerned with the wrapping of Web APIs
into SPARQL endpoints, but the federation of such wrapped data
sources is out of the scope of this paper. Yet, existing federated
query technologies could be adapted to rewrite parts of a client’s
SPARQL query into SERVICE clauses, thereby querying relevant
SPARQL micro-services as illustrated in Listing 4.
      </p>
      <p>
        In the Semantic Web community, works aiming to translate
heterogeneous data sources into RDF triples started very early17.
In [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] for instance, a triple store contains semantic descriptions that
are used to semantically annotate Web services, explaining how
to invoke them and what kind of information can be obtained by
invoking them.
      </p>
      <p>
        Approaches specifically concerned with Web APIs are often ad
hoc solutions. For instance, Flickcurl18 is a hardwired wrapper for
17See the list hosted on W3C’s Web site: https://www.w3.org/wiki/ConverterToRdf
18http://librdf.org/flickcurl/
Flickr’s Web API services. Twarql [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] wraps Twitter’s Web API to
enable filtering and analysis of streaming tweets. It encodes tweets
content in RDF using common vocabularies and enables SPARQL
querying. Yet, this approach is very specific to the Twitter and
micropost content in general.
      </p>
      <p>
        With a similar rationale, Hydra [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] is a vocabulary aimed to
describe Web APIs in a machine-readable format. It puts a specific
focuses on the generation of hypermedia controls so as to enable the
generation of truly RESTful interfaces. Hydra, used in conjunction
with JSON-LD, forms a basis to build hypermedia-driven Linked
Data interfaces [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. This basis can be harnessed to turn existing
Web APIs into RESTful Linked Data interfaces whose
documentation can be interpreted at run time by a generic Hydra client. Our
incentive with SPARQL micro-services is to provide client
applications with the whole expressiveness of SPARQL, which would
be more dificult to achieve using a Hydra-described REST
interface. This however remains an interesting lead. For instance, the
Triple Pattern Fragment specification [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ] leverages Hydra to
describe hypermedia controls by means of IRI templates containing
triple patterns. In the last section, we suggest the definition of a
Graph Pattern Fragment micro-service that would comply with the
Triple Pattern Fragment hypermedia controls but that would accept
regular graph patterns instead of only triple patterns.
      </p>
      <p>
        SPARQL-Generate [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] extends SPARQL 1.1 to enable querying
RDF graphs along with non-RDF documents. A SPARQL-Generate
query relies on several extension functions to fetch and parse
documents in diferent data formats, and defines the shape of RDF
triples to be produced thenceforward. As such, it could be used
to query a Web API in a way similar to that of a SPARQL
microservice. Two main diferences can be observed though. (i)
SPARQLGenerate is an extension of SPARQL, hence, by definition, it is not
supported by engines strictly complying with the SPARQL
standard. By contrast, our vision is that multiple service providers could
publish independent SPARQL micro-services, thereby building up
an ecosystem of services all complying with standard SPARQL. (ii)
SPARQL-Generate ofers the advantage that querying remote data
sources is performed within a single language. On the one hand,
this only requires skills with Semantic Web technologies. On the
other hand, this entails that a significant part of the whole process
is left to the SPARQL client: querying the data source providing
appropriate arguments, and translating its proprietary vocabulary
into RDF triples aligned on common vocabularies. Consequently,
as illustrated by authors’ examples, the additional syntactic sugar
required can make queries considerably cumbersome and dificult
to maintain. We take a diferent option where this complexity is
hidden from the client and handled by the SPARQL micro-service
developer.
      </p>
      <p>
        An approach very similar to SPARQL-Generate is proposed
in [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. It is based on the BIND_API clause, an extension of the
SPARQL BIND clause, that binds a set of variables with values
extracted from a Web API response. It sufers the same pitfalls as
SPARQL-Generate with respect to our goals: the use of non standard
SPARQL and the cumbersome syntactic sugar left to the SPARQL
client.
      </p>
      <p>
        ODMTP [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ], On-Demand Mapping using Triple Patterns, is an
attempt to query non-RDF datasets as Triple Pattern Fragments.
The authors have implemented a prototype to query Twitter’s Web
API, that can process triple pattern queries over the whole
Twitter’s dataset. Conversely, SPARQL micro-services support arbitrary
SPARQL queries over restricted fragments of the Web API dataset.
Besides, unlike SPARQL micro-services, ODMTP cannot assign
dereferenceable URIs to Web API resources. Nevertheless, ODMTP
ofers the TPF’s paging mechanism that SPARQL micro-services
should regard as a valuable extension within future works (see the
discussion in section 8).
      </p>
      <p>
        Our implementation of SPARQL micro-services maps a Web API
response to RDF triples in two steps: the response is first
translated to JSON-LD, then a SPARQL INSERT or CONSTRUCT query
complements the process for cases where JSON-LD is not
expressive enough. Alternatively, we could rely on a mapping description
language such as RML [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] and xR2RML [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], but they require the
developer to learn the mapping language. By contrast, in our
proposition we strove to rely only on existing standards.
      </p>
      <p>
        Let us finally mention the Apache Marmotta project 19, a
comprehensive Linked Data application framework that implements the
Linked Data Platform W3C recommendation [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ]. Among others,
it provides client modules that wrap the Web APIs of several Web
portals such as Vimeo, Youtube and Facebook. Hence, it should be
relatively easy to implement SPARQL micro-services on top of
Marmotta. However, the examples show that the Web API wrapping
and the mapping towards RDF triples are mostly hard-coded within
the client libraries. Our point is to make the deployment of new
19http://marmotta.apache.org/
SPARQL micro-services as simple as writing a SPARQL query and
a configuration file.
8
      </p>
    </sec>
    <sec id="sec-16">
      <title>CONCLUSION AND PERSPECTIVES</title>
      <p>SPARQL Micro-Services are a lightweight type of Linked Data
Fragment interface that enable combining Linked Data with data
from non-RDF Web APIs. SPARQL querying and URI dereferencing
are supported against a virtual graph delineated by the Web API
service being wrapped, the arguments of this service and the types
of RDF triples that this SPARQL micro-service can spawn.</p>
      <p>Complying with the micro-service architecture principles, a
SPARQL micro-service should typically be loosely coupled,
finegrained (it provides access to a small graph centered on a specific
resource such as a photograph, a tweet or the temperature of a
room) and deployed independently of other services using e.g. light
container technologies. Eventually, an ecosystem of SPARQL
microservices could emerge from independent service providers,
allowing Linked Data-based applications to glean pieces of data from a
wealth of distributed, scalable and reliable services.</p>
      <p>For such an ecosystem to arise however, two crucial issues shall
be tackled. Firstly, to enable services discovery, SPARQL
microservices should provide self-describing metadata such as the
expected query string parameters, or the types of triples generated.
Secondly, although we envision SPARQL micro-services as a way
to access small fragments, it should be possible to retrieve such
fragments by smaller pieces using a paging mechanism.</p>
      <p>
        To tackle those issues, Verborgh et al. advocated that Linked
Data Fragments should provide self-describing, uniform interfaces
consisting of triples, metadata and hypermedia controls.
Hypermedia controls contain the information needed to interact further on
with a resource. In particular, they allow a client to navigate from
one fragment (or a page thereof) to another one [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ]. Triple Pattern
Fragments implement this strategy through the generation of
metadata and control information as RDF triples returned alongside the
triples matching the triple pattern. This solution is efective but it
imposes a restriction: the TPF interface can only return triples (or
quads more generally). By contrast, SPARQL micro-services fully
comply with SPARQL, in which the CONSTRUCT and DESCRIBE
query forms return triples whereas the ASK and SELECT query
forms return solutions formatted as variable bindings. The
dereferenceable URIs dynamically assigned to Web API resources can be
thought of as hypermedia controls. But how to provide additional
metadata or control information within responses to SELECT or
ASK query forms? We can think of two solutions to solve this issue.
Firstly, extend the format of SPARQL query results with additional
specific bindings. A second alternative could be to restrict SPARQL
micro-services to support only CONSTRUCT and DESCRIBE query
forms. This would spawn some sort of Graph Pattern Fragment
interface, i.e. a generalized TPF interface that accepts regular graph
patterns instead of only triple patterns, but still complies with the
TPF metadata and hypermedia controls specification.
      </p>
      <p>Let us finally mention that, in this article, we have focused
specifically on consuming Web APIs data with SPARQL. In a broader
picture, the micro-service principles could be applied to other types
of APIs, so as to enable Semantic Web applications to reach out
to other data sources. Furthermore, many APIs provide read-write
access, empowering users to interact with contents, other users,
etc. Hence, an interesting perspective would be to think of SPARQL
micro-services as a way to support distributed SPARQL Update
over Web APIs, thus eventually contributing to build an actual
read-write Web of Data.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>David</given-names>
            <surname>Beckett</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Tim</given-names>
            <surname>Berners-Lee</surname>
          </string-name>
          ,
          <article-title>Eric Prud'hommeaux, and</article-title>
          <string-name>
            <given-names>Gavin</given-names>
            <surname>Carothers</surname>
          </string-name>
          .
          <year>2014</year>
          .
          <article-title>RDF 1.1 Turtle: Terse RDF Triple Language</article-title>
          .
          <source>W3C Recommendation</source>
          (
          <year>2014</year>
          ). https://www.w3.org/TR/2014/REC-turtle-
          <volume>20140225</volume>
          /
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Carlos</given-names>
            <surname>Buil-Aranda</surname>
          </string-name>
          , Aidan Hogan, Jürgen Umbrich, and
          <string-name>
            <surname>Pierre-Yves Vandenbussche</surname>
          </string-name>
          .
          <year>2013</year>
          .
          <article-title>SPARQL Web-Querying Infrastructure: Ready for Action?</article-title>
          .
          <source>In Proceedings of the 12th International Semantic Web Conference</source>
          . Springer,
          <fpage>277</fpage>
          -
          <lpage>293</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Olivier</given-names>
            <surname>Corby and Catherine Faron</surname>
          </string-name>
          Faron-Zucker.
          <year>2010</year>
          .
          <article-title>The KGRAM Abstract Machine for Knowledge Graph Querying</article-title>
          .
          <source>In Proceedings of the International Conference on Web Intelligence</source>
          and
          <article-title>Intelligent Agent Technology (WI-IAT)</article-title>
          . IEEE,
          <fpage>338</fpage>
          -
          <lpage>341</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>Anastasia</given-names>
            <surname>Dimou</surname>
          </string-name>
          , Miel Vander Sande, Jason Slepicka, Pedro Szekely, Erik Mannens, Craig Knoblock, and Rik Van de Walle.
          <year>2014</year>
          .
          <article-title>Mapping Hierarchical Sources into RDF Using the RML Mapping Language</article-title>
          .
          <source>In Proceedings of the International Conference on Semantic Computing (ICSC)</source>
          . IEEE,
          <fpage>151</fpage>
          -
          <lpage>158</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Nicola</given-names>
            <surname>Dragoni</surname>
          </string-name>
          , Saverio Giallorenzo, Alberto Lluch Lafuente, Manuel Mazzara, Fabrizio Montesi, Ruslan Mustafin, and
          <string-name>
            <given-names>Larisa</given-names>
            <surname>Safina</surname>
          </string-name>
          .
          <year>2017</year>
          .
          <article-title>Microservices: yesterday, today, and tomorrow</article-title>
          .
          <source>In Present and Ulterior Software Engineering</source>
          . Springer,
          <fpage>195</fpage>
          -
          <lpage>216</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Lee</given-names>
            <surname>Feigenbaum</surname>
          </string-name>
          , Gregory Todd Williams, Kendall Grant Clark, and
          <string-name>
            <given-names>Elias</given-names>
            <surname>Torres</surname>
          </string-name>
          .
          <source>2013. SPARQL 1.1 Protocol. W3C Recommendation</source>
          (
          <year>2013</year>
          ). http://www.w3.org/ TR/2013/REC-sparql11
          <string-name>
            <surname>-</surname>
          </string-name>
          protocol-20130321/
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Fabien</surname>
            <given-names>L.</given-names>
          </string-name>
          <string-name>
            <surname>Gandon</surname>
          </string-name>
          and
          <string-name>
            <surname>Norman M. Sadeh</surname>
          </string-name>
          .
          <year>2004</year>
          .
          <article-title>Semantic Web Technologies to Reconcile Privacy and Context Awareness</article-title>
          .
          <source>Journal of Web Semantics</source>
          <volume>1</volume>
          ,
          <issue>3</issue>
          (
          <year>2004</year>
          ),
          <fpage>241</fpage>
          -
          <lpage>260</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Steve</given-names>
            <surname>Harris</surname>
          </string-name>
          and
          <string-name>
            <given-names>Andy</given-names>
            <surname>Seaborne</surname>
          </string-name>
          .
          <year>2013</year>
          .
          <article-title>SPARQL 1.1 Query Language</article-title>
          .
          <source>W3C Recommendation</source>
          (
          <year>2013</year>
          ). http://www.w3.org/TR/2013/REC-sparql11
          <string-name>
            <surname>-</surname>
          </string-name>
          query-20130321/
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Tom</given-names>
            <surname>Heath</surname>
          </string-name>
          and
          <string-name>
            <given-names>Christian</given-names>
            <surname>Bizer</surname>
          </string-name>
          .
          <year>2011</year>
          .
          <article-title>Linked Data: Evolving the Web into a Global Data Space (1st ed</article-title>
          .). Morgan &amp; Claypool.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Bernadette</surname>
            <given-names>Hyland</given-names>
          </string-name>
          , Ghislain Atemezing, and
          <string-name>
            <surname>Boris</surname>
          </string-name>
          Villazón-Terrazas.
          <year>2014</year>
          .
          <article-title>Best Practices for Publishing Linked Data</article-title>
          . W3C Working Group Note (
          <year>2014</year>
          ). https: //www.w3.org/TR/2014/NOTE-ld-bp-
          <volume>20140109</volume>
          /
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Matías</surname>
            <given-names>Jünemann</given-names>
          </string-name>
          , Juan L. Reutter, Adrián Soto, and
          <string-name>
            <given-names>Domagoj</given-names>
            <surname>Vrgoc</surname>
          </string-name>
          .
          <year>2016</year>
          .
          <article-title>Incorporating API Data into SPARQL Query Answers</article-title>
          .
          <source>In Proceedings of the 15th International Semantic Web Conference (Posters and Demos).</source>
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>Johannes</surname>
            <given-names>Koch</given-names>
          </string-name>
          ,
          <article-title>Carlos A Velasco,</article-title>
          and
          <string-name>
            <given-names>Philip</given-names>
            <surname>Ackermann</surname>
          </string-name>
          .
          <year>2017</year>
          .
          <article-title>HTTP Vocabulary in RDF 1.0</article-title>
          .
          <string-name>
            <given-names>W3C</given-names>
            <surname>Recommendation</surname>
          </string-name>
          (
          <year>2017</year>
          ). https://www.w3.org/TR/2017/ NOTE-HTTP-in-RDF10-20170202/
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>Markus</given-names>
            <surname>Lanthaler</surname>
          </string-name>
          .
          <year>2013</year>
          .
          <article-title>Creating 3rd Generation Web APIs with Hydra</article-title>
          .
          <source>In WWW'13 Companion Proceedings of the 22nd International Conference on World Wide Web. ACM</source>
          ,
          <volume>35</volume>
          -
          <fpage>38</fpage>
          . https://doi.org/10.1145/2487788.2487799
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>Markus</given-names>
            <surname>Lanthaler</surname>
          </string-name>
          and
          <string-name>
            <given-names>Christian</given-names>
            <surname>Gütl</surname>
          </string-name>
          .
          <year>2013</year>
          .
          <article-title>Hydra: A Vocabulary for HypermediaDriven Web APIs</article-title>
          .
          <source>In Proceedings of the 6th Workshop on Linked Data on the Web (LDOW2013)</source>
          .
          <article-title>CEUR-WS.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <surname>Maxime</surname>
            <given-names>Lefrançois</given-names>
          </string-name>
          , Antoine Zimmermann, and
          <string-name>
            <given-names>Noorani</given-names>
            <surname>Bakerally</surname>
          </string-name>
          .
          <year>2017</year>
          .
          <article-title>A SPARQL extension for generating RDF from heterogeneous formats</article-title>
          .
          <source>In Proceedings of the 14th Extended Semantic Web Conference (ESWC)</source>
          . Springer,
          <fpage>35</fpage>
          -
          <lpage>50</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <surname>Pablo</surname>
            <given-names>N.</given-names>
          </string-name>
          <string-name>
            <surname>Mendes</surname>
            , Alexandre Passant, and
            <given-names>Pavan</given-names>
          </string-name>
          <string-name>
            <surname>Kapanipathi</surname>
          </string-name>
          .
          <year>2010</year>
          .
          <article-title>Twarql: Tapping into the Wisdom of the Crowd</article-title>
          .
          <source>In Proceedings of the 6th International Conference on Semantic Systems. ACM.</source>
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <surname>Franck</surname>
            <given-names>Michel</given-names>
          </string-name>
          , Loïc Djimenou, Catherine Faron-Zucker, and
          <string-name>
            <given-names>Johan</given-names>
            <surname>Montagnat</surname>
          </string-name>
          .
          <year>2015</year>
          .
          <article-title>Translation of Relational and Non-Relational Databases into RDF with xR2RML</article-title>
          .
          <source>In Proceeding of the 11th international conference on Web Information Systems and Technologies (WebIST)</source>
          .
          <fpage>443</fpage>
          -
          <lpage>454</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Franck</surname>
            <given-names>Michel</given-names>
          </string-name>
          , Catherine Faron-Zucker, and
          <string-name>
            <given-names>Johan</given-names>
            <surname>Montagnat</surname>
          </string-name>
          .
          <year>2016</year>
          .
          <article-title>A Generic Mapping-Based Query Translation from SPARQL to Various Target Database Query Languages</article-title>
          .
          <source>In Proceeding of the 12th International Conference on Web Information Systems and Technologies (WebIST)</source>
          , Vol.
          <volume>2</volume>
          .
          <fpage>147</fpage>
          -
          <lpage>158</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <surname>Franck</surname>
            <given-names>Michel</given-names>
          </string-name>
          , Olivier Gargominy, Sandrine Tercerie, and Catherine FaronZucker.
          <year>2017</year>
          .
          <article-title>A Model to Represent Nomenclatural and Taxonomic Information as Linked Data</article-title>
          .
          <article-title>Application to the French Taxonomic Register, TAXREF</article-title>
          .
          <source>In Proceedings of the 2nd International Workshop on Semantics for Biodiversity (S4BioDiv) co-located with ISWC</source>
          <year>2017</year>
          , Vol.
          <year>1933</year>
          . CEUR.
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <surname>Franck</surname>
            <given-names>Michel</given-names>
          </string-name>
          , Johan Montagnat, and
          <string-name>
            <surname>Catherine</surname>
          </string-name>
          Faron-Zucker.
          <year>2014</year>
          .
          <article-title>A survey of RDB to RDF translation approaches and tools</article-title>
          .
          <source>Research report ISRN I3S/RR 2013-04-FR</source>
          (
          <year>2014</year>
          ). http://hal.archives-ouvertes.fr/hal-00903568
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <surname>Benjamin</surname>
            <given-names>Moreau</given-names>
          </string-name>
          , Patricia Serrano-Alvarado,
          <string-name>
            <given-names>Emmanuel</given-names>
            <surname>Desmontils</surname>
          </string-name>
          , and
          <string-name>
            <given-names>David</given-names>
            <surname>Thoumas</surname>
          </string-name>
          .
          <year>2017</year>
          .
          <article-title>Querying non-RDF Datasets using Triple Patterns</article-title>
          .
          <source>In Proceedings of the 16th International Semantic Web Conference (Posters and Demos).</source>
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <surname>Marie-Laure</surname>
            <given-names>Mugnier</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Marie-Christine Rousset</surname>
            , and
            <given-names>Federico</given-names>
          </string-name>
          <string-name>
            <surname>Ulliana</surname>
          </string-name>
          .
          <year>2016</year>
          .
          <article-title>Ontology-Mediated Queries for NOSQL Databases</article-title>
          .
          <source>In Proceedings of the 30th Conference on Artificial Intelligence (AAAI) .</source>
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>Sam</given-names>
            <surname>Newman</surname>
          </string-name>
          .
          <year>2015</year>
          .
          <string-name>
            <given-names>Building</given-names>
            <surname>Microservices. O'Reilly Media</surname>
          </string-name>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>Eric</given-names>
            <surname>Prud</surname>
          </string-name>
          <article-title>'hommeaux and</article-title>
          <string-name>
            <surname>Carlos</surname>
          </string-name>
          Buil-Aranda.
          <year>2013</year>
          .
          <article-title>SPARQL 1.1 Federated Query</article-title>
          .
          <source>W3C Recommendation</source>
          (
          <year>2013</year>
          ). https://www.w3.org/TR/2013/ REC-sparql11
          <string-name>
            <surname>-</surname>
          </string-name>
          federated-query-
          <volume>20130321</volume>
          /
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <surname>Dimitrios-Emmanuel</surname>
            <given-names>Spanos</given-names>
          </string-name>
          , Periklis Stavrou, and
          <string-name>
            <given-names>Nikolas</given-names>
            <surname>Mitrou</surname>
          </string-name>
          .
          <year>2012</year>
          .
          <article-title>Bringing Relational Databases into the Semantic Web: A Survey</article-title>
          .
          <source>Semantic Web Journal</source>
          <volume>3</volume>
          ,
          <issue>2</issue>
          (
          <year>2012</year>
          ),
          <fpage>169</fpage>
          -
          <lpage>209</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <surname>Steve</surname>
            <given-names>Speicher</given-names>
          </string-name>
          , John Arwe, and
          <string-name>
            <given-names>Ashok</given-names>
            <surname>Malhotra</surname>
          </string-name>
          .
          <year>2015</year>
          .
          <article-title>Linked Data Platform 1.0</article-title>
          .
          <string-name>
            <given-names>W3C</given-names>
            <surname>Recommendation</surname>
          </string-name>
          (
          <year>2015</year>
          ). https://www.w3.org/TR/2015/REC-ldp-
          <volume>20150226</volume>
          /
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <surname>Manu</surname>
            <given-names>Sporny</given-names>
          </string-name>
          , Dave Longly, Gregg Kellog, Markus Lanthaler, and
          <string-name>
            <given-names>Niklas</given-names>
            <surname>Lindström</surname>
          </string-name>
          .
          <year>2014</year>
          .
          <article-title>JSON-LD 1.0. A JSON-based Serialization for Linked Data</article-title>
          .
          <source>W3C Recommendation</source>
          (
          <year>2014</year>
          ). https://www.w3.org/TR/2014/REC-json-ld-
          <volume>20140116</volume>
          /
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <surname>Ruben</surname>
            <given-names>Verborgh</given-names>
          </string-name>
          , Miel Vander Sande, Olaf Hartig, Joachim Van Herwegen, Laurens De Vocht, Ben De Meester, Gerald Haesendonck, and
          <string-name>
            <given-names>Pieter</given-names>
            <surname>Colpaert</surname>
          </string-name>
          .
          <year>2016</year>
          .
          <article-title>Triple Pattern Fragments: a Low-cost Knowledge Graph Interface for the Web</article-title>
          .
          <source>Web Semantics: Science, Services and Agents on the World Wide Web 37-38</source>
          (
          <year>2016</year>
          ),
          <fpage>184</fpage>
          -
          <lpage>206</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <given-names>Gio</given-names>
            <surname>Wiederhold</surname>
          </string-name>
          .
          <year>1992</year>
          .
          <article-title>Mediators in the Architecture of Future Information Systems</article-title>
          .
          <source>IEEE Computer 25, 3 (March</source>
          <year>1992</year>
          ),
          <fpage>38</fpage>
          -
          <lpage>49</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <given-names>Olaf</given-names>
            <surname>Zimmermann</surname>
          </string-name>
          .
          <year>2016</year>
          .
          <article-title>Microservices Tenets: Agile Approach to Service Development and Deployment</article-title>
          .
          <source>Computer Science-Research and Development</source>
          <volume>32</volume>
          ,
          <issue>3</issue>
          (
          <year>2016</year>
          ),
          <fpage>301</fpage>
          -
          <lpage>310</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>