<!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>Semantic Web Analysis with Flavor of Micro-Services</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Farshad Bakhshandegan Moghaddam</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Carsten Felix Draschner</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jens Lehmann</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Hajira Jabeen</string-name>
          <email>hajira.jabeen@uni-koeln.de</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of Bonn</institution>
          ,
          <addr-line>Bonn</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>University of Cologne</institution>
          ,
          <addr-line>Cologne</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>The last decades witnessed a significant evolution in terms of data generation, management, and maintenance, especially in the RDF format. Moreover, in the energy domain, semantic data is finding its way and can be used for various data analytics tasks. However, since data set sizes are increasing and can now be enormous, technologies are evolving to scale with the increasing data set sizes. In this regard, tools and frameworks such as SANSA have been emerged to facilitate the analytic over semantic data. SANSA is using big data technologies such as Apache Spark (as an analytics engine for large-scale data processing) and Apache Hadoop (as a distributed file system) in its backbone to be able to perform analytics in a distributed manner over a cluster of nodes. However, to be able to use SANSA, one should set up a cluster of nodes with enabled Spark and Hadoop. This requires extensive knowledge and expertise in computer systems, networking, distributed computing and etc. Moreover, in case of having suficient technical knowledge, setting up such a cluster consumes huge manpower and is labor-intensive. To tackle the aforementioned issues, in this paper we introduce a micro-service architecture that easily brings the power of SANSA and distributed semantic data analysis in the end-user ecosystem, without having technical knowledge in the mentioned areas. The introduced architecture is based on Docker technologies and can be installed on-premise or in the cloud systems.</p>
      </abstract>
      <kwd-group>
        <kwd>Micro Services</kwd>
        <kwd>SANSA</kwd>
        <kwd>Docker</kwd>
        <kwd>Distributed Computing</kwd>
        <kwd>RDF Data</kwd>
        <kwd>Analytics Pipelines</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        With the rapidly growing amount of data available on the Internet, it becomes
