<!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>Comparison of Graph and REST APIs</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Marko Gluhak</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Marjan Heričko</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of Maribor, Faculty of Electrical Engineering and Computer Science</institution>
          ,
          <addr-line>Koroška cesta 46, Maribor</addr-line>
          ,
          <country country="SI">Slovenia</country>
        </aff>
      </contrib-group>
      <fpage>38</fpage>
      <lpage>49</lpage>
      <abstract>
        <p>As APIs have become more important it is crucial to offer flexibility in their use. REST API has been the dominating architectural style over the past two decades. With the API Gateway and other improvements, it has been able to keep pace with the ever-changing customer demands. Novel approaches such as the Graph API offer such features as a native property of their design philosophy. They offer benefits to API consumers and providers which are still not understood in full. In this paper we explore Graph API, how it works, performs, and what are the differences between it and the standard REST API. We experiment and assess the performance of GitHub, GitLab and Star Wars APIs in REST and Graph forms. Conclusion is that neither approach is ideal in all situations, but they supplement each other where the other falls short.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;REST API</kwd>
        <kwd>Graph API</kwd>
        <kwd>API principles</kwd>
        <kwd>API performance 1</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>Scholar. To understand performance differences, we test three well-known APIs in both REST and
Graph forms. Answers are elaborated on in Chapter 4 of this paper. In Chapter 3, we will look at
the lessons learned from our research and our experiment. Specifically, focusing on the
differences between two approaches, the performance they offer, and how it is perceived in
testing Chapter 2 offers a baseline on REST API principles and goes into more detail on the novel
Graph API approach, including how it is made up of schemas and how to formulate a request. We
by no means offer a comprehensive guide on how to design production-ready Graph APIs, but
rather an entry point into a new principle. We also explore the current industry players offering
Graph APIs.</p>
      <sec id="sec-1-1">
        <title>1.1. Related work</title>
        <p>
          There has been an attempt to quantify the performance benefits of Graph APIs. Previous works
