<!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>
      <journal-title-group>
        <journal-title>March</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>RESTful writable APIs for the web of Linked Data using relational storage solutions</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Antonio Garrote</string-name>
          <email>agarrote@usal.es</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>María N. Moreno García</string-name>
          <email>mnmg@usal.es</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Universidad de Salamanca</institution>
          ,
          <country country="ES">Spain</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2011</year>
      </pub-date>
      <volume>29</volume>
      <issue>2011</issue>
      <abstract>
        <p>Linked Data is rapidly becoming an important mechanism to expose structured data in the web. The ability to inter-link data sets from different providers using standard description vocabularies and the same data model, opens new possibilities in the way these data can be used. Despite of its growth, Linked Data principles have not found yet widespread application in the design of data APIs for web applications. The lack of a write support for linked data repositories, the barrier imposed by the required technological change and the immature state of client and server semantic infrastructure are some of the main causes for this lack of adoption. This paper introduces a possible alternative for building writable web APIs according to Linked Data principles, using the already deployed technology stack present in most web applications. We propose the use of R2RML to lift relational data into the RDF model as well as to map SQL manipulation data queries into SPARQL update queries. Additionally a RDF vocabulary describing a RESTful interface for the mapped data that can be easily consumed from web clients is proposed. The combination of both aspects allows web developers to offer a familiar web API compatible with linked data APIs that can be deployed along with the already existing interface.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Categories and Subject Descriptors</title>
      <p>H.3.5 [Online Information Services]: Web-based
services; D.2.12 [Interoperability]: Data mapping</p>
    </sec>
    <sec id="sec-2">
      <title>1. INTRODUCTION</title>
      <p>
        The Linked Data initiative (LD) [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] is making the
semantic web a reality for the mainstream web developer.
Despite of its success, and the increasing volume of Linked
Data available in the web, the incipient use of LD in many
web applications is restricted to a static repository of data
that is queried or crawled as needed. The use of LD as the
main API for today’s web 2.0 applications is not a viable
alternative yet. A quick search in a popular repository of web
      </p>
      <p>
        APIs 1 shows only 34 RDF enabled APIs in contrast with
more than 1000 JSON interfaces. One of the main causes
of this situation is that the web of data, in its present form,
only supports a read interface. Other causes range from the
complexity introduced by the RDF data model and the lack
of support for semantic technologies like SPARQL in
common web application clients like web browsers and
smartphone SDKs, to the insufficient performance and scalability
concerns of key semantic web infrastructure components like
triple stores. [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ]
      </p>
      <p>
        Most of Web 2.0 application’s APIs are built on a
