<!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>NeoEMF: a Multi-database Model Persistence Framework for Very Large Models</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Gwendal Daniel</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Gerson Sunye´</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Amine Benelallam</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Massimo Tisi</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Yoann Vernageau</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Abel G o´mez</string-name>
          <email>abel.gomez@unizar.es</email>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jordi Cabot</string-name>
          <email>jordi.cabot@icrea.cat</email>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>AtlanMod Team Inria, Mines Nantes &amp; Lina ffirst name.last</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Departamento de Informtica e Ingeniera de Sistemas Universidad de Zaragoza</institution>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Internet Interdisciplinary Institute Universitat Oberta de Catalunya</institution>
        </aff>
      </contrib-group>
      <abstract>
        <p>The growing use of Model Driven Engineering (MDE) techniques in industry has emphasized scalability of existing model persistence solutions as a major issue. Specifically, there is a need to store, query, and transform very large models in an efficient way. Several persistence solutions based on relational and NoSQL databases have been proposed to achieve scalability. However, existing solutions often rely on a single data store, which suits a specific modeling activity, but may not be optimized for other use cases. In this article we present NEOEMF, a multi-database model persistence framework able to store very large models in key-value stores, graph databases, and wide column databases. We introduce NEOEMF core features, and present the different data stores and their applications. NEOEMF is open source and available online.</p>
      </abstract>
      <kwd-group>
        <kwd>Model Persistence</kwd>
        <kwd>Scalability</kwd>
        <kwd>Large Models</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        With the progressive adoption of MDE techniques in industry [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], existing model
