<!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>April</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Programmable Analytics for Linked Open Data</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Bo Hu</string-name>
          <email>bo.hu@uk.fujitsu.com</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Eduarda Mendes</string-name>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Emeric Viel</string-name>
          <email>emeric.viel@jp.fujitsu.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Fujitsu Laboratories Ltd</institution>
          ,
          <addr-line>Kawasaki</addr-line>
          ,
          <country country="JP">Japan</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Fujitsu Laboratories of Europe</institution>
          ,
          <addr-line>Middlesex</addr-line>
          ,
          <country country="UK">UK</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Rodrigues, Fujitsu Laboratories of Europe</institution>
          ,
          <addr-line>Middlesex</addr-line>
          ,
          <country country="UK">UK</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2014</year>
      </pub-date>
      <volume>8</volume>
      <issue>2014</issue>
      <abstract>
        <p>LOD initiative has made a major impact on data provision. Thus far, more than 800 datasets have been published, containing tens of billions of RDF triples. The sheer size of data has not resulted in a signi cant increase of data consumption. We contend that a new programming paradigm is necessary to simplify LOD data utilisation. This paper reports an early phase development towards programmable web of LOD data. We propose to tap into a distributed computing environment underpinning the popular statistical toolkit R. Where possible, native R operators and functions are used in our approach so as to lower the learning curve. The crux of our future work lies in the full implementation and evaluation.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Linked Open Data</kwd>
        <kwd>RDF</kwd>
        <kwd>R</kwd>
        <kwd>Programmability</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. INTRODUCTION</title>
      <p>
        As of mid 2013, totally 870 datasets had been published as
