<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>Vienna, Austria
* Corresponding author.
$ piotr@neverblink.eu (P. Sowiński); karolina@neverblink.eu (K. Bogacka); anastasiya@neverblink.eu (A. Danilenka);
nikita@neverblink.eu (N. Kozlov)
 https://ostrzyciel.eu/ (P. Sowiński)</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Jelly: a Fast and Convenient RDF Serialization Format</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Piotr Sowiński</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Karolina Bogacka</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Anastasiya Danilenka</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Nikita Kozlov</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>NeverBlink</institution>
          ,
          <addr-line>ul. Wspólna 56, 00-684 Warsaw</addr-line>
          ,
          <country country="PL">Poland</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Warsaw University of Technology</institution>
          ,
          <addr-line>Pl. Politechniki 1, 00-661 Warsaw</addr-line>
          ,
          <country country="PL">Poland</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2025</year>
      </pub-date>
      <volume>000</volume>
      <fpage>0</fpage>
      <lpage>0002</lpage>
      <abstract>
        <p>Existing RDF serialization formats such as Turtle, N-Quads, and JSON-LD are widely used for communication and storage in knowledge graph and Semantic Web applications. However, they sufer from limitations in performance, compression ratio, and lack of native support for RDF streams. To address these shortcomings, we introduce Jelly, a fast and convenient binary serialization format for RDF data that supports both batch and streaming use cases. Jelly is designed to maximize serialization throughput, reduce file size with lightweight streaming compression, and minimize compute resource usage. Built on Protocol Bufers, Jelly is easy to integrate with modern programming languages and RDF libraries. To maximize reusability, Jelly has an open protocol specification, open-source implementations in Java and Python integrated with popular RDF libraries, and a versatile command-line tool. To illustrate its usefulness, we outline concrete use cases where Jelly can provide tangible benefits. We consider that by combining practical usability with state-of-the-art eficiency, Jelly is an important contribution to the Semantic Web tool stack.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;RDF</kwd>
        <kwd>Serialization format</kwd>
        <kwd>RDF stream processing</kwd>
        <kwd>Knowledge graphs</kwd>
        <kwd>Semantic Web data formats</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
    </sec>
    <sec id="sec-2">
      <title>2. Jelly Protocol</title>
      <p>
        Jelly is a binary serialization format for streams of RDF triples, quads, graphs, or datasets [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. It can
be used in place of W3C-standard formats like N-Quads or Turtle, to simply represent a sequence of
statements (a flat RDF stream in the RDF Stream Taxonomy [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]). It can also be used to represent a
sequence of graphs or datasets (grouped RDF stream) – this would be a series of files in W3C-standard
formats. A Jelly file is split into frames, where each frame corresponds to either a batch of RDF
statements, or a complete RDF graph/dataset. In streaming settings (e.g., Kafka, gRPC), each frame
corresponds to a separate message, allowing for eficient compression over the entire stream.
Serialization. Jelly uses the industry-standard Protocol Bufers (Protobuf) serialization framework
as its basis. The binary layout of Jelly is specified in a Protobuf interface definition file, which can
then be used by compilers to generate serialization/deserialization code in one of the many supported
programming languages (e.g., C++, Python, Java, Rust, C#). This greatly simplifies implementing the
format, as all binary-level manipulation code is generated automatically, and the developer only needs
to implement a translation layer between Protobuf messages and RDF types of the given library. The
mechanism for this translation is defined in the open Jelly specification 1.
      </p>
      <p>
        Compression. The design goals of Jelly are to: (1) maximize serialization/deserialization throughput,
(2) provide a relatively good compression ratio, and (3) operate in a fully streaming manner. We
understand the third goal as meeting the common criteria for stream processing systems: process only
one triple at a time, use a limited amount of time per triple, use a limited amount of memory (overall),
output the results on demand, and adapt to temporal changes [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. This essentially would allow Jelly to
process arbitrarily large (potentially indefinite) RDF files in constant memory.
      </p>
      <p>
        To meet these criteria, Jelly employs a streaming compression algorithm, defined in the
aforementioned specification. The full description of the algorithm is beyond the scope of this contribution –
here we provide only a brief summary. Three fixed-sized string lookup tables indexed by integers are
used, for IRI prefixes, sufixes, and datatypes. The serializer populates these tables until they are full,
after which old lookup entries can be replaced by new ones using any policy (e.g., least recently used).
This allows for processing datasets of indefinite size, as old lookup IDs can be reused. In triples and
quads, IRIs are constructed as a pair of integer identifiers of the relevant prefix and sufix, referencing
the lookup tables. These identifiers are represented as variable-length integers, to minimize their size.
Additionally, simple delta compression is applied, with the value of zero having a special meaning
(repeat last ID or increment it by one, depending on context). Because in Protobuf an integer with a
value of zero is represented with zero bytes, this provides a very eficient compression mechanism.
For consecutive RDF statements with repeating terms (e.g., same triple subject), the repeated term is
not serialized, further reducing file size – this is analogous to semicolons and colons in Turtle. These
compression methods are relatively easy to implement and can work in a fully streaming manner,
processing one triple at a time. They work to both reduce file size and to speed up processing, as less
data written/read corresponds to less memory bandwidth, which is usually the constraining factor.
Performance. We regularly publish performance benchmarks for the Jelly-JVM implementation
on the Jelly website2, using a diverse mix of datasets from RiverBench [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. In summary, Jelly-JVM
2.7.0 achieves an average compression ratio of 16.2% (compared to a baseline of 100% for N-Triples),
serialization speed of 7.28 MT/s (millions of triples per second), and deserialization speed of 15.16 MT/s
with Eclipse RDF4J. As far as we are aware, this currently makes Jelly the most compressed and the
fastest RDF format implemented in either Apache Jena or RDF4J.
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Implementations and Tooling</title>
      <p>Jelly currently has implementations for Python and the Java Virtual Machine. Both implementations
are designed around a generic core that can be used in conjunction with multiple diferent RDF libraries
– at the moment supported are: Apache Jena, Eclipse RDF4J, Titanium RDF API, and RDFLib.</p>
      <sec id="sec-3-1">
        <title>1https://w3id.org/jelly/dev/specification/serialization 2https://w3id.org/jelly/dev/performance</title>
        <sec id="sec-3-1-1">
          <title>3.1. Java Virtual Machine: Jelly-JVM</title>
          <p>Jelly-JVM3 is the more mature and heavily optimized implementation. It is organized into a set of
modular components. The jelly-core module encapsulates the base functionality for encoding,
decoding and transcoding Jelly data, independent of any particular RDF library, along with necessary
utilities and abstractions to facilitate the development of integrations with various RDF libraries. The
jelly-jena module provides full interoperability with Apache Jena by converting between Jelly
Protobuf messages and Jena’s data structures. It includes an integration with Jena’s RIOT subsystem,
making it possible to use Jelly in Jena just like any other RDF format (e.g., Turtle), including proper
support for content negotiation. Module jelly-rdf4j ofers analogous adapters for Eclipse RDF4J, in
addition to an integration with the Rio serialization subsystem. Module jelly-titanium-rdf-api
supplies an adapter layer for the minimalistic Titanium RDF API. Finally, the jelly-pekko-stream
module written in Scala integrates with the powerful Apache Pekko Streams framework, allowing for
eficient and scalable processing of RDF streams in more advanced use cases (e.g., IoT data aggregation).</p>
          <p>Jelly-JVM can be used as a plugin with Jena or RDF4J4. For example, for Apache Jena Fuseki, full Jelly
support can be installed by placing the plugin JAR in the extra/ directory of the Fuseki installation.
This will enable full support in SPARQL UPDATE queries, the graph store protocol, and in the graphical
user interface. Alternatively, for programmatic use, one can include either the jelly-jena (for Jena)
or jelly-rdf4j (for RDF4J) Maven artifact by adding the following to pom.xml:
&lt;dependency&gt;
&lt;groupId&gt;eu.neverblink.jelly&lt;/groupId&gt;
&lt;artifactId&gt;jelly-jena&lt;/artifactId&gt;
&lt;version&gt;3.4.0&lt;/version&gt;
&lt;/dependency&gt;</p>
          <p>This pulls in jelly-core and all necessary converters. With this dependency in place, Jelly support
is registered with Jena or RDF4J automatically, enabling the use of Jelly as an RDF format in code. For
example, one can load a Jelly-serialized graph via Jena RIOT using:
Model m = RDFDataMgr.loadModel("https://w3id.org/riverbench/v/2.1.0.jelly");</p>
        </sec>
      </sec>
      <sec id="sec-3-2">
        <title>To write this graph back to a Jelly file, one can call:</title>
        <p>RDFDataMgr.write(new FileOutputStream("m.jelly"), m, JellyLanguage.JELLY);</p>
        <p>Streaming serialization/deserialization with Jena, RDF4J, and Titanium is also possible, hooking into
the iterator-like interfaces of these libraries, which allows for processing RDF data one statement at a
time5. Using the Pekko Streams integration, it is also possible to manipulate RDF data in more complex
ways, e.g., batching a stream of quads into a stream of datasets6 and sending it to a Kafka topic.
3.2. Python: pyjelly
pyjelly7 is a Python implementation of Jelly, designed to make the benefits of the format accessible to
the broad Python audience. Distributed through PyPI8, it can be easily installed on all major operating
systems (Linux, Windows, macOS) using standard Python package managers such as pip. To support
users in getting started with pyjelly, a documentation suite is available9 including usage examples,
up-to-date functionality information, and an API reference.
3https://w3id.org/jelly/jelly-jvm
4https://w3id.org/jelly/jelly-jvm/dev/getting-started-plugins/
5https://w3id.org/jelly/jelly-jvm/dev/user/rdf4j
6https://w3id.org/jelly/jelly-jvm/dev/user/reactive
7https://github.com/Jelly-RDF/pyjelly
8https://pypi.org/project/pyjelly/
9https://w3id.org/jelly/pyjelly</p>
        <p>Like Jelly-JVM, pyjelly also has a generic serialization core, on top of which integrations with other
libraries are built. Currently, the popular RDFLib library is supported in this manner along with
integrations for Neo4j and NetworkX, however, more integrations are planned. Serializing an RDFLib
graph to the Jelly format is as simple as installing pyjelly with RDFLib support, e.g., pip install
pyjelly[rdflib], and specifying the Jelly format during serialization. As shown below, this is as
easy as using built-in RDFLib formats:
from rdflib import Graph
g = Graph()
g.parse("https://www.w3.org/2013/N-TriplesTests/nt-syntax-subm-01.nt")
g.serialize(destination="triples.jelly", format="jelly")</p>
      </sec>
      <sec id="sec-3-3">
        <title>Similarly, a Jelly file can be parsed back to an RDFLib Graph:</title>
        <p>g = Graph()
g.parse("triples.jelly", format="jelly")</p>
        <sec id="sec-3-3-1">
          <title>3.3. Command-Line Tool: jelly-cli</title>
          <p>To make it easier to use Jelly in production, development, and CI pipelines, we have developed a
user-friendly command-line tool, jelly-cli10. This utility supports manipulating Jelly files without
the need to write any code beyond a single terminal command. jelly-cli supports the adoption and
growth of the Jelly ecosystem by lowering the barrier to entry and helps with common development
tasks. Below we briefly showcase several commands supported by jelly-cli (version 0.5.1):
• Convert RDF to Jelly: jelly-cli rdf to-jelly input.nq --to=out.jelly
This command converts RDF data written in any W3C-standard format into Jelly. Additional
options allow for configuring the compression settings.
• Convert Jelly to RDF: jelly-cli rdf from-jelly input.jelly --to=out.ttl
This command converts a Jelly file to a chosen RDF syntax. Supported formats include
W3Cstandard formats and a human-readable version of Jelly, useful for debugging (jelly-text).
• Inspect a specific Jelly frame in human-readable binary form: jelly-cli rdf
from-jelly input.jelly --out-format=jelly-text --take-frames=3..5
Combined with jelly-text, the --take-frames flag allows extracting individual frames for
direct inspection and debugging of parts of the Jelly file.
• Merge and transcode Jelly files: cat in1.jelly in2.jelly in3.jelly | jelly-cli
rdf transcode --to=merged.jelly --opt.max-name-table-size=8192
The transcode command allows for merging multiple Jelly files into one, as well as recompressing
the contents with new settings, using a very eficient transcoding algorithm.
• Collect Jelly file statistics: jelly-cli rdf inspect ./in.jelly --per-frame=true
Summarizes information about the Jelly file’s contents and used compression options. When run
with --per-frame=true, returns detailed statistics for each frame.
• Validate a Jelly file: jelly-cli rdf validate file.jelly</p>
          <p>Validates the Jelly file and optionally compares its contents against a reference RDF file. This
command can also verify whether specific compression options were used during serialization.</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Use Cases</title>
      <p>Jelly was designed to flexibly fit the requirements of many practical use cases, improving processing
speed and reducing compute resource usage. Below we list the intended technical use cases, along with
two examples of how Jelly is used in other projects.
• Client-server communication – for example, a frontend component can be eficiently linked
to the backend. Jelly can reduce the latency between user input and the result, improving the
user experience.
• Inter-service communication – complex backend applications often consist of a network of
microservices that must exchange RDF data (e.g., databases, cron job workers, analytics pipelines).</p>
      <p>
        Jelly can be integrated into existing APIs or with a complete gRPC stack, improving eficiency.
• Database dumps and bulk loads – large RDF datasets can be quickly written and read with
Jelly, while taking up less storage space. This can reduce the time needed for routine database
maintenance tasks and help minimize infrastructure costs.
• Streaming ingest – Jelly can eliminate ingestion bottlenecks in systems processing large amounts
of streaming data, improving responsiveness, and allowing the system to scale to larger problems.
• Database replication and change capture – changes to append-only databases can be recorded
with the Jelly-RDF protocol described in Section 2. Additionally, add/delete operations with
transaction support can be recorded using the Jelly-Patch format11, based on RDF Patch.
Example use case 1: Nanopublication Network. The Nanopublication Network is a decentralized
infrastructure for publishing and querying scientific knowledge using Semantic Web technologies [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. It
consists of various services (e.g., storage, querying) exchanging small RDF datasets – nanopublications.
This inter-service communication has proven to be a bottleneck, mainly due to the need for requesting
each nanopublication individually which adds overhead. We switched over the communication to Jelly
streams over HTTP, which reduced the time to retrieve 60,000 nanopubs from the server from over an
hour to less than 4 seconds. This solution is now used in the live Nanopublication Network12.
Example use case 2: RiverBench. RiverBench13 is a community-driven collaborative benchmark
suite for RDF systems [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Each dataset in RiverBench is distributed as both a single N-Quads file (flat
RDF stream) and an archive containing a sequence of TriG files (grouped RDF stream). We have added
Jelly as a third option that can replace both of these distribution formats. Jelly natively supports streams
of graphs/datasets, which simplifies parsing the file, removing the need to manipulate TAR archive
entries. On top of that, Jelly is much faster to parse, reducing the time needed to set up a benchmark.
      </p>
    </sec>
    <sec id="sec-5">
      <title>5. Related Work</title>
      <p>
        Several eficient binary formats for streaming RDF data were proposed in the past, such as ERI [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]
or S-HDT [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. However, to the best of our knowledge, none have public implementations compatible
with any modern RDF library, and therefore they are not usable in practice. The Jelly protocol uses the
ifndings from these studies, but also focuses on broader tooling support and usability in general.
      </p>
      <p>
        Both Apache Jena and Eclipse RDF4J have their own binary formats. In Jena, there are two nearly
identical formats (one based on Apache Thrift, the other on Protobuf) that have no built-in compression
and are largely analogous to N-Triples [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. RDF4J has a compressed binary format that uses streamed
dictionary compression (similar to Jelly) and a custom serialization framework [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. In our benchmarks,
RDF4J Binary is by far the closest contender to Jelly, with similar compression ratios, 1.09–1.31x slower
serialization, and 1.96–2.14x slower deserialization than Jelly-JVM 2.7.014. However, none of these
formats has a complete, up-to-date specification, and they only work within one ecosystem (either Jena
or RDF4J), limiting their impact on the community. They also do not support streams of graphs/datasets
(only streams of triples/quads).
      </p>
      <p>
        There are also binary RDF formats with diferent design goals than Jelly, resulting in a very diferent
set of trade-ofs. CBOR-LD is a tightly compressed binary version of JSON-LD [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. It is primarily
designed to be as compressed as possible (for use in, e.g., QR codes), while sacrificing ease of use (need
11https://w3id.org/jelly/dev/specification/patch
12https://nanopub.net
13https://w3id.org/riverbench
14https://w3id.org/jelly/dev/performance/rdf4j
to design compression contexts by hand) and serialization speed. CBOR-LD has an active community,
with a tool stack similar to Jelly, e.g., the ld-cli tool. Finally, HDT [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] is an indexed binary format
that allows for direct querying of RDF files. It does not support streaming compression, as the entire
contents of the graph must be known before writing the file. It is typically integrated with RDF libraries
as a storage backend (not a serialization format), making it applicable for diferent use cases than Jelly.
      </p>
    </sec>
    <sec id="sec-6">
      <title>6. Conclusion and Future Work</title>
      <p>In this contribution, we present Jelly, a high-performance RDF serialization format designed specifically
to be fast, easy to use, and meet the practical requirements of many real-life use cases. It is currently
integrated with several popular RDF libraries and has a CLI tool available to aid with production
workloads, as well as testing and development.</p>
      <p>We are constantly improving Jelly and its tooling. In the near future, we plan to: finalize protocol
test cases for conformance testing of implementations, expand the feature set of the Python
implementation, and integrate Jelly with commonly-used Semantic Web tools. Further plans include more
implementations (e.g., JavaScript, Rust, Kotlin), new integrations (e.g., Pandas, KGTK), adding support
for serializing SPARQL result sets, introducing new compression schemes, and temporal indexing.</p>
      <p>We invite the community to contribute to the Jelly protocol and its tooling, with feature
requests, bug reports, new integrations, documentation and more. More information on contributing
can be found here: https://w3id.org/jelly/dev/contributing</p>
      <p>This work was financially supported from the European Funds under the Sector Agnostic path of the
Huge Thing Startup Booster program (project no. 0021/2025, program FENG.02.28-IP.02-0006/23).</p>
      <p>Declaration on Generative AI. During the preparation of this work, the authors used ChatGPT in
order to draft content. After using this tool, the authors reviewed and edited the content as needed and
take full responsibility for the publication’s content.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>P.</given-names>
            <surname>Sowiński</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Wasielewska-Michniewska</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Ganzha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Paprzycki</surname>
          </string-name>
          , et al.,
          <string-name>
            <surname>Eficient</surname>
            <given-names>RDF</given-names>
          </string-name>
          <article-title>streaming for the edge-cloud continuum</article-title>
          ,
          <source>in: 2022 IEEE 8th World Forum on Internet of Things (WF-IoT)</source>
          , IEEE,
          <year>2022</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>8</lpage>
          . doi:
          <volume>10</volume>
          .1109/WF-IoT54382.
          <year>2022</year>
          .
          <volume>10152225</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>P.</given-names>
            <surname>Sowiński</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Szmeja</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Ganzha</surname>
          </string-name>
          ,
          <string-name>
            <surname>M.</surname>
          </string-name>
          <article-title>Paprzycki, RDF Stream Taxonomy: Systematizing RDF stream types in research and practice</article-title>
          ,
          <source>Electronics</source>
          <volume>13</volume>
          (
          <year>2024</year>
          )
          <fpage>2558</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Bifet</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Gavalda</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Holmes</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Pfahringer</surname>
          </string-name>
          ,
          <article-title>Machine learning for data streams: with practical examples in MOA</article-title>
          , MIT press,
          <year>2023</year>
          . Chapter 2.1: Algorithms.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>P.</given-names>
            <surname>Sowiński</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Ganzha</surname>
          </string-name>
          ,
          <article-title>Realizing a collaborative RDF benchmark suite in practice</article-title>
          ,
          <source>arXiv preprint arXiv:2410.12965, 24th International Conference on Knowledge Engineering and Knowledge Management (EKAW</source>
          <year>2024</year>
          ),
          <fpage>26</fpage>
          -28
          <source>November</source>
          <year>2024</year>
          , Amsterdam, Netherlands (
          <year>2024</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>T.</given-names>
            <surname>Kuhn</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Taelman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Emonet</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Antonatos</surname>
          </string-name>
          , et al.,
          <article-title>Semantic micro-contributions with decentralized nanopublication services</article-title>
          ,
          <source>PeerJ Computer Science</source>
          <volume>7</volume>
          (
          <year>2021</year>
          )
          <article-title>e387</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>J. D.</given-names>
            <surname>Fernández</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Llaves</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Corcho</surname>
          </string-name>
          ,
          <article-title>Eficient RDF interchange (ERI) format for RDF data streams</article-title>
          , in: International Semantic Web Conference, Springer,
          <year>2014</year>
          , pp.
          <fpage>244</fpage>
          -
          <lpage>259</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>H.</given-names>
            <surname>Hasemann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Kröller</surname>
          </string-name>
          ,
          <string-name>
            <surname>M.</surname>
          </string-name>
          <article-title>Pagel, RDF provisioning for the Internet of Things</article-title>
          ,
          <source>in: 2012 3rd IEEE International Conference on the Internet of Things</source>
          , IEEE,
          <year>2012</year>
          , pp.
          <fpage>143</fpage>
          -
          <lpage>150</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Apache</given-names>
            <surname>Software</surname>
          </string-name>
          <string-name>
            <surname>Foundation</surname>
          </string-name>
          ,
          <source>RDF binary using Apache Thrift</source>
          ,
          <year>2025</year>
          . URL: https://jena.apache. org/documentation/io/rdf-binary.
          <source>html, accessed on 12 June</source>
          <year>2025</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Eclipse</given-names>
            <surname>Foundation</surname>
          </string-name>
          , Inc.,
          <source>RDF4J binary RDF format</source>
          ,
          <year>2025</year>
          . https://rdf4j.org/documentation/ reference/rdf4j-binary/,
          <source>accessed on 12 June</source>
          <year>2025</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>M.</given-names>
            <surname>Sporny</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Longley</surname>
          </string-name>
          ,
          <source>CBOR-LD 1.0 Draft Community Group Report</source>
          ,
          <year>2025</year>
          . https://json-ld.github. io/cbor-ld-spec/,
          <source>accessed on 11 June</source>
          <year>2025</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>J. D.</given-names>
            <surname>Fernández</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. A.</given-names>
            <surname>Martínez-Prieto</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Gutiérrez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Polleres</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Arias</surname>
          </string-name>
          ,
          <article-title>Binary RDF representation for publication and exchange (HDT)</article-title>
          ,
          <source>Journal of Web Semantics</source>
          <volume>19</volume>
          (
          <year>2013</year>
          )
          <fpage>22</fpage>
          -
          <lpage>41</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>