technological stack that typically comprises the following elements:
• a persistence layer backed by a relational database
management system (RDBMS) or a mixture of a RDBMS
and some kind of NoSQL technology.
• a mapping framework exposing the relational model as
a set of more or less compliant RESTful web services.
• Plain JSON objects as the most prominent
serialization format for application data.
• A security and access control framework based on
mechanisms like API keys and the OAuth protocol [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
      </p>
      <p>
        To make possible the transition from this model for
building web APIs to a LD enabled one, technological options
that make easy the building of LD APIs must be available
for the web developer. One important step in this direction
is the R2RML: RDB to RDF Mapping Language (R2RML)
[
        <xref ref-type="bibr" rid="ref22">22</xref>
        ] W3C’s recommendation working draft. R2RML consists
of a generic vocabulary that can be used to map a relational
schema into RDF triples.
      </p>
      <p>In this paper we will use the R2RML specification as a
starting point to build a mechanism capable of automating
the transformation of the relational persistence layer in a
Web 2.0 API, into an API compliant with the LD principles,
that can be offered as an alternative by a service provider.</p>
      <p>
        The main contributions of this paper can be summarized
as follows:
• It describes a generic translation of SPARQL 1.1
Update [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] queries into SQL queries over a relational
schema, provided a R2RML mapping for that schema.
1http://www.programmableweb.com/
• It introduces a common RESTful [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] interface for LD
enabled web APIs that transforms HTTP request into
SPARQL queries.
• We collect a light vocabulary for the declarative
description of APIs suitable for being automated as a
software library.
      </p>
      <p>
        Different approaches for the translation of SPARQL
Update queries into SQL data manipulation operations have
recently been proposed. ONTOACCESS [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] introduces a
translation mechanism based in its own mapping language
R3M. The transformation algorithm maps whole tables and
columns into classes and properties in a certain ontology.
This approach simplifies the translation of SPARQL queries
since there is a direct relationship between any valid triple
and a single table in the database schema. Another recent
translation mechanism is described in [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] as an extension to
the D2RQ 2 mapping language called D2RQ++ introducing
support for mapping blank nodes and dealing with database
constraints in the insertion and deletion of triples. D2RQ++
also proposes the use of an external RDF triple store to
deal with triples in conflict with the database schema. Main
differences between ONTOACCESS, D2RQ++ and our
approach are the consequence of the different characteristics
of the mapping languages used. These differences also
impose constraints on the kind of RDF graphs that can be
stored in the underlying relational system. R2RML allows
to map variable columns in the relational schema that can
store any kind of URI or literal directly into the database.
This makes possible to describe mappings capable of
storing any possible triple in a RDF graph relational database
without requiring an auxiliary triple store without requiring
an external storage solution as proposed by the authors of
DRQ++. The drawback of these flexibility is that situations
where a triple of quad pattern can be inserted in more than
one mapped must be addressed in the construction of the
translation mechanism. R2RML also includes support for
named graphs in the mapping language. We add support
for this feature in our proposed solution that will be used
extensively to expose subsets of the RDF triples stored in
the database as RESTful resources.
      </p>
      <p>This paper is organized in two main sections. In the first
one, the SPARQL to SQL translation using R2RML is
described. In the second part, a RESTful API for read-write
LD APIs, a vocabulary for the description of these APIs
and the operational details of the transformation of HTTP
requests into SPARQL queries according to this API are
introduced. The combination of both parts can be used to
build LD APIs using present day relational technologies.</p>
      <p>A prototype implementation of the described SPARQL
mapping mechanism for R2RML as well as an executable
implementation of the API are currently being developed.
They can be found at 3.</p>
    </sec>
    <sec id="sec-3">
      <title>2. SPARQL 1.1 OPERATIONS OVER RELA</title>
    </sec>
    <sec id="sec-4">
      <title>TIONAL DATA</title>
      <p>W3C’s R2RML proposal consists of a generic vocabulary
that can be used to map a certain relational schema into
2http://www4.wiwiss.fu-berlin.de/bizer/d2rq/
3https://github.com/antoniogarrote/clj-r2rml
RDF triples. A formal description of a simplified R2RML
mapping is shown in listing 1 as an EBNF grammar.
&lt;R2RMLMapping&gt; ::= { &lt;TableMapping&gt; } ;
&lt;TableMapping&gt; ::= ( t a b l e : String ,
&lt;s u b j e c t : TermMapping&gt;,
&lt;graph : TermMapping&gt;,
&lt;propertyObj :{ TripleMapping }&gt;) ;
&lt;TripleMapping&gt; ::= { (&lt;property : TermMapping&gt;,
&lt;column : TermMapping&gt;,
[ r r : datatype ] ,
[ r r : laguage ] ) } ;
&lt;TermMapping&gt; ::= &lt;VariableMapper&gt; | &lt;ConstantMapper&gt; ;
&lt;ConstantMapper&gt; ::=
r r : property | r r : constantValue
| r r : columnGraphIRI ;
&lt;VariableMapper&gt; ::= | r rr r: p:croolpuemrtnyGCroalpuhmn; | r r : column</p>
      <sec id="sec-4-1">
        <title>Listing 1: R2RML mapping</title>
        <p>This model formalizes a R2RML mapping as a collection
of TableMappings for each RDBMS mapped table. Each
TableMapping describes how the data stored in that table
can be transformed into RDF quads with subject, predicate,
object and an associated named graph. The components
of a quad are generated using a TermMapping defined in
the TableMapping. Each TermMapping can be constant or
variable. Constants TermMappings point to an URI or RDF
literal for the value of the quad component while variable
TermMappings refer to a column in the relational schema
where the value for the quad component can be retrieved.</p>
        <p>
          W3C’s SPARQL 1.1 Update proposal [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ] describes a
standard query language to retrieve and modify RDF graphs
with a syntax similar to that of SQL. The main construct
of SPARQL queries are quad patterns that can be matched
against triples stored in RDF graphs. Listing 2 formalizes
the notion of triple pattern stored in a named graph as a
QuadPattern with variable and constant components.
&lt;QuadPattern&gt; ::= (&lt; s u b j e c t : Term&gt;,
&lt;property : Term&gt;,
&lt;o b j e c t : Term&gt;,
&lt;graph : Term&gt;) ;
&lt;Term&gt; ::= &lt;VariableTerm&gt; | &lt;ConstantTerm &gt;;
&lt;ConstantTerm&gt; ::= URI | RDF L i t e r a l ;
&lt;VariableTerm&gt; ::= {?a , $a , ?b , $b . . . } ;
        </p>
      </sec>
      <sec id="sec-4-2">
        <title>Listing 2: Quad patterns</title>
        <p>R2RML describes a transformation from the relational
model into the RDF model. In order to use R2RML
mappings to build a generic transformation mechanism for SPARQL
1.1 Update operations over a RDF graph into SQL
operations over an equivalent relational model, we need a way to
find the inverse transformation for a R2RML mapping as
shown in figure 1.</p>
        <p>Listing 1 describes such an algorithm that expresses the
inverse transformation as a set of QuadMatchers generated
from a set of R2RML TripleMappers.</p>
        <p>The output of the function buildQuadMatchers consists of
a collection of QuadMatchers: tuples describing a pattern
that can be used to map a RDF compatible QuadPattern to
a RDBMS relation. The listing 2 describes a procedure to
check if a QuadPattern is compatible with a QuadMatcher.
The constant NULL value is used to identify matchers and
patterns in the default graph.</p>
        <p>To allow the manipulation of triples through a
RESTful HTTP interface, it is necessary to find SPARQL 1.1
queries compatible with the semantics of the HTTP
uniform interface methods. SELECT, INSERT DATA, and










DELETE SPARQL 1.1 operations will be used to map the
GET, POST, PUT and DELETE operations of the HTTP
methods.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>2.1 SPARQL SELECT operation</title>
      <p>
        The transformation of SPARQL SELECT queries into
efficient SQL queries has been an active research topic in the
last years. A relational algebra for SPARQL has been
proposed [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], and different translation mechanisms have been
defined [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ].
      </p>
      <p>
        Our approach is based on [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. This translation schema
uses two functions α and β, capable of retrieving the
table and the column where the component of any RDF triple
pattern is stored in the database. The transformation
mechanism imposes the restriction that this table must be unique
for every triple pattern in a SPARQL SELECT query.
Nevertheless, this assumption cannot be taken for granted for a
generic R2RML mapping.
      </p>
      <p>In listing 3 a couple of procedures describing an algorithm
for translating an arbitrary QuadPattern into a SQL
SELECT query using a collection of QuadMatchers are
introduced. This algorithm takes as input a triple pattern for
a certain RDF graph in a SPARQL select query, parsed as
a QuadPattern and a R2RML mapping transformed into a
collection of QuadMatchers, and outputs a SQL SELECT
query composed of the UNION of different SQL SELECT
sub-queries for each QuadMatcher compatible with the
QuadPattern. If no QuadMatcher is compatible with the pattern,
the algorithm returns a failure. Projections and conditions
for SQL queries can be built checking the variable
components of the pattern and the matcher.</p>
      <p>Algorithm 3 Composition of a SELECT query for a quad
pattern and a set of quad matchers
Function: select
Input: quad : QuadP attern, matchers : QuadMatcher
Output: SQL query or F AIL
Begin
compatibleMatchers ← mapCompatibleQuadMatchers(quad, matchers)
query ← F AIL
if compatibleMatchers = ∅ then
subselects ← mapSubselects(quad, compatibleMatchers)
query ← join(”UNION”, subselects)
end if
return query
Function: mapSubselects
Input: quad : QuadP attern, matchers : QuadMatcher
Output: SQL subquery
Begin
subselects ← {}
for matcher in matchers do
table ← matcher.table
projections ← genP rojections(quad, matcher)
conditions ← genConditions(quad, matcher)
sql = ”SELECT DIST INCT ” + join(”, ”, projections) + ”F ROM” +
table
if conditions = ∅ then</p>
      <p>sql + ”W HERE” + join(”, ”, conditions)
end if
subselects ∪ sql
end for
return subselects</p>
      <p>
        The output of this algorithm can be inserted in [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]
algorithm to build SQL queries for complex SPARQL queries
involving AND, OPT, UNION and FILTER constructs.
      </p>
    </sec>
    <sec id="sec-6">
      <title>2.2 SPARQL 1.1 Update INSERT DATA operation</title>
      <p>SPARQL 1.1 Update INSERT operations have the form
shown in listing 3. INSERT queries can be directly
transformed into a collection of QuadPatterns where all the
components have a constant value.
GRAPH &lt;g r a p h u r i &gt;
{ t r i p l e s }
}
Listing 3: SPARQL 1.1 Update INSERT operation</p>
      <p>Insertion of QuadPatterns for an INSERT query and R2RML
mapping, requires to find the collection of QuadMatchers
compatible with each QuadPattern. Many different
QuadMatchers can be compatible with each pattern, making
possible the insertion of the triple in different tables of the data
base. It is also possible that there exists in the database
columns with NULL values that can be updated instead of
inserting new rows.</p>
      <p>Listing 4 shows an algorithm that can be used to insert
triples into a data base, creating or updating table rows
according to the information of a R2RML mapping.
Algorithm 4 Generation of an insertion query for a quad
pattern and a set of quad matchers
Function: insert
Input: quads : QuadP attern, matchers : QuadMatcher
Output: SQL DML query or F AIL
Begin
sortedQuads ← sortBySubject(quads)
contexts ← initialContext(quads)
for quad in sortedQuads do
compMatchers ← mapCompatibleQuadMatchers(quad, matchers)
if compMatchers = ∅ then</p>
      <p>return F AIL
end if
contexts ← nextLevel(quad, compMatchers, contexts)
contexts ← minSchemaContexts(contexts )
end for
sql ← generateInsertionSQL(first(contexts))
return sql</p>
      <p>The algorithm works building a tree of possible ways of
inserting the triples in the database, and selecting the
terminal node that minimizes a cost metric.</p>
      <p>The function initialContexts queries the database and
retrieves all the existing rows with the same subject as the
quads to be inserted. The resulting compatible rows are
stored as the only context structure in the contexts list,
becoming the root node of a contexts tree. Then main loop
of the algorithm retrieves all the QuadMatchers
compatible with the next quad to be inserted and generates a new
level of contexts. Each generated context in the list of
contexts represents a possible way of inserting the quad in the
database consistent with a compatible QuadMatcher. The
function nextLevel tries to update the existing rows to be
inserted with the values for the columns resulting of applying
a compatible QuadMatcher to the QuadPattern to insert. If
no row of the context can be updated, for example, because
the existing row already inserts or updates the column with
a different value, a new row marked to be inserted, is added
to the context containing the new columns.</p>
      <p>The function minSchemaContexts trims the contexts that
do not minimize the cost function shown in listing 5. This
metric uses the number of rows and columns inserted in
the database as factors. It grants that triples are inserted
into tables where rows with the same subject are stored in
the same row if possible. This feature is important if the
RDBMS tables are also used by an object-relational
mapping framework storing each object in a single row of the
database.</p>
      <p>Finally the function generateInsertionSQL just translates
the first of the equivalent minimum contexts into a series of
INSERT or UPDATE operations over the RDBMS.</p>
      <p>The figure 2 shows graphically the insertion of two quads
in the default graph using the R2RML mapping in the listing
Algorithm 5 Insertion cost metric
Function: insertionCost
Input: context : SchemaUpdateContext
Output: cost : integer
Begin
columns ← 0
for rowMatch in context do</p>
      <p>columns ← columns + count(rowMatch.columns)
end for
return ((1 + count(context.rows)) ∗ columns)
</p>
      <p>






4 for two relations test1(id,a,b) and test2(s,p,o).
@ p r e f i x l d a : &lt;http : / / r e s t f u l l i n k e d d a t a a p i . org#&gt; .
: maping1 r r : t a b l e ” t e s t 1 ” ;
r r : subjectMap [ r r : column ” i d ” ] ;
r r : propertyObjectMap [ r r : p r o p e r t y &lt;t e s t : a&gt; ;
r r : column ”a ” ;
r r : columnGraphIRI &lt;t e s t &gt; ] ;
r r : propertyObjectMap [ r r : p r o p e r t y &lt;t e s t : b&gt; ;
r r : column ”b ” ;
r r : columnGraphIRI &lt;t e s t &gt; ] .
: maping2 r r : t a b l e ” t e s t 2 ” ;
r r : subjectMap [ r r : column ”s ” ] ;
r r : propertyObjectMap [ r r : propertyColumn ”p ” ;
r r : column ”o ” ;
r r : columnGraphIRI &lt;t e s t &gt; ] .</p>
      <sec id="sec-6-1">
        <title>Listing 4: Example R2RML mapping</title>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>2.3 SPARQL DELETE operation</title>
      <p>SPARQL 1.1 Update DELETE operations have the form
shown in listing 5. DELETE operations can also be directly
transformed into a set of SQL operations. As a first step, the
WHERE clause of the query must be executed as a SELECT
operation, and the retrieved bindings applied to the modify
template of the DELETE query so they can be transformed
into a collection of QuadPatterns.</p>
      <p>DGERLEATPHE &lt;{ g r a p h u r i &gt;
{ . . modify template . . }
W}HERE
{GRAPH &lt;g r a p h u r i &gt;
{ . . p a t t e r n . . }
}
Listing 5: SPARQL 1.1 Update INSERT operation</p>
      <p>Algorithm 6 removes the compatible quads stored in a
RDBMS according to a SPARQL 1.1 Update DELETE
operation and a R2RML mapping. The algorithm updates the
columns for RDF properties and objects with NULL value
instead of removing the whole triple, since the subject
column can be shared by other triples stored in the same row.
After removing all the triples, the function
removeEmptyRows delete all the rows in the tables of the mapping where
all the property and object columns have a NULL value.</p>
    </sec>
    <sec id="sec-8">
      <title>Limitations and additional extensions</title>
      <p>The described mechanism has omitted important features
of RDF that can be added to the simplified version presented
in this section. Some of the features include:
• RDF data types or literals
• Mapping of URIs to table index values.
• Blank nodes</p>
      <p>
        RDF data types can be easily added to the mapping
algorithm using the translation of SQL data types into XML
Schema data types provided by the A Direct Mapping of
Relational Data to RDF [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] W3C’s working draft. Using
this translation, the function that checks the compatibility
between typed QuadPatterns and typed QuadMatchers can
also check if the type for the column matches the type of the
pattern component. Both structures can also be extended
adding support for an optional language in the positions of
subject, predicate or object and adding additional checks in
the compatibility function
      </p>
      <p>The problem of mapping URIs in triples to their final
value in a relational table can be solved extending R2RML
with a new predicate rr:URIMappingExpression similar to
rr:inverseExpression. This new property will introduce a
transformation for the value of the URI into the suitable
SQL value, that can be used into SPARQL operations.</p>
      <p>Support of blank nodes has been proved to be
problematic when the column storing the blank node is marked as
AUTO INCREMENT. In these cases, the solution found
involves the generation of a pseudo-unique integer value that
is assigned to the newly created blank node identifier.</p>
      <p>Another important limitation of the proposed mapping is
that it can only be used with updatable tables. The original
read-only scope of R2RML makes easy to translate tuple
values into URIs using a logical table consisting of a
complex SQL query as the starting point of the mapping. This is
not possible when supporting modifications in the tables and
mechanisms like the proposed rr:URIMappingExpression
property must be used to transform URIs into the final values to
be stored in table rows.
3.</p>
    </sec>
    <sec id="sec-9">
      <title>DECLARATIVE MAPPING OF RDF GRAPHS</title>
    </sec>
    <sec id="sec-10">
      <title>AS RESTFUL SERVICES</title>
      <p>The previous section of this document has described a
mechanism to manage RDF graphs stored in a relational
database using SPARQL queries built using a R2RML
mapping. In this section we will introduce a RDFS vocabulary
describing a RESTful API, aligned with the principles of the
LD initiative, that can be used to access a RDF graph by
any client software supporting the HTTP protocol.</p>
      <p>In the same way that R2RML describes a mapping from
the relational model into the RDF model, the proposed API
vocabulary describes a mapping from a set of HTTP
requests to the SPARQL query language.</p>
      <p>
        The described interface must meet certain requirements:
• It must be a viable alternative for present day web
applications, exposing new capabilities in a familiar way
for web developers not used to semantic web
technologies.
• It must be compliant with REST architectural
principles [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] as well as with Linked Data recommendations
[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
• It must support not only the retrieval of data but also
the creation, update and destruction of resources.
• It must reuse existing work and vocabularies in the
area of Linked Data APIs where possible.
3.1
      </p>
    </sec>
    <sec id="sec-11">
      <title>API alternatives for the web of LD</title>
      <p>There are currently different proposals to describe
interfaces allowing access to RDF graphs for web clients. A
possible categorization of these APIs could be:
• SPARQL endpoints
• RDF over HTTP
• Entity Attribute Value (EAV) mappings over</p>
      <p>HTTP</p>
      <p>SPARQL endpoints offer a very general interface to access
RDF graphs using the expressivity power of the SPARQL
query language. The SPARQL protocol for RDF W3C
recommendation standardized a SOAP based protocol to access
such an endpoint. Despite of its genericity, SPARQL
endpoints and the SPARQL protocol for RDF violates some of
the constraints imposed by the Linked Data and REST
architectural styles, for example, the non dereferenceability of
the URIs stored in the graph. The use of SPARQL
endpoints also imposes important requirements on the clients
accessing the service. They must deal with the building of
SPARQL queries, the creation of the correct SOAP requests
and the parsing of RDF/XML responses.</p>
      <p>
        The exchange of RDF graphs using the HTTP protocol
according to the REST architecture is another alternative
to build a HTTP interface for RDF graphs. In this case, the
central abstraction is the named graph (NG) [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. The RDF
dataset stored in a service is partitioned into several graphs
identified by an URI and this URI is exposed as a HTTP
accessible resource. HTTP methods are mapped to SPARQL
1.1/Update operations creating, editing, retrieving and
destroying NGs. the SPARQL 1.1 Uniform HTTP Protocol for
Managing RDF graphs W3C’s recommendation [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ] or the
Pubby frontend [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] are examples of such interfaces. This
kind of APIs are compatible with REST and Linked Data
principles but support less expressive queries over the RDF
graph. From the client point of view, using this kind of APIs
requires the support of the RDF data model and some of the
RDF serialization formats provided by the service (Turtle,
N3, RDF/XML, JSON).
      </p>
      <p>
        A simpler kind of HTTP interfaces for RDF graphs
consists of EAV mappings for RDF graphs that are exchanged
using the HTTP protocol. In this kind of APIs, the server
hides the RDF data model mapping sets of triples sharing
the same subject as pairs of key-values objects. These
objects are encoded in HTTP requests parameters and they are
returned in HTTP responses, using serialization formats like
JSON objects with plain attribute names. Examples of this
kind of APIs are the Linked Data API Proposal (LD-API)
[
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and RDF backed versions of the Open Data Protocol
API [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. EAV interfaces are compliant with REST
principles and they have a familiar interface for most web
developers. They usually introduce ad-hoc mechanisms to deal with
practical web development issues like the pagination of
resources in collections. On the other hand, they present some
problems from the Linked Data perspective like the use of
hidden URIs in objects attributes, what could prevent the
effective linking among services.
      </p>
      <p>
        The API and the description vocabulary we are going to
introduce are based on the exchange of RDF graphs using
the HTTP protocol according to the SPARQL 1.1 Uniform
HTTP Protocol for Managing RDF graphs W3C’s draft
recommendation. Using this protocol, information resources in
the service can be described as triples stored in a named
graph that can be exposed through the service API. This
level of granularity is equivalent to the one that can be found
in most RESTful APIs [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ]. Additionally, we will introduce
some convenient features commonly found in EAVs APIs,
like the LD-API proposal, to facilitate the use of the API
by restricted web clients.
      </p>
    </sec>
    <sec id="sec-12">
      <title>3.2 Declaration of linked resources</title>
      <p>Listing 10 contains a RDF graph encoded using the
Turtle syntax that describes a couple of resources: a collection
of blogs and each blog. These resources expose using the
HTTP protocol the relational data stored in the BLOGS
SQL table accessed using the R2RML mapping shown in
the same listing.
@prefix t e s t b l o g : &lt;http : / / example . org / blog#&gt; .
@prefix lda : &lt;http : / / r e s t f u l l i n k e d d a t a a p i . org#&gt; .
@prefix api : &lt;http : / / purl . org / linked −data / api / vocab#&gt; .
@prefix r r : &lt;http : / /www. w3 . org / ns / r2rml#&gt; .
@prefix s i o c t : &lt;http : / / r d f s . org / s i o c / types#&gt; .
@prefix dc : &lt;http : / / purl . org /dc/ elements /1.1/&gt; .
@prefix dcterms : &lt;http : / / purl . org /dc/ terms/&gt; .
@prefix xsd : &lt;http : / /www. w3 . org /2001/XMLSchema#&gt;.
t e s t b l o g :
a lda : API ;
lda : exposes t e s t b l o g : blogs , t e s t b l o g : blog .
• api:uriTemplate Designates a dereferenceable URI
indentifying a set of Named graphs that can be addressed
using the mapped HTTP operations. The property is
reused from the LD-API specification, as well as the
semantics for validating an URI against an URI
template.
• lda:endpoint a SPARQL endpoint capable of
processing the SPARQL Update query generated by the
mapping of the HTTP method. Two main kinds of
endpoints are valid: a list of R2RML triplesMap that are
interpreted as a collection of patterns in a SPARQL
query according to the first part of this paper or a
void:sparqlEndpoint an external endpoint supporting
the SPARQL 1.1 Uniform HTTP Protocol for
Managing RDF graphs protocol.
• lda:has operation contains the collection of HTTP
operations that will be valid on the named graph being
exposed as a resource. lda:GET, lda:PUT, lda:POST,
and lda:DELETE are supported. These operations
are interpreted according to the SPARQL 1.1 Uniform
HTTP Protocol for Managing RDF graphs protocol.
• lda:named graph creation mechanism describes how new
named graphs are created in the service endpoint. The
mechanism must specify an URI template for the new
NG and what parts of the URI template for the named
graph will be generated. Two generation mechanisms
are supported lda:UniqueIdInt, lda:UUID. The first one
generates a new unique integer, and the second one an
UUID.</p>
      <p>The proposed language for mapping resources to SPARQL
endpoints makes possible to associate the same R2RML
mapping to different named graphs. This can be achieved
using the lda:hasR2RMLGraph property in the declaration of
R2RMLSparqlEndpoints. If the rr:table-graph-ri property
is specified, the R2RML mapping is augmented with that
property and the resolved URI template for that resource.
On the other hand, if the rr:column-graph property and the
name of a column are used, the mapped value of that
column will be matched against the URI of the resource in
the generated SPARQL query. This feature can be used to
restrict the results of the generated queries or to link the
triples stored in different relational tables with foreign keys
and expose them as a single RESTful resource.</p>
      <p>INSERT DATA
{ GRAPH &lt;graph uri &gt; { . . RDF payload . . }
}
Listing 8: SPARQL query for a HTTP POST
operation</p>
      <p>where graph uri is minted using the mapping information
associated to the api:uriTemplate, and lda:mapped uri parts
properties.
3.3</p>
      <p>Software implementations supporting the description of
resources using the previous vocabulary must accept HTTP
requests and process them following three main stages:</p>
      <p>The semantics of the SPARQL query to be build for each
HTTP method matches the semantics described in the SPARQL
1.1 Uniform HTTP Protocol for Managing RDF graphs
protocol draft.
3.3.1</p>
      <sec id="sec-12-1">
        <title>GET requests</title>
        <p>GET requests retrieve the whole graph associated to the
resource using the SPARQL query
CONSTRUCT { ? s ?p ?o }
WHERE
{ GRAPH &lt;graph uri &gt; { ? s ?p ?o }
}
Listing 7: SPARQL query for a HTTP GET
operation</p>
        <p>as specified in the SPARQL 1.1 Uniform HTTP Protocol
for Managing RDF graphs protocol.</p>
        <p>This query can be executed in a RDBMS with a R2RML
mapping, building a SELECT SPARQL query and returning
the retrieved variable bindings as the triples of the RDF
graph to return.</p>
        <p>Support for pagination is provided via two special HTTP
request parameters pageSize and page. The meaning of
these parameters is equivalent to the one specified in the
LD-API proposal. They are translated into values for the
LIMIT and OFFSET clauses of the constructed SPARQL
query. If these parameters are present the SPARQL query
is also modified to be sorted by subject using the ORDER
BY ?s SPARQL clause.
3.3.2</p>
      </sec>
      <sec id="sec-12-2">
        <title>POST requests</title>
        <p>POST requests create a new named graph in the
associated SPARQL endpoint, inserting into that graph the RDF
triples encoded in the HTTP request.</p>
        <p>The SPARQL 1.1 Update query constructed according to
the the SPARQL 1.1 Uniform HTTP Protocol for Managing
RDF graphs protocol has the form</p>
        <p>
          A distinction must be made between the named graph
created to store the triples of the resource and the resource
itself. The generated URI for the named graph must be
deferencable as it is an information resource whose
representation can be retrieved by the clients requesting a
certain representation. On the other hand, the subject of the
knowledge being encoded as an RDF graph is a non
information resource that should not be directly dereferenced.
The authority to create this new URI for the resource
belongs to the provider of the service API [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]. The use of a
blank node allows the client to provide a description of the
resource without knowing in advance the URI that will be
introduced by the server.
        </p>
        <p>If the RDF payload of the HTTP request contains triples
with subjects consisting of non blank node identifiers, the
API implementation must return a 403 forbidden error
response.</p>
        <p>If the creation of the named graph is successful, the API
implementation must return a 201 created response code
with the location header pointing the URI of the newly
created named graph according to the SPARQL 1.1 Uniform
HTTP Protocol for Managing RDF graphs draft.
3.3.3</p>
      </sec>
      <sec id="sec-12-3">
        <title>PUT requests</title>
        <p>PUT HTTP requests are handled by the API
implementation specification as a request to replace the knowledge
associated to a named graph by knew knowledge encoded as a
RDF graph. According to the SPARQL 1.1 Uniform HTTP
Protocol for Managing RDF graphs protocol, the
implementation must translate the HTTP request into a SPARQL
request of the form
}.</p>
        <p>DROP SILENT GRAPH &lt;graph uri &gt;;
INSERT DATA {</p>
        <p>GRAPH &lt;graph uri &gt; { . . RDF payload . . }
Listing 9: SPARQL query for a HTTP PUT
operation</p>
        <p>This query can be executed using the mapping of SPARQL
INSERT DATA query for a R2RML mapping discussed in
the previous section. The DROP SPARQL query can be
executed using a DELETE query with a pattern matching
any triple in the graph. The deletion of all the triples in
the graph will also imply the deletion of the graph and the
failure of any posterior query against the same graph.</p>
        <p>The RDF payload of the HTTP request must contain only
RDF triples with the URI of the underlying resource,
matching the pattern graph uri#self and blank node IDs. The
request must fail with a 403 forbidden response code
otherwise.
3.3.4</p>
      </sec>
      <sec id="sec-12-4">
        <title>DELETE requests</title>
        <p>DELETE HTTP requests are interpreted by the API
implementation as requesting the deletion of the named graph
and all the contained triples. The generated SPARQL query
according to the SPARQL 1.1 Uniform HTTP Protocol for
Managing RDF graphs protocol is
DROP GRAPH &lt;graph uri &gt;.</p>
        <p>Listing 10: SPARQL query for a HTTP PUT
operation</p>
        <p>This operation can be implemented using the DELETE
operation discussed in the previous section using a pattern
that matches any triples in the named graph.
3.3.5</p>
      </sec>
      <sec id="sec-12-5">
        <title>JSON support in requests and responses</title>
        <p>JSON is the data format of choice for most of today’s Web
2.0. In order to provide an useful interface for web
developers, it is important to offer a JSON encoding of RDF graphs
in requests and responses that can be used with the same
easiness as in common entity-attribute-value JSON objects
but, at the same time, can be transformed into a valid RDF
graph.</p>
        <p>
          JSON-LD [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ] provides such a representation. Using a
feature named type-coercion, RDF graphs can be encoded
as plain javascript objects with an additional nested object
containing the mapping from keys and values to RDF
properties, URIs and literals.
        </p>
        <p>Any HTTP request and response requesting a JSON
media type for the encoding of the request payload or returned
representation, must use type coerced JSON-LD as the
exchange format.
3.3.6</p>
      </sec>
      <sec id="sec-12-6">
        <title>Results formatting</title>
        <p>After obtaining a successful response from the SPARQL
endpoint the API implementation must return the retrieved
knowledge to the client using the media type representation
agreed using the content negotiation mechanism built into
the HTTP protocol.</p>
        <p>The media types specified in the LD-API specification
must be accepted by any implementation of this API.</p>
        <p>The API implementation must also accept a number of
common parameters that can be passed to the API
implementation to make the protocol more useful for restricted
HTTP clients like web browser javascript applications.
• callback parameter can be passed as a request
parameter forcing the server to return a JSON-LD encoded
representation of the resulting RDF graph passed as
the single argument in the invocation of the javascript
function passed as value of the parameter. This
technique known as JSONP allows javascript applications
being executed inside a browser to bypass the single
domain restriction imposed by the browser.
• format specifies a format for the requested
representation. The parameter takes precedence over the value
of the Accept HTTP header.
4.</p>
      </sec>
    </sec>
    <sec id="sec-13">
      <title>CONCLUSIONS AND FUTURE WORK</title>
      <p>In this paper we have attempted to describe a possible
technical solution for the problem of building writable LD
APIs that can be adopted by present day web developers
using the standard technological stack deployed in today’s
web applications. Special attention has been paid to
offering an interface suitable for common web APIs clients like
javascript web applications and smartphones.</p>
      <p>The state of the current implementation relies on several
technologies and standards in an immature state. SPARQL
1.1 Update, SPARQL 1.1, the SPARQL 1.1 Uniform HTTP
Protocol for Managing RDF graphs, LD-JSON and R2RML
are still recommendation drafts susceptible of change. The
solution here proposed must consequently be adapted to the
changes in these proposals. Additional work needs to be
done to improve the performance of the mapping of SPARQL
queries using R2RML. Proper benchmarking against triple
stores and equivalent relational solutions need to be carried
on to ensure that the translation mechanism is a viable
solution.</p>
      <p>
        The problem of exposing APIs with closed world
semantics, adding some kind validation mechanism in the creation
of resources in the API is also an important research task,
that is required for the proposed API to be suitable in many
common use cases. The generation of machine processable
descriptions of LD APIs using vocabularies like voID [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ] is
also an important feature that LD APIs must address.
      </p>
      <p>Technological solutions like the presented in this paper
can play an important role in the transition from Web 2.0
APIs towards LD compliant APIs. The use of a
technological stack already deployed and the declarative nature of
the solution can lower the entry barrier for many web
developers, for example, it makes possible to offer both kind of
APIs in the same application. On the other hand, the use of
a well defined interface that can be used with different kind
of SPARQL end points, makes possible the future
substitution of a relational backend mapped using R2RML by some
technology specialized in the manipulation of RDF graphs.</p>
      <p>
        Nevertheless, the factor that can push the adoption of LD
style APIs is the added value new web applications taking
advantage of the use of shared vocabularies and the
capacity of linking resources in one API with other resources can
bring to application users. Related work in authentication
schemes for the web of data like WebID [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] and access
privileges is also required to make possible the interaction of
users with resources across different linked APIs.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <article-title>[1] Linked data, connect distributed data across the web</article-title>
          . http://linkeddata.org/.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <article-title>[2] Linking open data, w3c sweo community project</article-title>
          . http://www.w3.org/wiki/SweoIG/TaskForces/ CommunityProjects/LinkingOpenData.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          <article-title>[3] linked-data-api: Api and formats to simplify use of linked data by web-developers</article-title>
          ,
          <year>December 2010</year>
          . http://code.google.com/p/linked-dataapi/wiki/Specification.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <article-title>[4] Webid w3c´s space</article-title>
          ,
          <year>January 2011</year>
          . http://www.w3.org/wiki/WebID.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Tim</given-names>
            <surname>Berners-Lee</surname>
          </string-name>
          .
          <article-title>Linked data</article-title>
          ,
          <year>July 2006</year>
          . http://www.w3.org/DesignIssues/LinkedData.html.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <surname>Jeremy</surname>
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Carroll</surname>
            , Christian Bizer, Pat Hayes, and
            <given-names>Patrick</given-names>
          </string-name>
          <string-name>
            <surname>Stickler</surname>
          </string-name>
          .
          <article-title>Named graphs, provenance and trust</article-title>
          .
          <source>In Proceedings of the 14th international conference on World Wide Web, WWW '05</source>
          , pages
          <fpage>613</fpage>
          -
          <lpage>622</lpage>
          , New York, NY, USA,
          <year>2005</year>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Artem</given-names>
            <surname>Chebotko</surname>
          </string-name>
          , Shiyong Lu, and
          <string-name>
            <given-names>Farshad</given-names>
            <surname>Fotouhi</surname>
          </string-name>
          .
          <article-title>Semantics preserving sparql-to-sql translation</article-title>
          .
          <source>Data Knowl. Eng.</source>
          ,
          <volume>68</volume>
          :
          <fpage>973</fpage>
          -
          <lpage>1000</lpage>
          ,
          <year>October 2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Richard</given-names>
            <surname>Cyganiak</surname>
          </string-name>
          .
          <source>A relational algebra for SPARQL</source>
          .
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Brendan</given-names>
            <surname>Elliott</surname>
          </string-name>
          , En Cheng, Chimezie Thomas-Ogbuji, and
          <string-name>
            <given-names>Z. Meral</given-names>
            <surname>Ozsoyoglu</surname>
          </string-name>
          .
          <article-title>A complete translation from sparql into efficient sql</article-title>
          .
          <source>In Proceedings of the 2009 International Database Engineering</source>
          <volume>&amp;</volume>
          #38;
          <string-name>
            <surname>Applications</surname>
            <given-names>Symposium</given-names>
          </string-name>
          , IDEAS '
          <volume>09</volume>
          , pages
          <fpage>31</fpage>
          -
          <lpage>42</lpage>
          , New York, NY, USA,
          <year>2009</year>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Roy</surname>
            <given-names>T.</given-names>
          </string-name>
          <string-name>
            <surname>Fielding</surname>
          </string-name>
          .
          <article-title>Architectural Styles and the Design of Network-based Software Architectures</article-title>
          .
          <source>PhD thesis</source>
          , University of California, Irvine,
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>E.</given-names>
            <surname>Hammer-Lahav</surname>
          </string-name>
          .
          <source>The oauth 1.0 protocol. RFC 5849</source>
          ,
          <year>April 2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>Matthias</surname>
            <given-names>Hert</given-names>
          </string-name>
          , Gerald Reif, and
          <string-name>
            <surname>Harald</surname>
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Gall</surname>
          </string-name>
          .
          <article-title>Updating relational data via sparql/update</article-title>
          .
          <source>In Proceedings of the 2010 EDBT/ICDT Workshops, EDBT '10</source>
          , pages
          <fpage>24</fpage>
          :
          <fpage>1</fpage>
          -
          <lpage>24</lpage>
          :
          <fpage>8</fpage>
          , New York, NY, USA,
          <year>2010</year>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>Ian</given-names>
            <surname>Jacobs</surname>
          </string-name>
          .
          <article-title>Architecture of the world wide web, volume one (uri ownership)</article-title>
          .
          <source>Technical report</source>
          ,
          <year>2004</year>
          . http://www.w3.org/TR/webarch/#uri-ownership.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <surname>Jing</surname>
            <given-names>Lu</given-names>
          </string-name>
          , Feng Cao, Li Ma, Yong Yu, and
          <string-name>
            <given-names>Yue</given-names>
            <surname>Pan</surname>
          </string-name>
          .
          <article-title>An effective sparql support over relational databases</article-title>
          .
          <source>In Vassilis Christophides</source>
          , Martine Collard, and Claudio Gutierrez, editors,
          <source>Semantic Web, Ontologies and Databases</source>
          , volume
          <volume>5005</volume>
          of Lecture Notes in Computer Science, pages
          <fpage>57</fpage>
          -
          <lpage>76</lpage>
          . Springer Berlin / Heidelberg,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Juan</given-names>
            <surname>Sequeda Marcelo Arenas</surname>
          </string-name>
          ,
          <article-title>Eric Prud'hommeaux. A direct mapping of relational data to rdf. W3C working draft</article-title>
          ,
          <source>W3C</source>
          ,
          <year>November 2010</year>
          . http://www.w3.org/TR/rdb-direct-mapping/.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>Manu</given-names>
            <surname>Sporny Mark Birbeck</surname>
          </string-name>
          .
          <article-title>Json-ld - linked data expression in json</article-title>
          .
          <source>Technical report</source>
          ,
          <year>2011</year>
          . http://json-ld.org/.
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>Chimezie</given-names>
            <surname>Ogbuji</surname>
          </string-name>
          .
          <article-title>Sparql 1.1 uniform http protocol for managing rdf graphs</article-title>
          .
          <source>W3C working draft, W3C</source>
          ,
          <year>October 2010</year>
          . http://www.w3.org/TR/sparql11-http
          <string-name>
            <surname>-</surname>
          </string-name>
          rdf
          <source>-update/.</source>
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Sunitha</surname>
            <given-names>Ramanujam</given-names>
          </string-name>
          , Vaibhav Khadilkar, Latifur Khan, Steven Seida, Murat Kantarcioglu, and
          <string-name>
            <given-names>Bhavani</given-names>
            <surname>Thuraisingham</surname>
          </string-name>
          .
          <article-title>Bi-directional translation of relational data into virtual rdf stores</article-title>
          .
          <source>In Proceedings of the 2010 IEEE Fourth International Conference on Semantic Computing, ICSC '10</source>
          , pages
          <fpage>268</fpage>
          -
          <lpage>276</lpage>
          , Washington, DC, USA,
          <year>2010</year>
          . IEEE Computer Society.
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>Microsoft</given-names>
            <surname>Research</surname>
          </string-name>
          .
          <article-title>Open data protocol</article-title>
          . http://www.odata.org/developers/protocols/overview.
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20] Chris Bizer Richard Cyganiak. Pubby:
          <article-title>A linked data frontend for sparql endpoints</article-title>
          ,
          <year>June 2007</year>
          . http://www4.wiwiss.fu-berlin.de/pubby/.
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>Michael</given-names>
            <surname>Hausenblas</surname>
          </string-name>
          et alt. Richard Cyganiak.
          <article-title>Describing linked datasets with the void vocabulary</article-title>
          .
          <source>Technical report, W3C</source>
          ,
          <year>2010</year>
          . http://www.w3.org/2001/sw/interest/void/.
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>Seema</given-names>
            <surname>Sundara Richard Cyganiak and Souripriya Das</surname>
          </string-name>
          .
          <article-title>R2rml: Rdb to rdf mapping language</article-title>
          .
          <source>W3C working draft, W3C</source>
          ,
          <year>October 2010</year>
          . http://www.w3.org/TR/r2rml/.
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>Alexandre</given-names>
            <surname>Passant Simon Schenk</surname>
          </string-name>
          ,
          <source>Paul Gaeron. Sparql 1.1 update. W3C working draft, W3C</source>
          ,
          <year>October 2010</year>
          . http://www.w3.org/TR/sparql11-update/.
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <fpage>W3C</fpage>
          .
          <article-title>Large triple stores report</article-title>
          . http://www.w3.org/wiki/LargeTripleStores.
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>Erik</given-names>
            <surname>Wilde</surname>
          </string-name>
          and
          <string-name>
            <given-names>Michael</given-names>
            <surname>Hausenblas</surname>
          </string-name>
          .
          <article-title>Restful sparql? you name it!: aligning sparql with rest and resource orientation</article-title>
          .
          <source>In Proceedings of the 4th Workshop on Emerging Web Services Technology, WEWST '09</source>
          , pages
          <fpage>39</fpage>
          -
          <lpage>43</lpage>
          , New York, NY, USA,
          <year>2009</year>
          . ACM.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>