part of the Linked Open Data (LOD) cloud, exposing nearly
62 billion RDF triples in a computer-readable representation
format1. These numbers are still rapidly growing largely
attribute to open governmental data initiatives and \online"
high-throughput scienti c instruments. As greater amounts
of data become available through LOD cloud, the expected
virtuous cycle{more data leading to more consumption and
thus encouraged data publication{has not been clearly
witnessed. On the contrary, it is observed that, in many
occasions, after the initial spark of interest and test applications,
data use at many linked data hosting sites declined signi
cantly [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Some critics believed that the massive amounts of
      </p>
    </sec>
    <sec id="sec-2">
      <title>1.1 Programmability of LOD</title>
      <p>Thus far, data available through LOD Cloud are accessed
primarily using SPARQL. Typically, this is conducted by
submitting query scripts to a SPARQL endpoint and based
on the query results, ltering/joining/aggregating (available
from SPARQL 1.1) candidate results either on the server
side or at the local clients. SPARQL is based on set
algebra. This is both an advantage and a disadvantage. It
resembles the prevailing SQL for RDB. People familiar with
the latter can, therefore, enjoy a fast learning curve when
making the paradigm shift. On the other hand, SPARQL
is mainly a query language and thus does not stand-out for
post-query data processing. In many cases, the results of
SPARQL queries are extracted and converted into the
native data structures of other programming languages (e.g.
Java) for further manipulation.</p>
      <p>
        Equipping and/or enhancing LOD with high
programmability beyond SPARQL has been investigated previously. The
(dis)similarity between RDF as the underlying data
structure of LOD and the general object oriented methodology
inspired ActiveRDF [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], where semantic data are exposed
through a declarative script language. Along the same
direction, RDFReactor [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] packs RDF resources as Java
objects where instances are objects and properties are accessed
through java methods.
      </p>
      <p>Unfortunately, the above integrations have not lowered the
threshold to fully exploring LOD cloud. Among other
reasons, the most prominent ones include the follows. It will be
very di cult for such approaches to deal with missing values
and sparse structures, which abound in uncurated or
automatically produced collections. The size and quality of LOD
cloud lends itself to statistical data analysis. Performing
such analysis using SPARQL queries can become
cumbersome in many cases, requiring recursive SPARQL queries
and multiple join operations. Moreover, neither SPARQL
nor the integrated framework enjoys native support to
matrix operations and solving linear equations, while such
characteristics become increasingly critical in processing large
amounts of data.</p>
      <p>
        R, as a dynamic and functional language, o ers good
capacity to enhance the programmability of LOD and remedy the
shortcoming of existing approaches.
1.2 Why R?
R is a programming language and a software toolkit for data
science. Though not outspoken, R is designed for domain
experts instead of conventional software programmers. It
focuses on transactions that are more familiar to the
former, e.g. organising data, manipulating spreadsheets and
data visualisation. R is open source with over 2,000
packages/libraries for a wide variety of data analytics2. The
most distinctive feature of R is its native support to vector
arithmetics. In addition, versatile graphics and data
visualisation packages as well as easy access to a large number of
specialist machine learning and predictive algorithms make
R a widely adopted computing environment in scienti c
communities (c.f. [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]). R is essentially single threaded. Scaling
R for Big Data analysis can be achieved with RHadoop3. In
this paper, we focus on adapting R for LOD data structure.
Integrating R and LOD has been inspected previously. The
SPARQL R Library [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] aims to expose RDF data and wrap
SPARQL endpoints with a black-box style connector library.
Largely in the same vein, the most recent e ort, rrdf
library [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], allows loading and updating RDF les through
manually crafted RDF-R mapping. The in-memory RDF
models can then be queried using SPARQL. We see the
following issues with SPARQL-based integration. Firstly,
SPARQL queries and the target RDF data sets are not
transparent to R users, making it di cult to validate and
optimise the processes. Arbitrary SPARQL queries can
incur global scans that drastically impede the system
performance. Secondly, R environment loses the regulatory control
over SPARQL queries. Such a blindness subjects the system
to safety and security concerns. Finally, domain experts and
statisticians are required to manually compose the SPARQL
queries. This means learning the fundamentals of RDF and
a new query language.
2http://www.r-project.org. Accessed: January 2014.
3https://github.com/RevolutionAnalytics/RHadoop/wiki
      </p>
    </sec>
    <sec id="sec-3">
      <title>2. PROGRAMMABLE LOD</title>
      <p>LOD Cloud provides a framework to access and navigate
through apparently unrelated data, with conceptual models
capable of explicating hidden knowledge. The logic based
axioms (underpinning RDF) in many cases are not powerful
enough to capture all the regularities in the data. We vision
that a programming language, aiming to utilise and
interact with LOD cloud (the datasets therein), is preferably to
present the following characteristics.</p>
      <p>Native support to LOD data structure. The underlying data
structure of LOD is RDF triples which essentially compose
a directed, labelled graph. SPARQL, the standard RDF
querying language, transforms data into tabular form for
better alignment with the RDB conventions. This extra
formatting layer is not always necessary when the underlying
data structure can be accessed with native graph operators.
Native support to data analysis. Better data accessibility
inherent to LOD presents itself as both an opportunity and
a challenge. With better access, an LOD data consumer is
exposed to data linked in through semantic relations, most
of which he or she may not be aware of. More data is not
always necessarily a merit. In this case, the consumer is likely
to be overwhelmed by data with di erent formats and di
erent semantics, making analysis struggling. A programming
platform capable of dynamically handling di erent format
becomes desirable.</p>
      <p>Ready for distributed processing. Applications accessing LOD
Cloud can easily be exposed to billions of triples,
tantamount to terabyte-grade data transactions. Single machine
and single threaded statistical o erings will nd themselves
struggling in such situations. The programming platform
should o er parallelisation capacity for good scalability.
Inspecting R within the scope of the above requirements, we
can make the following observations. Firstly, R is a
functional language with lazy evaluation, wherein functions are
lifted to become rst class citizen. Also, R has a dynamic
type system. These t well with RDF's idiosyncrasy.
Secondly, R is designed for statistical computing. Missing value
support and sparse matrix handling permeates all R
functions and operations. Finally, though R is single-threaded,
for many machine learning tasks it is possible to distribute
the underlying R data structures and facilitate process
distribution over a layer of data abstraction.</p>
    </sec>
    <sec id="sec-4">
      <title>3. SYSTEM ARCHITECTURE</title>
      <p>The concept of programmable LOD is experimented on the
BigGraph platform, denoted as BGR. BigGraph aims at a
generic distributed graph storage with RESTful interface.
Figure 1 illustrates the main building blocks of BGR. At
the top, there is the user interface. An BGR user programs
using R primaries with dedicated functions that facilitate
the RDF to R data type mapping. BGR programs are
submitted to a master node as the main entry point through
which the user interacts with the system. The runtime at
the master is responsible for the following tasks: 1)
interpreting BGR programs; 2) interacting with the in-memory
graph model for graph transactions; and 3) deciding which
data server/worker it should directly query.</p>
      <p>Program (extended R)</p>
      <p>Master Node</p>
      <p>Graph Model</p>
      <p>R