necessary to have a set of tools to extract meaningful and hidden information
from the online data. The Semantic Web is able to form a structural view of the
Copyright © 2021 for this paper by its authors. Use permitted under Creative
Commons License Attribution 4.0 International (CC BY 4.0).
existing data on the web and provides machine-readable formats [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Currently,
many companies in the fields of science, engineering, and energy publish their
data in the form of RDF3. Due to the complex graph nature of RDF data,
applying standard machine learning algorithms to this data is cumbersome. Moreover,
the challenges in the current big data era (limited computational resources) cause
analytical approaches to mostly fail to operate on large-scale data. To tackle
the mentioned issues, Scalable Semantic Analytics Stack (SANSA) [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] has been
emerged. SANSA addresses the need of having a scalable and distributed
computational engine to work with semantic data. It benefits from an in-memory
analytics framework, Apache Spark4 and provides fault-tolerant, highly
available, and scalable approaches to eficiently process RDF data with the support
of semantic technology standards. SANSA provides various layers of
functionalities for semantic data representation, querying, inference, and analytics5.
      </p>
      <p>To be able to use SANSA efectively, a cluster of Spark nodes with an HDFS
ifle system is required. Even by having such a cluster, one can only interact
with SANSA via a terminal. Establishing a cluster of diferent nodes containing
Spark and Hadoop6 and configuring them is by nature a cumbersome task and
needs a lot of knowledge and experiences. Moreover, in the case of having
technical knowledge, establishing such a cluster is a time-consuming task. Moreover,
end-users prefer to have a user friendlier way to interact with SANSA
without having any programming and scripting knowledge. Therefore, in this paper,
we introduce a micro-service structure of a SANSA-enabled Spark and Hadoop
cluster with 2 user-friendly interactive communication mechanisms aka. REST
API and Zeppelin Notebook7. Our introduced architecture is based on Docker
technologies8. Moreover, our sample explanatory tutorial enables non-technical
users to easily use SANSA without having any specific knowledge and skills.
1.1</p>
      <p>Contributions:
- Introducing a micro-service architecture of Big Data tools such as Apache</p>
      <p>Spark, Apache Hadoop, Apache Zeppelin, HDFS File Browser, Apache Livy
- Introducing for the first time REST APIs for the SANSA stack
- Introducing an interactive Notebook (i.e. Apache Zeppelin) for interacting
with SANSA
- Making the code and the framework open-source and publicly available on</p>
      <p>Github9
3 https://www.w3.org/RDF/
4 http://spark.apache.org/
5 http://sansa-stack.net/
6 https://hadoop.apache.org/
7 https://zeppelin.apache.org/
8 https://www.docker.com/
9 https://github.com/SANSA-Stack/SANSA-Stack</p>
    </sec>
    <sec id="sec-2">
      <title>Related Work</title>
      <p>In recent years, it has been recognized that creating complex technical
environments for big data is a major challenge. Setting up a lot of nodes and connecting
them together in a way that all together perform a specific task not only is
costly but requires extensive knowledge in many computer science areas such as
networking, cluster computing, and big data technologies. Although nowadays,
other technologies such as virtualization (e.g. VMbox3, Parallels, VMware) and
its successor containerization (e.g. Docker, Swarm, Kubernetes) keep the costs
lower but add up other skills to be able to set up a cluster properly.</p>
      <p>
        Besides this, there are numerous centralized machine learning frameworks
and algorithms for RDF data. For example, TensorLog [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and ProPPR [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]
are recent frameworks for eficient probabilistic inference in first-order logic.
AMIE [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] and AMIE+ [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] learn association rules from RDF data. DL Learner [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]
is a framework for inductive learning for the Semantic Web. [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] provides a
review of statistical relational learning techniques for knowledge graphs. However,
SANSA leveraged Apache Spark and Apache Jena10 to provide an open-source,
distributed, scalable, and end-to-end framework for data analytic pipelines for
large-scale RDF Knowledge Graphs[
        <xref ref-type="bibr" rid="ref11 ref13 ref4">4, 11, 13</xref>
        ].
      </p>
      <p>
        In order to use SANSA efectively, having a distributed environment is
inevitable. Although, some enterprise companies such as Databricks11 [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]
develops a web-based platform for working with Spark, that provides automated
cluster management and IPython-style notebooks, however, they are costly as
the user needs to provide AWS12, Microsoft Azure13, or Google Cloud14 account.
Moreover, its free community edition provides limited functionality and services.
However, our approach difers from the mentioned methods as it provides a
versatile, flexible, and free-to-use framework via Docker technologies which can be
set up on a single machine (e.g. a laptop) or a cluster of machines in a cloud
environment.
3
      </p>
    </sec>
    <sec id="sec-3">
      <title>Architecture</title>
      <p>In this section, we present the micro-service system architecture for using SANSA.
Worth mentioning that the framework is open-source and hosted on GitHub15.
The main goal of the framework is to bring a simple and efortless approach
to set up a Spark cluster with all the requirements without having extensive
computer science knowledge.
10 https://jena.apache.org
11 https://databricks.com/
12 https://aws.amazon.com/
13 https://azure.microsoft.com
14 https://cloud.google.com/
15 https://github.com/SANSA-Stack/SANSA-Stack
We provided two interaction mechanisms for the end-users. a) Zeppelin
Notebooks b) REST APIs. Depends on the scenario users may select one of the
mentioned mechanisms. These mechanisms cover the full spectrum from simplicity
to flexibility. By using the REST APIs, users will be able to call predefined
functionalities from SANSA without any efort. However, in case a user is
interested in the new functionalities, they can write code and stack their code via
Zeppelin Notebook and submit their task to the Spark cluster. Figure 1 depicts
the high-level system overview. The architecture contains 4 main components
i.e. a) Java-based REST APIs b) Apache Zeppelin Notebook c) Apache Livy d)
Spark-Hadoop Cluster, which are all utilized via Docker-Compose.
Java-based REST API This layer provides functionality for the end-user
to interact with SANSA via REST APIs. It is Java-based and is powered by
Spring Boot16 technology and contains a Swagger17 UI which enables users to
easily call any provided functions via a browser. Figure 2 shows the SwaggerUI
and provided APIs. A sample scenario of how to use these APIs is provided in
Section 4.</p>
      <p>Apache Livy REST APIs As the Spark tasks may be long-running (up to
a few days) and also there is a chance that the node which is running the task
16 https://spring.io/projects/spring-boot
17 https://swagger.io/
crashes and loses the calculations, therefore, directly connecting the REST APIs
to the Spark cluster is not feasible due to asynchronous nature of such
computations. To tackle this, another layer has been added by using Apache Livy18,
which is able to keep tracks of Spark sessions and calculation states. Livy enables
programmatic, fault-tolerant, multi-tenant submission of Spark jobs from
web/mobile apps. So, multiple users can interact with the Spark cluster concurrently
and reliably. Although the Livy interface is available for the user, this layer works
as a background process and the user does not need to interact with it directly,
because all the functionalities will be handled by the REST API layer.
Spark-Hadoop Cluster To be able to run a SANSA functionality, having a
Spark cluster with a Hadoop file system is inevitable. To do so we containerized
Spark, Hadoop Namenode, Hadoop Datanode, and Hue HDFS file browser 19, in
docker images which are publicly available. Moreover, we configured the
containers to interact with each other seamlessly via Docker-Compose. Of course, all the
other layers have been containerized and exposed in the same docker-compose
ifle.
18 https://livy.apache.org/
19 https://gethue.com/</p>
    </sec>
    <sec id="sec-4">
      <title>Usage</title>
      <p>To be able to run the cluster, the user needs to clone the SANSA Stack from