persistence solutions have to address scalability issues to store, query, and transform large
and complex models [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. Indeed, existing modeling frameworks were first designed to
handle simple modeling activities, and often rely on XMI-based serialization to store
models. While this format is a good fit for small models, it has shown clear limitations
when scaling to large ones [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
      </p>
      <p>
        To overcome these limitations, several persistence frameworks based on relational
and NoSQL databases have been proposed [
        <xref ref-type="bibr" rid="ref11 ref5 ref7">5, 7, 11</xref>
        ]. They rely on a lazy-loading
mechanism, which reduce memory consumption by loading only accessed objects. These
solutions have proven their efficiency compared to state-of-the-art tools, but they are
often tailored to a specific data-store implementation.
      </p>
      <p>In these approaches, the choice of the datastore is totally decoupled from the
expected model usage (for example complex querying, interactive editing, or complex
model-to-model transformation): the persistence layer offers generic scalability
improvements, but is not optimized for a specific scenario. For example, a graph-based
representation of a model can improve scalability by offering a lazy-loading
mechanism, but will have poor execution time performance in scenarios involving repeated
atomic value accesses.</p>
      <p>Our previous work on model persistence have shown that providing a well-suited
data store for a specific modeling scenario can dramatically improve performance.
Based on this observation, we present in this article NEOEMF, a scalable model
persistence framework based on a modular architecture enabling model storage into
multiple data stores. Currently, NEOEMF provides three implementations-map, graph, and
column–each one optimized for a specific usage scenario. NEOEMF provides two APIs,
one strictly compatible to the Eclipse Modeling Framework (EMF) API, easing its
integration into existing modeling tools, and an advanced API that provides specific
features that bypass the standard EMF API to further improve scalability of particular
modeling scenarios.</p>
      <p>The rest of the paper is organized as follows: Section 2 presents an overview of the
NEOEMF architecture, Section 3 and 4 present the core features of the framework and
the different datastores. Section 5 provides insights on the framework’s implementation,
and finally Section 6 summarizes the key points of the paper and presents our future
work. Note that examples of NEOEMF usages are provided on NEOEMF’s wiki5 and
in a demonstration video available online at https://youtu.be/_OyWpcOMOfA.
It highlights NEOEMF’s core features such as model import, API usage, and the lazy
model editor which allows to navigate interactively large models with a low memory
footprint. The demonstration also present a concrete use case by showing the different
steps needed to integrate NEOEMF into an existing EMF-based application, and use it
to store and query models containing several million of elements. Finally, the
demonstration presents an overview of two tools developed on top of NEOEMF: the Mogwa¨ı
query framework and ATL-MR, a distributed version of the ATL transformation engine.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Architecture Overview</title>
      <sec id="sec-2-1">
        <title>5 https://github.com/atlanmod/NeoEMF/wiki</title>
        <p>“Standard”
Modeling User
“Advanced” User
&amp; Developer</p>
        <p>Model-Based Tools</p>
        <p>EMF
/Graph</p>
        <p>NeoEMF Core</p>
        <p>/Map /Column
Blueprints MapDB</p>
        <p>HBase/
ZooKeeper</p>
        <p>Persistence API
Caching</p>
        <p>Backend API</p>
        <p>Once the core component has received the modeling operation to perform, it
forwards the operation to the appropriate database driver (Map, Graph , or Column),
which is in charge of handling the low-level representation of the model. These
connectors translate modeling operations into Backend API calls, store the results, and reify
database records into EMF EObjects when needed. NEOEMF also embeds a set of
default caching strategies that are used to improve performance of client applications, and
can be configured transparently at the EMF API level.</p>
        <p>In addition to this transparent integration into existing EMF applications, NEOEMF
provides a specific API, which targets advanced users / high-performance applications.
This API provides utility methods which overcome EMF limitations, allow fine-grained
tuning of the databases, and access to internal caches. By using this API, NEOEMF can
be tuned to improve execution time and/or scalability of a specific modeling scenario.</p>
        <p>To provide this smooth integration into the EMF infrastructure, the NEOEMF core
component redefines the behavior of several EMF classes. For instance, each NEOEMF
driver defines a specific implementation of PersistenceBackendFactory that
is responsible of the concrete data store creation. This factory creates an instance of
the data store that corresponds to the Resource options. Once the data store has been
created, the driver instantiates a specific implementation of the EStore interface–also
depending on the Resource options–that translates the delegated method calls into
datastore specific API calls. This architecture allows to change the underlying data store
by simply updating the Resource options. The EStore also returns
PersistentEObject from the database when needed, using a specific reification mechanism.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Software Features</title>
      <p>As introduced in the previous Section, NEOEMF provides two API levels: one for a
standard use of existing EMF applications / APIs, and one advanced that allows to
bypass EMF’s limitations, tune internal data stores, and configure caches. In this Section
we present first the standard features, available simply by plugging NEOEMF into an
existing application, then we introduce its advanced features.
3.1</p>
      <sec id="sec-3-1">
        <title>Standard Features</title>
        <p>An important characteristic of NEOEMF is its compliance with the EMF API. All
classes/interfaces extending existing EMF ones strictly define all their methods, and we put
a special attention to ensure that calling a NEOEMF method produces the same
behavior (including possible side effects) as standard EMF API calls. As a result, existing
applications can integrate NEOEMF with a very small amount of efforts and
benefit immediately from NEOEMF scalability improvements. Existing code manipulating
regular EMF EObjects does not have to be modified, and will behave as expected.</p>
        <p>Specifically, NEOEMF supports the following EMF features:
– Code generation: NEOEMF provides a dedicated code generator that
transparently extends the EMF one, and allows client applications to manipulate models
using generated java classes.
– Reflexive/Dynamic API: reflexive and dynamic EMF methods (eSet, eGet,
eUnset, eDynamicGet, eDynamicSet ...) can be used on NEOEMF
objects, and behave as their standard implementations.
– Resource API: NEOEMF also implements the resource specific API, such as
getContents, getAllContents, save, and load. In addition, NEOEMF takes
advantage of the flexible save and load options to enable backend-specific
customizations.</p>
        <p>
          As other model persistence solutions [
          <xref ref-type="bibr" rid="ref11 ref5">5, 11</xref>
          ], NEOEMF achieves scalability using
a lazy-loading mechanism, which loads into memory objects only when they are
accessed, overcoming XMI’s limitations. Lazy-loading is defined at the core component:
NEOEMF implementation of EObject consists of a simple wrapper delegating all its
method calls to an EStore, that directly manipulates elements at the database level.
Using this technique, NEOEMF benefits from datastore optimizations (such as caches),
and only maintains a small amount of elements in memory (the ones that have not been
saved), reducing drastically the memory consumption of modeling applications.
3.2
        </p>
      </sec>
      <sec id="sec-3-2">
        <title>Advanced Features</title>
        <p>
          In addition to its compliance with the EMF API, NEOEMF provides specific utility
features to tackle EMF’s limitations, such as the List&lt;EObject&gt; allInstances(EClass eClass) method,
which is accessible through the PersistentResource interface. This feature
tackles the problem of allInstances computation in EMF [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ] by delegating it to the data
store, allowing to retrieve requested element fastly, using data store indexes, or specific
data representation.
        </p>
        <p>NEOEMF also includes an io module, providing a scalable Model Importer, that
consists of an event-based XMI parser that bypasses the EMF API to efficiently store the
model in a dedicated database with a low memory footprint. The importer is designed
to be generic and can be implemented in each backend component. We also plan to
add an efficient Model Exporter module that would allow to produce optimized model
serializations from their database representation.</p>
        <p>Finally, NeoEMF contains a set of caching strategies that can be plugged on top of
the data store according to specific needs. Note that these caches are available for all
connectors, unless otherwise stated.</p>
        <p>– EStructuralFeaturesCaching: a LRU cache storing loaded objects by their
accessed feature.
– IsSetCaching: a cache keeping the result of isSet calls to avoid multiple
accesses to the database.
– SizeCaching: a cache keeping the result of size calls on multi-valued features to
avoid multiple accesses to the database.
– RecordCaches: a set of database-specific caches maintaining a list of records to
improve execution time.</p>
        <p>These caches can be configured using the save and load Resource methods, which
allows to add specific options which are then forwarded to the appropriate
PersistenceBackendFactory.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Datastores</title>
      <p>
        The previous features are available for a variety of data stores supported by NEOEMF.
In this section we introduce the different datastores available. We introduce briefly
model representation in these stores and describe their differences and the specific
modeling scenario they better address. Both, standard and advanced, features presented in
the previous section are implemented in the supported datastores.
NEOEMF/MAP [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] has been designed to provide fast access to atomic operations, such
as accessing a single element/attribute, and navigating a single reference. This
implementation is optimized for EMF API-based accesses, which typically generate atomic
and fragmented calls on the model. NEOEMF/MAP embeds a key-value store, which
maintains a set of in-memory/on disk maps to speed up model element accesses. The
benchmarks performed in previous work [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] show that NEOEMF/MAP is the most
suitable solution to improve performance and scalability of EMF API-based tools that need
to access very large models on a single machine.
      </p>
      <p>
        NEOEMF/MAP data model is composed of three different maps that store model
information: (i) a property map, which keeps all objects data in a centralized place; (ii)
a type map, which tracks how objects relate to the meta-level (such as the instance of
relationships); and (iii) a containment map, which defines the model structure in terms
of containment references.
NEOEMF/GRAPH [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] persists models in an embedded graph database that represents
model elements as vertices, attributes as vertex properties, and references as edges.
Metamodel elements are also persisted as vertices in the graph, and are linked to their
instances through the INSTANCE_OF relationship.
      </p>
      <p>
        Using graphs to store models allows NEOEMF to benefit from the rich traversal
features that graph databases usually provide, such as fast shortest-path computation, or
efficient complex navigation paths among several vertices/edges. These advanced query
capabilities have been used to develop the Mogwa¨ı [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] tool, that maps OCL expressions
to graph navigation traversals. On the other hand, graph databases are not well-suited
to compute atomic accesses of single elements or attributes, which are typical queries
computed in interactive model edition.
4.3
      </p>
      <sec id="sec-4-1">
        <title>NEOEMF/COLUMN</title>
        <p>
          NEOEMF/COLUMN [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ] has been designed to enable the development of distributed
MDE-based applications by relying on a distributed column-based datastore.
NEOEMF/COLUMN uses a single table with three column families to store model information:
(i) a property column family that keeps all objects data stored together; (ii) a type
column family that tracks how objects relate to the meta-level (such as the instance of
relationships); and (iii) a containment column family that defines the model structure in
terms of containment hierarchy.
        </p>
        <p>
          In contrast with Map and Graph implementations, NEOEMF/COLUMN offers
concurrent read/write capabilities and guarantees ACID properties at model element level.
It exploits the wide availability of distributed clusters in order to distribute intensive
read/write workloads across datanodes. The distributed nature of this persistence
solution is used in the ATL-MR [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] tool, a distributed engine for model transformations
in the ATL language on top of MapReduce. NEOEMF/COLUMN, enables the cluster’s
nodes to share read/write rights over the same set of input/output models.
5
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Implementation</title>
      <p>
        NEOEMF has been implemented as a set of open source Eclipse plugins distributed
under the EPL license. The NEOEMF website6 presents an overview of the key features
and current ongoing work, and the source code repository is fully available on GitHub
(https://github.com/atlanmod/NeoEMF). NEOEMF has been released as
part of the MONDO platform [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
      </p>
      <p>
        The NEOEMF/GRAPH implementation relies on Blueprints [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], an interface
designed to unify graph databases under a common API. Blueprints has been implemented
by a large number of databases, such as Neo4j, OrientDB, and Titan. The use of this
abstraction layer on top of graph databases enable client applications to use the graph
implementation of their choice, as long as it implements the Blueprints API. For now,
NEOEMF/GRAPH embeds Blueprints 2.5.0 and provides a convenience wrapper for
Neo4j 1.9.6. An implementation relying on the new Blueprints API (called Tinkerpop3)
is under study for now, as well as the creation of additional database wrappers.
      </p>
      <p>
        NEOEMF/MAP embeds the key-value store MapDB 1.0.9. MapDB provides Maps,
Sets, Lists, Queues and other collections backed by off-heap or on-disk storage, and
describes itself as a hybrid between Java Collections and an embedded database
engine [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. It provides advanced features such as ACID transactions, snapshots, and
incremental backups. NEOEMF/MAP relies on the set of Maps provided by MapDB and
uses them as a key-value store.
      </p>
      <p>
        NEOEMF/COLUMN is built on top of Apache HBase [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] 0.98.13-hadoop2, a
nonrelational wide column database providing distributed data storage on top of HDFS. It
      </p>
      <sec id="sec-5-1">
        <title>6 www.neoemf.com</title>
        <p>is able to host very large tables–billions of rows containing millions of columns–atop
clusters of commodity hardware. Model distribution is hidden from client applications,
which accesses the elements transparently using the standard EMF API.
6</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>Conclusion</title>
      <p>In this article we have presented NeoEMF, a multi-datastore model persistence
framework. It relies on a lazy-loading capability allowing very large model navigation in a
reduced amount of memory, by loading elements when they are accessed. NeoEMF
provides three implementations that can be plugged transparently to provide an optimized
solution to different modeling use cases: atomic accesses through interactive editing,
complex query computation, and cloud-based model transformation.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Apache</surname>
          </string-name>
          .
          <source>Apache HBase</source>
          ,
          <year>2016</year>
          . URL: https://hbase.apache.org/.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>Amine</given-names>
            <surname>Benelallam</surname>
          </string-name>
          , Abel Go´mez, Gerson Sunye´,
          <string-name>
            <given-names>Massimo</given-names>
            <surname>Tisi</surname>
          </string-name>
          , and David Launay.
          <article-title>Neo4EMF, a Scalable Persistence Layer for EMF Models</article-title>
          .
          <source>In Proc. of the 10th ECMFA</source>
          , pages
          <fpage>230</fpage>
          -
          <lpage>241</lpage>
          , York, United Kingdom,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>Amine</given-names>
            <surname>Benelallam</surname>
          </string-name>
          , Abel Go´mez, Massimo Tisi, and
          <string-name>
            <given-names>Jordi</given-names>
            <surname>Cabot</surname>
          </string-name>
          .
          <article-title>Distributed Model-toModel Transformation with ATL on MapReduce</article-title>
          .
          <source>In Proc. of the 8th SLE Conference</source>
          , pages
          <fpage>37</fpage>
          -
          <lpage>48</lpage>
          . ACM,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>Gwendal</given-names>
            <surname>Daniel</surname>
          </string-name>
          , Gerson Sunye´, and
          <string-name>
            <given-names>Jordi</given-names>
            <surname>Cabot</surname>
          </string-name>
          .
          <article-title>Mogwa¨ı: a Framework to Handle Complex Queries on Large Models</article-title>
          .
          <source>In Proc of the 10th RCIS Conference</source>
          (to appear). IEEE,
          <year>2016</year>
          . Available Online at http://tinyurl.com/jgopmvk.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>Eclipse</given-names>
            <surname>Foundation</surname>
          </string-name>
          .
          <source>The CDO Model Repository (CDO)</source>
          ,
          <year>2016</year>
          . URL: http://www. eclipse.org/cdo/.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6. Abel Go´mez, Amine Benelallam, and
          <string-name>
            <given-names>Massimo</given-names>
            <surname>Tisi</surname>
          </string-name>
          .
          <article-title>Decentralized Model Persistence for Distributed Computing</article-title>
          .
          <source>In Proc. of the 3rd BigMDE Workshop</source>
          , pages
          <fpage>42</fpage>
          -
          <lpage>51</lpage>
          . CEURWS.org,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7. Abel Go´mez, Gerson Sunye´,
          <string-name>
            <given-names>Massimo</given-names>
            <surname>Tisi</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Jordi</given-names>
            <surname>Cabot</surname>
          </string-name>
          .
          <article-title>Map-based Transparent Persistence for Very Large Models</article-title>
          .
          <source>In Proc. of the 18th FASE Conference</source>
          , pages
          <fpage>19</fpage>
          -
          <lpage>34</lpage>
          . Springer,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Dimitrios</surname>
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Kolovos</surname>
          </string-name>
          , Louis M. Rose, Richard F. Paige, Esther Guerra,
          <source>Jesu´s Sa´nchez Cuadrado</source>
          , Juan de Lara,
          <article-title>Istva´n Ra´th, Da´niel Varro´</article-title>
          , Gerson Sunye´, and
          <string-name>
            <given-names>Massimo</given-names>
            <surname>Tisi</surname>
          </string-name>
          . MONDO:
          <article-title>Scalable Modelling and Model Management on the Cloud</article-title>
          .
          <source>In Proc. of the Projects Showcase</source>
          ,
          <source>(STAF</source>
          <year>2015</year>
          ), pages
          <fpage>44</fpage>
          -
          <lpage>53</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9. MapDB. MapDB,
          <year>2016</year>
          . URL: www.mapdb.org.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Parastoo</surname>
            <given-names>Mohagheghi</given-names>
          </string-name>
          ,
          <article-title>Miguel A Fernandez, Juan A Martell, Mathias Fritzsche, and Wasif Gilani. MDE Adoption in Industry: Challenges and Success Criteria</article-title>
          .
          <source>In Models in Software Engineering</source>
          , pages
          <fpage>54</fpage>
          -
          <lpage>59</lpage>
          . Springer,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Javier Espinazo</surname>
          </string-name>
          <article-title>Paga´n and Jesu´s Garc´ıa Molina</article-title>
          .
          <source>Querying Large Models Efficiently. IST</source>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Tinkerpop</surname>
          </string-name>
          .
          <source>Blueprints API</source>
          ,
          <year>2016</year>
          . URL: blueprints.tinkerpop.com.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <article-title>JB Warmer and</article-title>
          AG Kleppe.
          <article-title>Building a Flexible Software Factory using Partial Domain Specific Models</article-title>
          .
          <source>In Proc. of the 6th OOPSLA DSM Workshop</source>
          . University of Jyvaskyla,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <article-title>Ran Wei and Dimitrios S Kolovos. An Efficient Computation Strategy for allInstances()</article-title>
          .
          <source>In Proc. of the 3rd BigMDE Workshop</source>
          , pages
          <fpage>32</fpage>
          -
          <lpage>42</lpage>
          . CEUR-WS.org,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>