System
Storage
Driver
... ...</p>
      <p>R
System
Storage</p>
      <p>Driver
N0
... ...</p>
      <p>Nn</p>
      <p>In-memory
Physical
Storage
The runtime on each data server mainly consists of two key
components: R environment and storage driver. Each
local R installation executes statistical analysis directly or
exposes such analytical capacity through the in-memory graph
model. A storage driver is responsible for I/O with the
underlying storage unit.</p>
    </sec>
    <sec id="sec-5">
      <title>3.1 Mapping RDF resources to R variables</title>
      <p>The fundamental data structure for storing data in R is
vector, where a single integer for example is seen as a vector of
length one. Variations and extensions of vector data type
include matrices, arrays and data frames. Though RDF
graphs can be easily stored as adjacency matrices or
adjacency lists, we would opt against a full conversion of LOD
cloud, adding extra computing expenses. Rather, a direct
one-to-one mapping between RDF resources (being classes
and instances) and R variables can provide a seamless and
smooth integration while at the same time ensures the
integrity of the original data. For instance, an RDF instance
becomes an R dataframe consisting of single-element vectors.
Similarly, an RDF class can be assigned to a two
dimensional dataframe with rows corresponding to instances and
columns the properties. Instance values can be loaded
either column wise or row wise depending on the analytical
and performance requirements. In the following example,
column-based initialisation is conducted.</p>
      <p>P1
P2
...
&gt; s &lt;- data.frame(name=av, age=bv, email=cv)
&gt; s
age
5
6
name
foo
john
Note that in this example, a class resource is extensionally
represented by the set of its instances at the snapshot of
data loading.</p>
    </sec>
    <sec id="sec-6">
      <title>3.2 Mapping to the underlying storage</title>
      <p>
        In order to accommodate the sheer size of LOD Cloud and