have addressed different aspects of the design approach. The work of Eunggi, Kiwoong, and
Jungmee [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ] delves into the handling of complexity. Their findings report that REST overtakes
Graph when a call is made to more than 20 resources at once. Although their tests are limited to
a single system, what is evident is that the graph has a higher standard deviation and lower
response sizes. Yet Naman and Ida [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] experiment with a thorough set of tests for various loads
of users. They also test for various GET complexities and POST and PUT methods. Their findings
are more focused on the API gateway implementations (Ocelot and HotChocolate). They find that
REST is more performant, outperforming graphs in nearly all situations and loads. The same was
found by Armin, Benny, and Takaichi [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ] in their experiment. Graph does show better results in
resource utilization with both memory and processing power. Contrary to previous works, the
contributions of Jaime, Evelin, and Andres [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ] show that Graph is the most performant option.
They test for different programming languages (C#, Java, and PHP) and various user loads, and
graph is better in response times and throughput. The work of Suresh et al. [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ] presents a Graph
solution for transforming a REST API into Graph for the sake of achieving performance, resource
utilization and solving other issues of REST that are presented in this paper.
        </p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>2. Characteristics of REST and Graph APIs</title>
      <p>Both REST API and Graph API approaches aim to accomplish the same goal: to provide clients
with requested data. To better understand them, we will first present how each provides services
to customers and some of their key principles. At the end of this section, we will also discuss some
of the key players that are in the market for providing Graph APIs.</p>
      <sec id="sec-2-1">
        <title>2.1. REST API</title>
        <p>
          In his thesis, Roy Thomas Fielding first coined the term "Representational State Transfer (REST)
as an architectural style for distributed hypermedia systems. REST provides a set of architectural
constraints. When applied, the constraints emphasize scalability of component interactions,
generality of interfaces, independent deployment of components, and intermediary components
to reduce interaction latency, enforce security, and encapsulate legacy systems. [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. There are six
core design principles when designing REST interfaces: a uniform interface, client-server,
stateless, cacheable, layered systems, and code on demand.
        </p>
        <p>Among these, the first is the most fundamental to a RESTful API. Providing a uniform interface
is the basis on which the API is built. It should adhere to the following constraints: identification
of resources, manipulation of resources through representation, self-descriptive messages, and
hypermedia as the engine of application state (HATEOAS).</p>
        <p>
          This then brings us to how we expose our data over such interfaces. Every resource has its
own Uniform Resource Identifier (URI) that corresponds to an exposed Uniform Resource
Locator (URL) [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. This puts an emphasis on how we design paths to our resources. An example
path of an API looks like this: https://foo.com/api/employees/123. It retrieves a single employee
with an ID of 123 from our API, which stores employees. We receive the full employee object only
if we want to know his name. If we now want to know his active projects, it depends on how we
have designed our API. It could be as simple as calling
https://foo.com/api/employees/123/projects. Or it could be a separate call to another API with
our employees’ ID. If we only need to know how long a project the employee is currently working
on is going to take, we need to know where that data is stored and how the tree structure leads
to it. Even then, we are inevitably running into the problem of fetching too much or too little data
[
          <xref ref-type="bibr" rid="ref8">8</xref>
          ]. A major drawback of current REST APIs.
        </p>
        <p>
          One of the remedies has been to implement patterns via the API Gateway. These patterns allow
us to abstract how our APIs are connected between themselves and provide use-case-driven APIs.
Some of the patterns include the API Facade, API Composition, Two-phase Transaction
Management and Synchronous to Asynchronous Mediation [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. Most API management platforms
allow us to easily create these use cases without writing code through the developer portal.
However, these use cases still require maintenance and resources [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ].
        </p>
        <p>Another undefined area with REST is its service description. It’s now been standardized with
the Open API initiative, but there are still many tools that go about generating the description.
Swagger, as viewed in Figure 1, is one such tool. It offers us a description of a basic parking
service. What endpoints does the API respond on and what are the HTTP methods for achieving
them? From the figure, we observe the four basic verbs. GET, which is used for fetching resources.
POST for creating them, PUT for updating them, and DELETE for deleting them. There are other
verbs such as HEAD, TRACE, PATCH, OPTIONS, and CONNECT that are less commonly used.</p>
        <p>In the next chapter, we’ll present how the Graph API handles these areas.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Graph API</title>
        <p>
          Graph API offers an alternative to the REST approach to building APIs. Graph Query Language
(GraphQL) is a query language that produces APIs that facilitate flexible access to data. Although
using GraphQL is not necessary to provide a Graph API, it is often the case. One of the key
advantages Graph APIs have over REST APIs is that clients receive only relevant data and can
create new queries that suit their needs without any changes on the backend [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ]. One of the
main identified necessities for this approach to work is to have interconnected data and defined
relationships between them [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ], [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ]. This requires well-defined schemas for clients to be able to
formulate requests efficiently. An example of a GraphQL schema can be observed in Figure 2. We
have defined a schema using the Schema Definition Language (SDL). The schema defines two
possible operations, query and mutation, along with their corresponding root elements, Query
and Mutation. In our case, the names are the same, so the schema field could have been omitted
and it would remain a valid scheme. What we have done with this is explicitly name the root
elements of our operations [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. Along with these operations, we have also defined two types of
objects, Building and Room, that have their own unique fields. We have also created a relationship
between them. That is done by creating an array of rooms in the building and a building field in
the Room.
        </p>
        <p>
          Now that we have a simple schema, we may look at how we can extract the data from an API that
would be exposing its data over it. In Figure 3, we now see a query and a mutation being
formulated. It is only valid because of the schema we have defined. The query would only return
the names of rooms in the building with an id of 123. The mutation would create a room with the
name "Living room" and give us back the ID it was created with. Why GraphQL is so intuitive for
clients to adopt is the ability to introspect the schema behind the API. This also allows developers
to build tools around it, as intelligent suggestions can be made about the API itself at runtime
[
          <xref ref-type="bibr" rid="ref16">16</xref>
          ].
        </p>
        <p>
          These requests are normally enveloped in the body of a POST request. Although there is
precedent for mapping certain requests as GET parameters, there are certain limitations to this
approach, but the benefits of keeping the API discoverable sometimes outweigh them. Facebook
is the creator of GraphQL, and they are using GET for most simple requests that do not require
complex queries [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ]. This also comes into play when we begin to add authentication and access
tokens into the mix [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ]. To support these, they must also be included in the schema, which
further adds to the complexity of designing a good GraphQL schema [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ].
        </p>
        <p>
          As Gartner has pointed out, Graph APIs are in the Innovation Trigger stage [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ]. Meaning early
adopters such as Facebook have been in the game for a while. Their need for the technology
eventually led to new tools such as GraphQL itself when some other early attempts led to other
shortcomings [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ]. Currently, most of the big players in API management platforms are also
offering their own take on the Graph architecture. Microsoft Azure [
          <xref ref-type="bibr" rid="ref18">18</xref>
          ], AWS [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ], and Google
Apigee [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ] are all offering some form of support for graph APIs. But as it currently appears, the
Graph API will not be replacing the REST API anytime soon. Graph-based APIs are meant to
overcome certain shortcomings of REST. Most big adopters of the Graph API are offering it
alongside REST. And research has been made in the direction of transforming REST into Graph
when reasonable [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ], [
          <xref ref-type="bibr" rid="ref21 ref22 ref23">21-23</xref>
          ].
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Differences between consuming APIs</title>
      <p>The key differences in the two approaches to API design that stand out are the philosophies in
which the challenges of request performance are addressed. The REST API is usually quicker in
providing responses, but they are less tailored to the needs of the customer. It also requires
clients to know where certain resources are available. Graph API, on the other hand, exposes a
singular endpoint and accepts requests via a query in the body of a POST request.</p>
      <sec id="sec-3-1">
        <title>3.1. Over fetching and under fetching</title>
        <p>With the REST API, to find the repository information from which we can extract the
collaborators, we must visit the following endpoint:
https://api.github.com/repos/{owner}/{repo}/collaborators. The {owner} is replaced by the
username of the owner, and the {repo} is replaced by the name of the repository we wish to visit.
We are presented with a full array of collaborators and 25 fields for each of them, visible in Figure
4. Among them, only two of them are relevant to our needs. This illustrates one of the common
problems with REST, as we have no way of applying specificity to our request. It leads to acquiring
more data than is necessary for our given needs. What is worse is the fact that this endpoint does
not include all the user data but only a subset that the provider decided to include. There is no
bio field for a user. This is the problem of "under fetching," where the endpoint does not provide
all the data needed for our use case. To obtain this data, we must visit another endpoint,
https://api.github.com/users/{user}", where the {user} is replaced with the user we wish to
query. Where we are again served with 32 fields, of which only one is relevant to our use case. If
we are authenticated with a token from the same user, the number of fields is 43. This is the
problem of "overfetching" more data than needed.</p>
        <p>Graph API gives us the tools to specify exactly the fields we wish to extract from it. Not only is
it available, but it is also mandatory. This could lead to APIs being prohibitive for new developers
to adopt. But since the schema is a mediator with its introspection, it allows developers to easily
discover which fields they may call. In the Graph API, with a single well-defined query in the body
of a POST request, we are presented with a tailored response of only the needed data. Giving the
client the power to design a desired response from the API. Such is evident from Figure 5,
whereby, by specifying the "login", "bio", and "url" fields, we are presented only with those.
Fetching exactly the data we need.</p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Performance</title>
        <p>The key differences in the two approaches also lead us to believe there are performance
differences. To evaluate our hypothesis, we have devised several test scenarios on platforms
where APIs are available in both REST and Graph forms. Based on real use case scenarios
presented in Table 1. We performed tests for all scenarios were using Apache JMeter with settings
observed in Table 2.</p>
        <p>Settings remained the same across use cases, except for UC2 and UC3 at GitHub where we
increased the ram-up period to 10 minutes to spread out requests over. We did this due to rate
limiting and we were not able to perform more than twenty requests in succession. We assume
this did not impact our results as the aim was not to test load capabilities of GitHub or GitLab
APIs. Regardless, our aim was to collect the following metrics:
• Average, minimum, and maximum response times and their standard deviation
(milliseconds)
•
•
•</p>
        <p>Size of response (bytes)
Size of request (bytes)</p>
        <p>Throughput (requests per second) – only Star Wars API</p>
        <p>In the case of the Star Wars API, we were able to stress the system because it was a self-hosted
instance in a Docker container on a VirtualBox virtual machine with resources listed in Table 3.
Hence, we also collected the throughput of the requests.</p>
        <p>Results are visualized in Figure 6a, presenting our findings for response times on all three APIs
and throughput on the Star Wars API. In Figures 6b and 6c, we skewed the standard deviation
visualization for Graph on Use Case 2. This was done because the results were making other
results difficult to read and interpret. Actual numbers for standard deviation are 3120,84 and
9759,93.</p>
        <p>
          In Figure 6, we observe that in the case of GitHub and Star Wars API graphs, the more
performant option is faster to give requested responses. Although in the case of GitHub, it is worth
mentioning that the two REST requests were individually faster than graph, we required two of
them to achieve our use case. It also stands out that graph was usually the more consistent choice,
resulting in a lower standard deviation in all but a few use cases. Which runs counter to what a
related study found [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ].
        </p>
        <p>The next surprise came in the form of Graph being better behaved under moderate load. When a
system has limited resources and REST requires more requests than graph, it can result in
severely degraded performance. Which is nicely presented in Figure 6d, where the difference in
simple queries is minor and very big when REST requires just one more request per resource.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Discussion</title>
      <p>In this chapter, we will address the research questions presented in the introduction. We will
answer them with the knowledge we have acquired from literature and our experiment.</p>
      <sec id="sec-4-1">
        <title>4.1. RQ1: What are the differences between Graph and REST API approaches?</title>
        <p>
          The key difference between the two approaches is that Graph provides a singular endpoint where
it accepts requests in a POST body. However, for simpler queries, GET can still be used. REST
presents different endpoints that are more tailored to the use cases of an application. Which does
have its benefits, but the main drawbacks are the over- and under-fetching of data. The amount
of data we retrieve from the server is predetermined by its developers. Graph gives that power
of decision-making to the user. Which can be a great thing when we are exposing a large API with
related data to the public. As maintainers of an API, it is utopian to foresee and prepare all use
cases, and even more so to maintain all those endpoints. One of the challenges Graph API provider
faces is limiting how much data users can extract from it. Due to the interconnectivity, it is crucial
to implement the cursor pattern and enforce limiting numbers of entries per request [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ].
        </p>
        <p>REST API providers have been addressing this issue with the advent of API management
platforms. These platforms allow us to create use cases from APIs, compose them with no code,
and expose and version all these endpoints with ease. This gave the REST API the API Gateway
pattern, which has essentially the same goal as a graph API's native feature: to provide a singular
point of access to our API.</p>
      </sec>
      <sec id="sec-4-2">
        <title>4.2. RQ2: Are there performance benefits to using a particular approach when it is appropriate?</title>
        <p>
          As we have discovered in Section 3.2, no approach is indefinitely better than another. There are
situations where one is preferable to the other. When we need simple resources presented
quickly to the customer, REST appears to be more effective. The responses were usually quicker
than those of the Graph counterpart. But if we require more complex queries that require
combining more endpoints, Graph appears to be the more efficient option. There also seems to
be a difference in how much computational power each API requires. Graph trades a more
process-heavy server for a leaner client with less required bandwidth. This leads us to believe
that the Graph API is more processor-intensive than REST since it takes more time to traverse a
graph than to simply respond with a pre-prepared query in REST. Although it has been shown
that Graph is more efficient than REST in the utilization of its resources [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ].
        </p>
        <p>Graph API also liberates the client from having to process received data, shifting the
responsibility from the client to the server. This also results in lower bandwidth requirements,
as less data is transferred overall.</p>
      </sec>
      <sec id="sec-4-3">
        <title>4.3. RQ3: Are there differences in testing the two APIs?</title>
        <p>In testing, we experienced no considerable differences in performance, load, or stress testing with
JMeter. It requires a different approach to payload transfer setup and transferring more data to
the server via the larger request body. In unit testing, there should be no perceived differences
between the two approaches. However, Graph could turn out to be more friendly to developers
when it comes to preparing JSON strings to compare responses to, as they are leaner and more
focused on the data we wish to retrieve and test.</p>
        <p>In Table 4, we can see the key differences between two approaches to APIs. Both are flexible
and replicate each other in the definition of the service, and they both support the same key CRUD
(Create, Read, Update, and Delete) operations. Although the Graph API is not cacheable, its
resource utilization and customizable response make it better performing. Both approaches are
testable in the same way, although a different philosophy in forming the request is dictated by
the API type. Even so, REST remains the industry standard.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusion</title>
      <p>We have conducted an exploratory study of the Graph API and how it compares to the REST API
in key areas of conceptualization, performance, use cases, and performance testing. We can draw
conclusions from the works of previous authors and add our own experiment. We conclude that
REST and Graph API both have a place in the industry as complementary principles. This is further
supported by the fact that some providers offer both API options. It is worth mentioning that the
Graph API has an edge when working with larger, interconnected data sets that are exposed to
the public, where use cases are hard (and numerous) to predict. It also alleviates the pressure on
client devices in terms of computational power and required bandwidth. REST, however, remains
a better option when we know the use cases of our customers and it is feasible to prepare them
beforehand in more closed and controlled environments.</p>
      <p>We suggest the following areas for further research: When does the Graph API become better
in terms of performance to warrant the extra expense of computational power? How
interconnected must the data be to make use of the relationship-focused approach of the Graph
API? When do use-case generation tools like API management platforms cause bigger expenses
than the additional computational power of Graph APIs? In this paper, we have limited ourselves
mostly to the performance analysis of retrieving data from the server.</p>
    </sec>
    <sec id="sec-6">
      <title>Acknowledgements</title>
      <p>The authors acknowledge financial support from the Slovenian Research Agency (Research Core
Funding No. P2-0057).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>R.</given-names>
            <surname>Fielding</surname>
          </string-name>
          , “
          <article-title>Architectural Styles and the Design of Network-Based Software Architectures</article-title>
          ,” Jan.
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>B.</given-names>
            <surname>De</surname>
          </string-name>
          , “API Management,” API Management,
          <year>2017</year>
          , doi: 10.1007/978-1-
          <fpage>4842</fpage>
          -1305-6.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>D.</given-names>
            <surname>Ritter</surname>
          </string-name>
          and
          <string-name>
            <given-names>C.</given-names>
            <surname>Herrmann</surname>
          </string-name>
          , “
          <article-title>A graph API for complex business network query and traversal</article-title>
          ,”
          <source>Communications in Computer and Information Science</source>
          , vol.
          <volume>285</volume>
          CCIS, pp.
          <fpage>52</fpage>
          -
          <lpage>63</lpage>
          ,
          <year>2012</year>
          , doi: 10.1007/978-3-
          <fpage>642</fpage>
          -29166-
          <issue>1</issue>
          _5/COVER.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <article-title>[4] “Hype Cycle for APIs and</article-title>
          Business Ecosystems,
          <year>2021</year>
          .” https://www.gartner.com/document/4004085 (accessed May 28,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>E.</given-names>
            <surname>Wittern</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Cha</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J. A.</given-names>
            <surname>Laredo</surname>
          </string-name>
          , “
          <article-title>Generating GraphQL-Wrappers for REST(-like)</article-title>
          <source>APIs,” Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics)</source>
          , vol.
          <volume>10845</volume>
          LNCS, pp.
          <fpage>65</fpage>
          -
          <lpage>83</lpage>
          , Sep.
          <year>2018</year>
          , doi: 10.1007/978-3-
          <fpage>319</fpage>
          -91662-
          <issue>0</issue>
          _
          <fpage>5</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>E.</given-names>
            <surname>Wittern</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Cha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. C.</given-names>
            <surname>Davis</surname>
          </string-name>
          , G. Baudart, and L. Mandel,
          <source>“An Empirical Study of GraphQL Schemas,” Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics)</source>
          , vol.
          <volume>11895</volume>
          LNCS, pp.
          <fpage>3</fpage>
          -
          <lpage>19</lpage>
          ,
          <year>2019</year>
          , doi: 10.1007/978-3-
          <fpage>030</fpage>
          -33702-
          <issue>5</issue>
          _1/TABLES/4.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>J.</given-names>
            <surname>Weaver</surname>
          </string-name>
          and
          <string-name>
            <given-names>P.</given-names>
            <surname>Tarjan</surname>
          </string-name>
          , “
          <article-title>Facebook Linked Data via the Graph API,” Semant Web</article-title>
          , vol.
          <volume>4</volume>
          , no.
          <issue>3</issue>
          , pp.
          <fpage>245</fpage>
          -
          <lpage>250</lpage>
          , Jan.
          <year>2013</year>
          , doi: 10.3233/SW-2012-0078.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>E.</given-names>
            <surname>Lee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Kwon</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Yun</surname>
          </string-name>
          , “
          <article-title>Performance Measurement of GraphQL API in Home ESS Data Server</article-title>
          ,” in
          <source>2020 International Conference on Information and Communication Technology Convergence (ICTC)</source>
          , IEEE, Oct.
          <year>2020</year>
          , pp.
          <fpage>1929</fpage>
          -
          <lpage>1931</lpage>
          . doi:
          <volume>10</volume>
          .1109/ICTC49870.
          <year>2020</year>
          .
          <volume>9289569</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Bryant</surname>
          </string-name>
          , “
          <article-title>GraphQL for archival metadata: An overview of the EHRI GraphQL API</article-title>
          ,” in
          <source>2017 IEEE International Conference on Big Data (Big Data)</source>
          , IEEE, Dec.
          <year>2017</year>
          , pp.
          <fpage>2225</fpage>
          -
          <lpage>2230</lpage>
          . doi:
          <volume>10</volume>
          .1109/BigData.
          <year>2017</year>
          .
          <volume>8258173</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>N.</given-names>
            <surname>Vohra</surname>
          </string-name>
          and
          <string-name>
            <given-names>I. B.</given-names>
            <surname>Kerthyayana Manuaba</surname>
          </string-name>
          , “
          <article-title>Implementation of REST API vs GraphQL in Microservice Architecture,”</article-title>
          <source>Proceedings of 2022 International Conference on Information Management and Technology</source>
          ,
          <source>ICIMTech</source>
          <year>2022</year>
          , pp.
          <fpage>45</fpage>
          -
          <lpage>50</lpage>
          ,
          <year>2022</year>
          , doi: 10.1109/ICIMTECH55957.
          <year>2022</year>
          .
          <volume>9915098</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>A.</given-names>
            <surname>Lawi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. L. E.</given-names>
            <surname>Panggabean</surname>
          </string-name>
          , and T. Yoshida, “
          <article-title>Evaluating GraphQL and REST API Services Performance in a Massive and Intensive Accessible Information System</article-title>
          ,”
          <source>Computers</source>
          <year>2021</year>
          , Vol.
          <volume>10</volume>
          ,
          <string-name>
            <surname>Page</surname>
            <given-names>138</given-names>
          </string-name>
          , vol.
          <volume>10</volume>
          , no.
          <issue>11</issue>
          , p.
          <fpage>138</fpage>
          ,
          <string-name>
            <surname>Oct</surname>
          </string-name>
          .
          <year>2021</year>
          , doi: 10.3390/COMPUTERS10110138.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J. Sayago</given-names>
            <surname>Heredia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Flores-García</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A. R.</given-names>
            <surname>Solano</surname>
          </string-name>
          , “
          <article-title>Comparative Analysis Between Standards Oriented to Web Services: SOAP, REST</article-title>
          and GRAPHQL,”
          <source>Communications in Computer and Information Science</source>
          , vol.
          <volume>1193</volume>
          CCIS, pp.
          <fpage>286</fpage>
          -
          <lpage>300</lpage>
          ,
          <year>2020</year>
          , doi: 10.1007/978-3-
          <fpage>030</fpage>
          -42517-3_22/TABLES/3.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>S. K.</given-names>
            <surname>Mukhiya</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Rabbiab</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V. K. I.</given-names>
            <surname>Punax</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Rutle</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Lamo</surname>
          </string-name>
          , “
          <article-title>A GraphQL approach to Healthcare Information Exchange with HL7 FHIR,”</article-title>
          <source>Procedia Comput Sci</source>
          , vol.
          <volume>160</volume>
          , pp.
          <fpage>338</fpage>
          -
          <lpage>345</lpage>
          , Jan.
          <year>2019</year>
          , doi: 10.1016/J.PROCS.
          <year>2019</year>
          .
          <volume>11</volume>
          .082.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>A.</given-names>
            <surname>Freeman</surname>
          </string-name>
          , “Understanding GraphQL,” Pro React 16, pp.
          <fpage>679</fpage>
          -
          <lpage>705</lpage>
          ,
          <year>2019</year>
          , doi: 10.1007/978- 1-
          <fpage>4842</fpage>
          -4451-7_
          <fpage>24</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>M.</given-names>
            <surname>Seshadri</surname>
          </string-name>
          , “
          <article-title>FACEBOOK GRAPH API 26 1 Overview of the Facebook Graph API</article-title>
          ,”
          <year>2010</year>
          , Accessed: May 30,
          <year>2023</year>
          . [Online]. Available: https://graph.facebook.
          <source>com/704520608</source>
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16] “GraphQL.” http://spec.graphql.org/October2021/#sec-Schema
          <source>(accessed Jun</source>
          .
          <volume>01</volume>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <surname>“Overview - Graph API</surname>
          </string-name>
          .” https://developers.facebook.com/docs/graph-api/overview (accessed
          <source>Jun</source>
          .
          <volume>01</volume>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18] “
          <article-title>Add a GraphQL API to Azure API Management | Microsoft Learn</article-title>
          .” https://learn.microsoft.com/en-us/azure/api-management/
          <article-title>graphql-api?tabs=portal (accessed Jun</article-title>
          .
          <volume>01</volume>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <article-title>“GraphQL | How to Create a Serverless GraphQL API on AWS | Amazon Web Services (AWS)</article-title>
          .” https://aws.amazon.com/graphql/serverless-graphql-server/ (accessed Jun.
          <volume>01</volume>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20] “
          <article-title>How to manage GraphQL APIs in Apigee | Google Cloud Blog</article-title>
          .” https://cloud.google.com/blog/products/api-management/
          <article-title>how-to-manage-graphql-apisin-apigee (accessed Jun</article-title>
          .
          <volume>01</volume>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21] “GitHub - yarax/swagger-to-graphql:
          <article-title>Swagger to GraphQL API adapter</article-title>
          .” https://github.com/yarax/swagger-to-
          <source>graphql (accessed May 30</source>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <article-title>“GitHub - aweary/json-to-graphql: Create GraphQL schema from JSON files and APIs</article-title>
          .” https://github.com/aweary/json-to-
          <source>graphql (accessed May 30</source>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <article-title>“GitHub - IBM/openapi-to-graphql: Translate APIs described by OpenAPI Specifications (OAS) into GraphQL</article-title>
          .” https://github.com/ibm/openapi-to-
          <source>graphql (accessed May 30</source>
          ,
          <year>2023</year>
          ).
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>