Github and navigate to sansa-rest sub-folder. The following codes in the terminal
will bring up the cluster.
$ git clone https://github.com/SANSA-Stack/SANSA-Stack.git
$ cd SANSA-Stack/sansa-rest
$ make
$ make up</p>
      <p>To stop the cluster, the user only needs to run the following command.
$ make down</p>
      <p>
        As already mentioned, users will have two interaction mechanisms to
connect to SANSA, either using Zeppelin Notebook or REST APIs. Using Zeppelin
Notebook is easy and straightforward same as all the other notebook
technologies such as Jupyter Notebook20. Therefore, without losing the generality and
due to the space issue, we ignore the explanation in this paper. However, in the
following, we explain a sample scenario which shows how to use the REST APIs.
Besides its many functionalities, SANSA provides a distributed SPARQL engine
(i.e. Sparklify [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]) which is able to execute a SPARQL query in a distributed
fashion. As a scenario, imagine the user has an RDF file (any format) and would
like to run a SPARQL query over it. To be able to use a REST API for this
purpose, the user first needs to upload her lfie into the HDFS because SANSA
needs to access the file in a distributed manner. For this reason, we have
provided an API in Swagger which enables the user to upload lfies to the HDFS.
The result of the API call will be the address which the file will be stored in the
HDFS. The user will need to provide this address for any subsequent API call.
To call the SPARQL engine API (i.e. /api/sparql), the user simply needs to
provide the SPARQL query and the address of the file which he retrieved from
the file upload API. Keep in your mind that the result of any API call will be a
livy batch id. This id is a unique number which identifies a Livy session which
20 https://jupyter.org/
is responsible for the task computation. We provided two APIs which receive
this id and provide more information about the execution process and about
the result of the executions. The result of the /api/getState API will be
either running, success, or dead. Only in case of success, the user can
use /api/getResult API to see the result of the call. The other two states
either show the process is ongoing, or the process is unexpectedly stopped.
5
      </p>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>In this paper, we introduced a framework which is able to set up a Big
Dataenabled cluster with all its requirement from Spark and Hadoop to Zeppelin
Notebook to be able to use SANSA framework without any efort. The
proposed approach is based on Docker Compose technology and can be installed
on-premise or on any cloud environment. Moreover, we implemented a set of
REST APIs via Swagger which enables all the non-technical users to interact
with SANSA in a very straightforward manner.</p>
    </sec>
    <sec id="sec-6">
      <title>Acknowledgement</title>
      <p>This work was partly supported by the EU Horizon 2020 project PLATOON