leverage parallel data loading, a distributed storage is
necessary. We opt for an edge-based storage solution that ts
nicely with the principles of a Key-Value Store (KVS) [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
KVS plays a key role in our approach to scale-out RDF
graphs. RDF triples are, however, not KVS ready. The rst
and foremost step is therefore to de ne the key-value tuples
that a standard KVS can conveniently consume. In BGR,
di erent components of a triple are concatenated together
and encoded as UUID which is then treated as the key while
the value parts of KVS are reserved for other purposes, e.g.
named graph, provenance, and access control.
      </p>
      <p>An RDF triple is indexed three times each. Even though
presenting a replication factor of at least three, our approach is
under the consideration of query performance and fault
recovery. Loading RDF data into R variables is normally
taking the form of localised range queries, xing either the
subject or object of the triples and replacing the rest with
wildcards. For instance graph.find(s; null; null) retrieves all
the triples of a resource while graph.find(null; p; o) presents
an inverse traverse from object o. By replicating triples,
data can be sorted according to not only subjects but also
predicates and objects. This improves query execution.</p>
    </sec>
    <sec id="sec-7">
      <title>3.3 Loading graph</title>
      <p>For performance, LOD datasets are treated in the following
ways. For datasets with RESTful API (e.g. DBpedia), the
RDF resource to R variable mapping can be realised
straightforwardly. Some datasets expose only SPARQL endpoints.
SPARQL queries become necessary with the restriction that
only local scans (e.g. hs; ; i or h ; ; oi) are permitted.
Ideally, results of scan are used to construct local data graph.
In the long run, on-demand data crawling can maintain
local copies of frequently used datasets, helping to ensure data
quality and manage mappings through local data curation.</p>
    </sec>
    <sec id="sec-8">
      <title>3.4 Processing data</title>
      <p>
        R is inherently a single threaded application, though
parallelisation has been implemented using snow and snowfall
packages [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. The use of LOD Cloud falls into the following
categories for which we proposed solutions to achieving good
scalability.
      </p>
      <sec id="sec-8-1">
        <title>3.4.1 Bulky processing</title>
        <p>
          This OLAP-like data processing aims to emerge patterns
(such as hidden semantic relationships and semantic data
clusters) out of data held in LOD Cloud. Such a process
normally is performed on preloaded data and is not time
critical. While a plethora of R packages can be leveraged for data
mining, the main di culty lies in populating R dataframes
with LOD data that can facilitate R functions. By encoding
each RDF resource as one R variable, it is easy to construct
matrices that t with special purposes. For many predictive
machine learning tasks, voting based aggregation (e.g.
bagging [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]) can distribute the overall learning tasks to carefully
sampled subsets of the target datasets. This can be easily
achieved and managed by traversing the graph to the
selected subsects of concept instances.
        </p>
        <p>Example. Given a dataset with patients data, the
following code fragment splits the set of patient instances into 10
subsets4. Traversal with named vertices and edges can be
carried out along both inbound and outbound directions.
Here, we assume the entire set of patient instances will be
loaded into memory. Alternatively, a partial loading can be
executed to lower the demand for computing resources and
latency. In the following example, edges of patient resource
is indexed. Sampling is conducted against the index. Only
selected instances are loaded.
1: patient_v &lt;- graph_get_vertex("Patient")
2: patient_size &lt;- graph_get_edge_count(patient_v,
edge="rdf:type")
3: patient_index &lt;- graph_edge_index(patient_v,
edge="rdf:type")
4: n &lt;- c(1:patient_size)
5: ns &lt;- sample(n, size/10)
6: for (i in ns) {
7: ins&lt;-graph_traverse(patient_v,edge=index[i])
8: saveRDS(ins, file="...")
9: }
The following code fragment intends to construct a
randomforest-based prognosis model (line 11) for a certain disease
based on a patient's gender and age. The patient data are
loaded with a graph traverse transaction over the given
patient instance vertices and the given outgoing edges (line
36, where wildcard indicates all the outgoing edges). Missing
values are set to a default one (i.e. age = 75) for simplicity
(line 9).
1: p_partition&lt;-readRDS(file="...")
2: patients &lt;- data.frame()
3: for(i in p_partition) {
4: p_data &lt;- graph_traverse(vertex=i, out_edge="*");
5: patients &lt;-rbind(patients, p_data)
6: }
7: size &lt;- length(patients)
8: training_set &lt;- data.frame(
age=patients$has_age,
gender=patients$has_gender, ...)
9: training_set$age[is.na(training_set$age)] &lt;- 75
10: labels &lt;- as.factor(patients$status);
11: rfp &lt;- randomForest(training_set, labels)
In this example, we assume that the patient data partitions
are passed using data le residing on the disk (line 1). This
is for illustrative purposes only and does not exclude shared
memory or message passing based solutions.</p>
      </sec>
      <sec id="sec-8-2">
        <title>3.4.2 Incremental processing</title>
        <p>OLTP-like realtime data processing is supported through an
event-driven mechanism that applies classi ers (obtained as
4Based on the literature, bagging should take a fraction
between 1/2 to 1/50 depending on the size of the sample data.
in the previous section) to data in an incremental fashion.
This incremental characteristic is two-fold. Firstly, the
system should detect the di erence between existing classi ed
data and inputs so as to isolate the changes and restrain
reclassi cation only against the di erences. Secondly, the
system should update only those classi ers whose input data
have changed since the most recent retraining. BGR
accommodates both requirements through distributed logging
of graph structural changes and localised event propagation
observing graph structures. For instance,
\OutEdgeCreatedEvent " is issued by the storage listener if an edge is
inserted. This event instance carries information such as the
edge (in triple form) and on which vertex (vs) this edge is
created. Events propagate along paths that originate from
vs to avoid global scans. As a result, a ected classi ers along
the propagation routes are scheduled for update. Note that
some machine learning algorithms can be easily adapted to
ful ll the requirements (c.f. random forest [?]).</p>
        <p>Versioning resources. An RDF resource normally consists
of multiple triples jointly stating the constrains on the
resource. Therefore, the event-driven incremental processing,
which only has visibility of individual triples, requires a
mechanism to obtain complete statements of the resource.
We use versioning to ensure consistency when data are
classi ed and when classi ers are retrained. Version information
is stored at the value part of the key-value tuples and version
updates are treated as atomic operations.</p>
        <p>Multiple threads. Multi-threaded R is not likely to be
available in the near future. As spawning threads is not possible,
BGR runs multiple processes communicating through socket.
For instance, one R process listens to the underlying storage
driver for fetching graph structural events through a
dedicate socket address. The events are then parsed to extract
event types, triples that raise the events, and versions of the
triples. Other R processes handle the events and dispatch
them for further actions when necessary, again by writing
to a socket address. Socket-based communication may not
provide ideal performance; in many cases it becomes the
main bottle neck of performance. It, however, o ers the
most cost-e ective solution to increase parallelism without
dismantling R.</p>
      </sec>
    </sec>
    <sec id="sec-9">
      <title>3.5 Resource local processors</title>
      <p>We advocate and practice a declarative and resource-centric
approach in BGR. More speci cally, expected analytics are
constructed at the resource level and are associated with
the target resource through RDF property declarations. For
instance the following RDF triples assign an R random-forest
classi er (de ned in section 3.4.1) to a resource (i.e. the
\Patient" class).
:Patient a owl:Class ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:onProperty :has_behaviour ;
owl:someValuesFrom
[ a owl:Class ;
owl:oneOf (:new_patient_behaviour</p>
      <p>:update_patient_behaviour)]].
...
:new_patient_behaviour
a :Behaviour , owl:NamedIndividual ;</p>
      <p>This essentially de nes how a resource (e.g. Patient) reacts
to (or behaves against) events (e.g. onNewInstanceAsserted
event), realised using the attached process (e.g. R:rfp). At
the ontology class level, enumeration (owl:oneOf) is used
to establish conceptual relationship between the Patient
class and the desired functionalities w.r.t. the
corresponding events. The actual implementation of behaviour
instances can be realised, for example, in R. Depending on
the size of the compiled code, the implementation can be
stored either entirely at the value part of the KV tuple
of h:new_patient_behaviour, :has_handler, "R:rft"i or
separately with a pointer from the value part of the tuple.
When a new patient instance is asserted, an event is raised
which will trigger the embedded R function to react to such
a change in the storage.</p>
      <p>Several advantages are evident by assigning behaviour and
storing its implementation close to a resource. Firstly, for
a distributed data storage, this implies a close proximity of
data and process localities. Secondly, behaviour enhances
the reactive programming principle by packing small
process units against very speci c data units. Thirdly, data
behaviours and their implementations are conceptualised with
well-formed RDFS constructs. This facilitates ontological
inferences when necessary, though with caveats: i) increased
inference complexity and ii) anonymous resources
complicating RDF query handling.</p>
    </sec>
    <sec id="sec-10">
      <title>4. PRELIMINARY RESULTS</title>
      <p>BGR is still under development. This section reports the