(Grant agreement ID: 872592). We would also like to thank the SANSA
development team for their helpful support.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Berners-Lee</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          <article-title>A roadmap to the Semantic Web</article-title>
          . (http://www.w3.org/DesignIssues/Semantic.html,
          <year>1998</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2. Bu¨hmann, L.,
          <string-name>
            <surname>Lehmann</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Westphal</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          <article-title>DL-Learner - A framework for inductive learning on the Semantic Web</article-title>
          ..
          <source>J. Web Semant.. 39</source>
          pp.
          <fpage>15</fpage>
          -
          <lpage>24</lpage>
          (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Cohen</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          <article-title>TensorLog: A Diferentiable Deductive Database</article-title>
          .
          <source>CoRR. abs/1605</source>
          .06523 (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Draschner</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lehmann</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Jabeen</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          <article-title>DistSim-Scalable Distributed in-Memory Semantic Similarity Estimation for RDF Knowledge Graphs</article-title>
          .
          <source>2021 IEEE 15th International Conference On Semantic Computing (ICSC)</source>
          . pp.
          <fpage>333</fpage>
          -
          <lpage>336</lpage>
          (
          <year>2021</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. Gaal´rraga, L.,
          <string-name>
            <surname>Teflioudi</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hose</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Suchanek</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          <article-title>Fast rule mining in ontological knowledge bases with AMIE+.</article-title>
          . VLDB J..
          <volume>24</volume>
          ,
          <fpage>707</fpage>
          -
          <lpage>730</lpage>
          (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Lehmann</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sejdiu</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          , Bu¨hmann, L.,
          <string-name>
            <surname>Westphal</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Stadler</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ermilov</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bin</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chakraborty</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Saleem</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ngonga</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Jabeen</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          <article-title>Distributed Semantic Analytics using the SANSA Stack</article-title>
          .
          <source>Proceedings Of 16th International Semantic Web</source>
          Conference - Resources
          <string-name>
            <surname>Track</surname>
          </string-name>
          (ISWC'
          <year>2017</year>
          ). pp.
          <fpage>147</fpage>
          -
          <lpage>155</lpage>
          (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Nickel</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Murphy</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tresp</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Gabrilovich</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          <article-title>A Review of Relational Machine Learning for Knowledge Graphs</article-title>
          .
          <source>Proceedings Of The IEEE. 104</source>
          ,
          <fpage>11</fpage>
          -
          <lpage>33</lpage>
          (
          <year>2016</year>
          ), https://doi.org/10.1109/JPROC.
          <year>2015</year>
          .2483592
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Stadler</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sejdiu</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Graux</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Lehmann</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <article-title>Sparklify: A Scalable Software Component for Eficient Evaluation of SPARQL Queries over Distributed RDF Datasets</article-title>
          .
          <source>The Semantic Web - ISWC 2019 - 18th International Semantic Web Conference</source>
          , Auckland, New Zealand,
          <source>October 26-30</source>
          ,
          <year>2019</year>
          , Proceedings, Part II. 11779 pp.
          <fpage>293</fpage>
          -
          <lpage>308</lpage>
          (
          <year>2019</year>
          ), https://doi.org/10.1007/978-3-
          <fpage>030</fpage>
          -30796-7
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Wang</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mazaitis</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Cohen</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          <article-title>Structure Learning via Parameter Learning.</article-title>
          .
          <source>CIKM</source>
          . pp.
          <fpage>1199</fpage>
          -
          <lpage>1208</lpage>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10. Gaal´rraga, L.,
          <string-name>
            <surname>Teflioudi</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hose</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          &amp;
          <string-name>
            <surname>Suchanek</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          <article-title>Fast rule mining in ontological knowledge bases with AMIE+</article-title>
          . VLDB J..
          <volume>24</volume>
          ,
          <fpage>707</fpage>
          -
          <lpage>730</lpage>
          (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>C. F. Draschner</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Stadler</surname>
            ,
            <given-names>F. B.</given-names>
          </string-name>
          <string-name>
            <surname>Moghaddam</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Lehmann</surname>
            , and
            <given-names>H.</given-names>
          </string-name>
          <string-name>
            <surname>Jabeen</surname>
          </string-name>
          , “
          <article-title>DistRDF2ML-Scalable distributed in-memory machine learning pipelines for rdf knowledge graphs” in 2021 ACM International Conference on Information and Knowledge Management (CIKM).</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>C. F. Draschner</surname>
            ,
            <given-names>F. B.</given-names>
          </string-name>
          <string-name>
            <surname>Moghaddam</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Lehmann</surname>
            , and
            <given-names>H.</given-names>
          </string-name>
          <string-name>
            <surname>Jabeen</surname>
          </string-name>
          , “
          <article-title>Semantic Analytics in the Palm of Your Browser” in Big Data Analytics 3rd Summer School (</article-title>
          <year>2021</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>F. B. Moghaddam</surname>
            ,
            <given-names>C. F.</given-names>
          </string-name>
          <string-name>
            <surname>Draschner</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Lehmann</surname>
            , and
            <given-names>H.</given-names>
          </string-name>
          <string-name>
            <surname>Jabeen</surname>
          </string-name>
          , “
          <article-title>Literal2Feature: an automatic scalable rdf graph feature extractor</article-title>
          ”
          <source>in Proceedings of the 17th International Conference on Semantic Systems, SEMANTICS</source>
          <year>2021</year>
          , Amsterdam, The Netherlands,
          <source>September 6-9</source>
          ,
          <year>2021</year>
          . SEMANTICS (
          <year>2021</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>