system design that has been considered so far and lists out
potential future work.</p>
      <p>The underlying graph storage is a distributed KVS based on
HBase. HBase also handles data partition, locality,
replication and fault tolerance. Jena graph introduces the
necessary abstraction layer for indexing and retrieving triples in
the KVS. A simple graph programming interface is
responsible for graph traversal and scan operations. It follows the
Tinkerpop Blueprint convention5 and currently talks to Jena
graph so as to construct resource subgraph from the edge
based storage data structure. The use of Jena is mainly for
the convenience of leveraging Jena models when in-memory
ontology inference becomes necessary. In the future, direct
communication between storage and graph API is expected
to improve the overall system performance. This is at the
price of reduced ontological inference capacity.</p>
      <p>
        Both storage and graph modules are implemented in Java.
R communicates with the storage driver through an R-Java
interfacing library, rJava package [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. Calling Java methods
are straightforward as illustrated in the following example:
1: .jinit()
2: # do something before loading the graph
3: g.obj&lt;- .jnew("Graph")
4: # do something else
5: graph.find &lt;- function(x, y) {
We intend to minimise the e ort of extending R, i.e.
avoiding introducing compiled R packages. This is under mainly
practical considerations. It lowers the learning curves for
people already familiar with R, as basically no extra
operators need to learn. Also, it increases the visibility of data
management with respect to the underlying data structure.
      </p>
    </sec>
    <sec id="sec-11">
      <title>5. CONCLUSIONS</title>
      <p>This paper calls for user-friendly and programmable LOD
by leveraging and enhancing R, a free software toolkit for
statistical computing and graphics.</p>
      <p>Note that there are a few R packages (e.g. bigmemoRy) that
aims in particular at Big Data computing. There are also R
packages (e.g. foreach, ff, etc.) for strengthening R
parallelism. Our proposal is not to compete with such existing
solutions but to advocate a collaboration of two
independent e orts and provide solutions that t the visions and
requirements of linked data paradigm.</p>
      <p>We also do not see competition with the RESTful movement,
such as Linked Data Platform (LDP, [?]) which already
gained momentum in the LOD community. LDP works at a
layer lower than the proposed LOD/R integration, assisting
data exposure so that the data can be consumed by the BGR
functions and operators.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>E.</given-names>
            <surname>Bauer</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Kohavi</surname>
          </string-name>
          .
          <article-title>An empirical comparison of voting classi cation algorithms: Bagging, boosting, and variants</article-title>
          .
          <source>Machine Learning</source>
          ,
          <volume>36</volume>
          (
          <issue>1-2</issue>
          ):
          <volume>105</volume>
          {
          <fpage>139</fpage>
          ,
          <year>July 1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>B.</given-names>
            <surname>Everitt</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.</given-names>
            <surname>Hothorn</surname>
          </string-name>
          .
          <article-title>A handbook of statistical analyses using R</article-title>
          . CRC Press, Boca Raton, Fla,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>N. C.</given-names>
            <surname>Helbig</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. M.</given-names>
            <surname>Cresswell</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Burke</surname>
          </string-name>
          , and L.
          <string-name>
            <surname>Luna-Reyes</surname>
          </string-name>
          .
          <article-title>The dynamics of opening government data</article-title>
          .
          <source>Technical report, Nov</source>
          .
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>A.</given-names>
            <surname>Lakshman</surname>
          </string-name>
          and
          <string-name>
            <given-names>P.</given-names>
            <surname>Malik</surname>
          </string-name>
          .
          <article-title>Cassandra: a decentralized structured storage system</article-title>
          .
          <source>SIGOPS Oper. Syst. Rev.</source>
          ,
          <volume>44</volume>
          (
          <issue>2</issue>
          ):
          <volume>35</volume>
          {
          <fpage>40</fpage>
          ,
          <string-name>
            <surname>Apr</surname>
          </string-name>
          .
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>E.</given-names>
            <surname>Oren</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Heitmann</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Decker</surname>
          </string-name>
          . Activerdf:
          <article-title>Embedding semantic web data into object-oriented languages</article-title>
          .
          <source>Web Semant</source>
          .,
          <volume>6</volume>
          (
          <issue>3</issue>
          ):
          <volume>191</volume>
          {
          <fpage>202</fpage>
          ,
          <string-name>
            <surname>Sept</surname>
          </string-name>
          .
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>L.</given-names>
            <surname>Tierney</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. J.</given-names>
            <surname>Rossini</surname>
          </string-name>
          , and
          <string-name>
            <given-names>N.</given-names>
            <surname>Li</surname>
          </string-name>
          .
          <article-title>Snow : A parallel computing framework for the r system</article-title>
          .
          <source>International Journal of Parallel Programming</source>
          ,
          <volume>37</volume>
          (
          <issue>1</issue>
          ):
          <volume>78</volume>
          {
          <fpage>90</fpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>S.</given-names>
            <surname>Urbanek</surname>
          </string-name>
          . rJava:
          <string-name>
            <surname>Low-Level</surname>
            <given-names>R</given-names>
          </string-name>
          to Java Interface,
          <year>2009</year>
          .
          <source>R package version 0</source>
          .8-
          <fpage>1</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <surname>W. R. van Hage</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.</given-names>
            <surname>Kauppinen. SPARQL package for</surname>
          </string-name>
          <string-name>
            <surname>R</surname>
          </string-name>
          ,
          <year>2011</year>
          . available at http: //linkedscience.org/tools/sparql
          <article-title>-package-for-r.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Vo</surname>
          </string-name>
          <article-title>lkel. Rdfreactor { from ontologies to programatic data access</article-title>
          .
          <source>In Proc. of the Jena User Conference</source>
          <year>2006</year>
          . HP Bristol, May
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>E.</given-names>
            <surname>Willighagen</surname>
          </string-name>
          .
          <article-title>Accessing biological data with semantic web technologies</article-title>
          . http://dx.doi.org/10.7287/peerj.preprints.185v1,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>