<!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>Nemo: A Scalable and Versatile Datalog Engine</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Alex Ivliev</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Lukas Gerlach</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Simon Meusel</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jakob Steinberg</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Markus Krötzsch</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Knowledge-Based Systems Group, TU Dresden</institution>
          ,
          <addr-line>Dresden</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <fpage>43</fpage>
      <lpage>47</lpage>
      <abstract>
        <p>Nemo is a toolkit for large-scale data analysis that emphasizes robustness and ease of use. Nemo's core is a scalable and eficient main-memory reasoner that supports an expressive extension of Datalog with support for data types, existential rules, aggregates, and (stratified) negation. Built around this core is a versatile system of libraries and applications for interfacing with several data formats and programming languages, use as a web application, and IDE integration. In this system description, we present this toolkit giving a high-level overview of the system architecture as well as its supported language features.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Reasoning Engine</kwd>
        <kwd>Existential Rules</kwd>
        <kwd>Logic Programming</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        Datalog is an important rule language [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] forming the basis for many more complex formalisms such as
existential rules [
        <xref ref-type="bibr" rid="ref2 ref3">2, 3</xref>
        ] that are of interest in both theory and practice. Accordingly, many rule reasoning
systems have been presented, which we can roughly classify in the following types [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]:
1. Answer set programming solvers [
        <xref ref-type="bibr" rid="ref5 ref6">5, 6</xref>
        ] and logic programming systems such as Prolog [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]
2. Knowledge graph and database engines such as RDFox [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], VLog [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], Vadalog [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], and Graal [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]
3. Data-analytics systems such as Souflé [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], LogicBlox [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], SocialLite [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], or EmptyHeaded [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]
4. Data management frameworks such as Datomic, Google Logica, and CozoDB
      </p>
      <p>
        Despite the wide variety of tools, many systems described in the literature may not be a viable choice
in practice, due to discontinuation or access restrictions of closed-source commercial systems. In the field
of logic programming, these problems have been overcome, and advanced open-source systems such as
Clingo [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] are available to researchers, whereas the situation in other rule system categories is more
precarious. Among the mentioned systems of types (2) and (3), the only open-source tool with a release
in the past twelve months is Souflé.
      </p>
      <p>
        In this extended abstract, we summarize our recent paper [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ] on our new rule reasoning toolkit
Nemo built for applications of type (2) and (3), where the computation of logical entailments (or query
results) from a variety of inputs is the main reasoning task. Nemo’s rule language extends Datalog
with various datatypes, negation, aggregates (both stratified), and many datatype-specific functions and
operators known from query languages like SPARQL while also supporting existential rules with a fast
implementation of the restricted (or standard) chase algorithm.
      </p>
      <p>Thanks to Nemo’s modular architecture, we can provide command-line clients for all major platforms,
a public web application with a built-in rule editor, an IDE plugin for rule editing in VSCode, and
APIs for integration in several programming languages. All components of Nemo are free and open
source, and their development repositories public. Most of Nemo is written in Rust, a language that
emphasizes type and memory safety, and code quality is an explicit concern. The source code is available
at https://github.com/knowsys/nemo.</p>
    </sec>
    <sec id="sec-2">
      <title>2. System Overview</title>
      <p>
        The Nemo toolkit consists of several programs and libraries. This includes a command-line application
called nmo, and a web application1 shown in Figure 1 (left). The web application utilizes Nemo’s
WebAssembly interface, enabling it to run entirely in the browser without any installation. It features
a powerful rule editor with syntax highlighting and auto-complete, which is made possible by Nemo’s
implementation of the open language server protocol [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. This also enables advanced editor support for
Nemo’s rule language within compatible IDEs, such as VSCode. Nemo further provides a Python and Rust
developer API, which expose import/export, the reasoner, and give access to the internal rule structure.
      </p>
      <p>
        The core of Nemo is a fast and scalable reasoner that materializes logical consequences using semi-naive
bottom-up evaluation [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. For any inference that is computed, Nemo can also provide a computation trace
that encodes a proof tree. This trace is available in machine-readable JSON format or in more visual
representations. Figure 1 (right) shows an example use of this feature on the console.
      </p>
      <p>
        Nemo keeps data in-memory, representing tables as hierarchically-sorted, column-based tables, following
the design in VLog [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. In contrast to VLog, our columns support domain elements of several types:
ifxed-size values (e.g., 32bit floats or 64bit signed integers) are stored directly, while variable-sized data
(e.g., strings and IRIs) is first mapped to integer ids through a dictionary. Data in columns is further
compressed using Run-Length-Encoding with increments. Tables in Nemo are accessible via trie iterators
[
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], which makes it possible to utilize the leapfrog trie-join [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ], a multi-way, worst-case optimal join
algorithm. In this setting, query plans are largely determined by the variable (column) order, which we
heuristically determine by searching for orders that avoid ineficiencies like cross-products and excessive
reordering of tables. The implementation for operations like union or diference also make use of this
trie-based access. Projection and resorting of tables cannot be implemented eficiently in this way, however,
and require row-based temporary tables.
      </p>
      <p>
        Nemo’s eficient storing mechanism combined with its use of state-of-the-art join algorithm and
additional optimizations makes its performance competitive with other mature systems, often outperforming
them on our benchmarks [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. We were surprised that our browser-based Nemo Web often competed for
second place in these evaluations. Our experiments with a version of the Wikidata knowledge graph [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]
show that Nemo can reason with data sets of several billion triples. Further details on these evaluations
can be found in Section 5 of [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ].
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Language Features</title>
      <p>
        Nemo’s rule language is based on Datalog [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], which is extended with many features of modern query and
rule languages.2 The syntax largely follows common logic programming conventions, representing rules
as implications consisting of conjunctions of first-order atoms where variables are universally quantified.
      </p>
      <sec id="sec-3-1">
        <title>1The web application is available at: https://tools.iccl.inf.tu-dresden.de/nemo/ 2A full documentation can be found here: https://knowsys.github.io/nemo-doc/</title>
        <p>
          Nemo supports recursion and further allows notation used in the query language SPARQL [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ], which
provides a robust encoding of identifiers, including special characters and data types, as illustrated next:
1 parents(&lt;https://example.org/daphne&gt;, carla, bob). parents(alice, carla, bob) .
2 nameAndYearOfBirth(alice, "Alice Müller", 2003) .
3
4 child(?C, ?M), child(?C, ?F) :- parents(?C, ?M, ?F) .
5 sibling(?C, ?D) :- child(?C, ?P), child(?D, ?P), ?C != ?D .
        </p>
        <p>Lines 1–2 provide three facts, illustrating basic syntax for various kinds of data. In
general, all syntactic forms available in RDF and SPARQL can be used, e.g., "論理学"@ja and
"3.1"^^&lt;http://www.w3.org/2001/XMLSchema#float&gt;. Lines 4–5 show two simple rules, where
? marks variables and != denotes inequality. Nemo also supports non-monotonic negation using “~”:
6 onlyChild(?C) :- child(?C, _), ~sibling(?C, _) .</p>
        <p>
          As usual in logic programming, anonymous body variables are denoted by _ and treated like diferent
variables, i.e. variables _ in Line 6 are distinct. Moreover, Nemo considers variables that occur only in
negated body atoms to be existentially quantified beneath the negation. Hence, ~sibling(?C,_) requires
that all sibling facts do not match this pattern, whereas child(?C,_) requires some matching fact. A
similar convention is used in the answer set programming, e.g., in current versions of Clingo [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ].
        </p>
        <p>Data Import and Export External data can be imported into Nemo using the following syntax:
7 @import parents :- csv { resource = "parents.csv.gz", limit = 100 } .
8 @import nameAndYearOfBirth :- csv { resource = "https://www.data.com/name_year.csv" } .</p>
        <p>When providing an online resource through a URL as shown in Line 8, data will be downloaded upon
program evaluation. Currently, Nemo is able to process data encoded as CSV (with user-set delimiter)
or RDF. For RDF, triples (NTriples, Turtle, RDF/XML) and quads (TRiG, NQuads) are supported. All
formats are available for export using analogous syntax via the @export directive. On the command-line,
results may also be printed on the console. Various details of the import and export can be controlled
through optional parameters, and data can be processed with GZip compression.</p>
        <p>Datatypes and Functions Nemo natively supports values of many diferent data types, including
integer, string, language-tagged string, single and double precision float, and Boolean. To manipulate
such values, Nemo ofers a wide range of built-in functions, which largely correspond with SPARQL
FILTER expressions. Such functions include standard arithmetic operators and mathematical functions on
numbers such as SQRT, functions for string manipulation such as CONCAT, Boolean operators, as well as
comparison operators such as &lt; or !=. Functions can be nested arbitrarily and may occur anywhere in
the rule. Bindings for any variable used within a function must be suficiently determined, similar to the
standard safety condition used for Datalog rules.</p>
        <p>Nemo is dynamically typed and therefore allows values of any type to be used in any position, without
requiring a fixed schema. Most functions, such as STRLEN are not defined for all types of inputs, instead
producing no result when given a value of unsupported type.</p>
        <p>Aggregation</p>
      </sec>
      <sec id="sec-3-2">
        <title>Nemo supports common aggregates such as #count, #sum, or #max, as shown next:</title>
        <p>9 childCount(?P, #count(?C)) :- child(?C, ?P) .</p>
        <p>Rule 9 counts, for each value of ?P, the number of distinct values of ?C that satisfy the rule body. We
distinguish three kinds of variables: aggregate variables occur in aggregate functions (in the head),
group-by variables are the head variables that are not aggregate variables; and body-only variables that
do not appear in the head. Aggregation is evaluated as follows: (1) find all rule matches, (2) project away
bindings of body-only variables and remove duplicates that agree on all remaining variables, (3) group the
set of projected matches by distinct values of group-by variables, and (4) apply the aggregation function
on each group. Duplicate elimination in (2) means we always aggregate over sets, corresponding to the
keyword DISTINCT in many query languages. Users control the semantics through variables in the head:
10 sum1(?A, ?B, #sum(?N)) :- p(?A, ?B, ?N) .
11 sum2(?A, #sum(?N, ?B)) :- p(?A, ?B, ?N) .
12 sum3(?A, #sum(?N)) :- p(?A, ?B, ?N) .</p>
        <p>
          Rule 10 sums up the numbers N for each pair of As and Bs; rule 11 sums up the Ns from all pairs of Ns
and Bs for each A (possibly having the same N value); and rule 12 sums up the distinct Ns for each A.
Existential Rules Existential rules, also known as tuple-generating dependencies, are an important
formalism used to describe integrity constraints [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ] or to formulate dependencies within a data exchange
setting [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ]. Syntactically, they are represented by introducing existentially quantified variables in the rule
head, denote by ! in Nemo, as shown in the next example:
13 child(?C, !P), child(!P, ?G) :- grandchild(?C, ?G) .
        </p>
        <p>
          Nemo supports reasoning over existential rules by implementing the restricted (a.k.a. standard) chase
[
          <xref ref-type="bibr" rid="ref2 ref3">2, 3</xref>
          ]. For each match of the body of rule 13, Nemo creates a fresh value for !P, provided that the head is
not satisfied for any existing value yet. Fresh values are represented in Nemo by named nulls, which we
treat as a separate type of domain element distinct from other elements. Named nulls are identified with
RDF blank nodes in data import and export, and denoted accordingly (using notation like _:42).
        </p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Conclusion and Future Work</title>
      <p>Nemo is a comprehensive framework for rule reasoning that includes a scalable rule engine, a feature-rich
rule language, and advanced user interfaces with strong developer support. Further development of Nemo
will focus on enhancing its expressive power by introducing native support for complex types such function
terms and sets, and adding user-defined functions to increase flexibility and unlocking additional use
cases. To further improve performance, we will transition Nemo’s implementation to being able to utilize
multi-threading. Next steps to improve developer tools include better highlighting of static analysis results
to the user and better tracing support in the Nemo web application, which will simplify debugging and
create a more robust and explainable reasoning system.</p>
    </sec>
    <sec id="sec-5">
      <title>Acknowledgments</title>
      <p>This work is in part supported by Deutsche Forschungsgemeinschaft in project number 389792660
(TRR 248, CPEC), by the Bundesministerium für Bildung und Forschung under European ITEA project
01IS21084 (InnoSale), in the Center for Scalable Data Analytics and Artificial Intelligence (ScaDS.AI),
and by BMBF and DAAD in project 57616814 (SECAI).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>S.</given-names>
            <surname>Abiteboul</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Hull</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Vianu</surname>
          </string-name>
          , Foundations of Databases, Addison Wesley,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>M.</given-names>
            <surname>Benedikt</surname>
          </string-name>
          , G. Konstantinidis,
          <string-name>
            <given-names>G.</given-names>
            <surname>Mecca</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Motik</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Papotti</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Santoro</surname>
          </string-name>
          , E. Tsamoura,
          <article-title>Benchmarking the chase</article-title>
          ,
          <source>in: Proc. 36th Symp. on Principles of Database Systems (PODS'17)</source>
          , ACM,
          <year>2017</year>
          , pp.
          <fpage>37</fpage>
          -
          <lpage>52</lpage>
          . doi:
          <volume>10</volume>
          .1145/3034786.3034796.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>M.</given-names>
            <surname>Mugnier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Thomazo</surname>
          </string-name>
          ,
          <article-title>An introduction to ontology-based query answering with existential rules, in: Reasoning Web: Reasoning on the Web in the Big Data Era -</article-title>
          10th
          <source>Int. Summer School</source>
          , volume
          <volume>8714</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2014</year>
          , pp.
          <fpage>245</fpage>
          -
          <lpage>278</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -10587-1\_6.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>A.</given-names>
            <surname>Ivliev</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ellmauthaler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Gerlach</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Marx</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Meißner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Meusel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Krötzsch</surname>
          </string-name>
          , Nemo:
          <article-title>First glimpse of a new rule engine</article-title>
          ,
          <source>in: Proc. 39th Int. Conf. on Logic Programming (ICLP'23)</source>
          , volume
          <volume>385</volume>
          <source>of EPTCS</source>
          ,
          <year>2023</year>
          , pp.
          <fpage>333</fpage>
          -
          <lpage>335</lpage>
          . doi:
          <volume>10</volume>
          .4204/EPTCS.385.35.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>M.</given-names>
            <surname>Gebser</surname>
          </string-name>
          , B. Kaufmann, T. Schaub,
          <article-title>Conflict-driven answer set solving: From theory to practice, Artif</article-title>
          . Intell.
          <volume>187</volume>
          (
          <year>2012</year>
          )
          <fpage>52</fpage>
          -
          <lpage>89</lpage>
          . doi:
          <volume>10</volume>
          .1016/j.artint.
          <year>2012</year>
          .
          <volume>04</volume>
          .001.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>M.</given-names>
            <surname>Alviano</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Calimeri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Dodaro</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Fuscà</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Leone</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Perri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Ricca</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Veltri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Zangari</surname>
          </string-name>
          ,
          <article-title>The ASP system DLV2</article-title>
          ,
          <source>in: Proc. 14th Int. Conf. on Logic Programming and Nonmonotonic Reasoning (LPNMR'17)</source>
          , volume
          <volume>10377</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2017</year>
          , pp.
          <fpage>215</fpage>
          -
          <lpage>221</lpage>
          . doi:
          <volume>10</volume>
          .1007/ 978-3-
          <fpage>319</fpage>
          -61660-5_
          <fpage>19</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>P.</given-names>
            <surname>Körner</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Leuschel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Barbosa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V. S.</given-names>
            <surname>Costa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Dahl</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. V.</given-names>
            <surname>Hermenegildo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. F.</given-names>
            <surname>Morales</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Wielemaker</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Diaz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Abreu</surname>
          </string-name>
          ,
          <article-title>Fifty years of Prolog and beyond</article-title>
          ,
          <source>Theory Pract. Log. Program</source>
          .
          <volume>22</volume>
          (
          <year>2022</year>
          )
          <fpage>776</fpage>
          -
          <lpage>858</lpage>
          . doi:
          <volume>10</volume>
          .1017/S1471068422000102.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Nenov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Piro</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Motik</surname>
          </string-name>
          ,
          <string-name>
            <given-names>I.</given-names>
            <surname>Horrocks</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Wu</surname>
          </string-name>
          ,
          <string-name>
            <surname>J. Banerjee,</surname>
          </string-name>
          <article-title>RDFox: A highly-scalable RDF store</article-title>
          ,
          <source>in: Proc. 14th Int. Semantic Web Conf. (ISWC'15)</source>
          ,
          <string-name>
            <surname>Part</surname>
            <given-names>II</given-names>
          </string-name>
          , volume
          <volume>9367</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2015</year>
          , pp.
          <fpage>3</fpage>
          -
          <lpage>20</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -25010-
          <issue>6</issue>
          _
          <fpage>1</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>J.</given-names>
            <surname>Urbani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Jacobs</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Krötzsch</surname>
          </string-name>
          ,
          <article-title>Column-oriented Datalog materialization for large knowledge graphs</article-title>
          ,
          <source>in: Proc. 30th AAAI Conf. on Artificial Intelligence (AAAI'16)</source>
          , AAAI Press,
          <year>2016</year>
          , pp.
          <fpage>258</fpage>
          -
          <lpage>264</lpage>
          . doi:
          <volume>10</volume>
          .1609/aaai.v30i1.
          <fpage>9993</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>L.</given-names>
            <surname>Bellomarini</surname>
          </string-name>
          , E. Sallinger,
          <string-name>
            <surname>G.</surname>
          </string-name>
          <article-title>Gottlob, The Vadalog system: Datalog-based reasoning for knowledge graphs</article-title>
          ,
          <source>Proc. VLDB Endowment</source>
          <volume>11</volume>
          (
          <year>2018</year>
          )
          <fpage>975</fpage>
          -
          <lpage>987</lpage>
          . doi:
          <volume>10</volume>
          .14778/3213880.3213888.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>J.</given-names>
            <surname>Baget</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Leclère</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Mugnier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Rocher</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Sipieter</surname>
          </string-name>
          ,
          <article-title>Graal: A toolkit for query answering with existential rules</article-title>
          ,
          <source>in: Proc. 9th Int. Web Rule Symposium (RuleML'15)</source>
          , volume
          <volume>9202</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2015</year>
          , pp.
          <fpage>328</fpage>
          -
          <lpage>344</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -21542-6\_
          <fpage>21</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>H.</given-names>
            <surname>Jordan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Scholz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Subotic</surname>
          </string-name>
          , Souflé:
          <article-title>On synthesis of program analyzers</article-title>
          ,
          <source>in: Proc. 28th Int. Conf. on Computer Aided Verification (CAV'16)</source>
          ,
          <string-name>
            <surname>Part</surname>
            <given-names>II</given-names>
          </string-name>
          , volume
          <volume>9780</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2016</year>
          , pp.
          <fpage>422</fpage>
          -
          <lpage>430</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -41540-6_
          <fpage>23</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>M.</given-names>
            <surname>Aref</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            ten
            <surname>Cate</surname>
          </string-name>
          , T. J.
          <string-name>
            <surname>Green</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Kimelfeld</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Olteanu</surname>
            , E. Pasalic,
            <given-names>T. L.</given-names>
          </string-name>
          <string-name>
            <surname>Veldhuizen</surname>
          </string-name>
          , G. Washburn,
          <article-title>Design and implementation of the LogicBlox system</article-title>
          ,
          <source>in: Proc. 2015 ACM SIGMOD Int. Conf. on Mngmt of Data</source>
          ,
          <year>2015</year>
          , pp.
          <fpage>1371</fpage>
          -
          <lpage>1382</lpage>
          . doi:
          <volume>10</volume>
          .1145/2723372.2742796.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>J.</given-names>
            <surname>Seo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Guo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. S.</given-names>
            <surname>Lam</surname>
          </string-name>
          ,
          <string-name>
            <surname>SociaLite:</surname>
          </string-name>
          <article-title>An eficient graph query language based on datalog</article-title>
          ,
          <source>IEEE Trans. Knowl. Data Eng</source>
          .
          <volume>27</volume>
          (
          <year>2015</year>
          )
          <fpage>1824</fpage>
          -
          <lpage>1837</lpage>
          . doi:
          <volume>10</volume>
          .1109/TKDE.
          <year>2015</year>
          .
          <volume>2405562</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>C. R.</given-names>
            <surname>Aberger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Tu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Olukotun</surname>
          </string-name>
          , C. Ré,
          <article-title>EmptyHeaded: A relational engine for graph processing</article-title>
          ,
          <source>in: Proc. 2016 ACM SIGMOD Int. Conf. on Management of Data, ACM</source>
          ,
          <year>2016</year>
          , pp.
          <fpage>431</fpage>
          -
          <lpage>446</lpage>
          . doi:
          <volume>10</volume>
          .1145/3129246.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>M.</given-names>
            <surname>Gebser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Kaminski</surname>
          </string-name>
          , B. Kaufmann, T. Schaub,
          <article-title>Multi-shot ASP solving with clingo</article-title>
          ,
          <source>Theory Pract. Log. Program</source>
          .
          <volume>19</volume>
          (
          <year>2019</year>
          )
          <fpage>27</fpage>
          -
          <lpage>82</lpage>
          . doi:doi.org/10.1017/S1471068418000054.
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>A.</given-names>
            <surname>Ivliev</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Gerlach</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Meusel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Steinberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Krötzsch</surname>
          </string-name>
          , Nemo:
          <article-title>Your friendly and versatile rule reasoning toolkit</article-title>
          ,
          <source>in: Proc. 21st Int. Conf. on Principles of Knowledge Representation and Reasoning (KR'24)</source>
          ,
          <year>2024</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <surname>LSP</surname>
          </string-name>
          ,
          <article-title>Oficial page for Language Server Protocol</article-title>
          , Microsoft,
          <year>2024</year>
          . https://microsoft.github.io/ language-server-protocol/, accessed May
          <year>2024</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>E.</given-names>
            <surname>Fredkin</surname>
          </string-name>
          , Trie memory,
          <source>Commun. ACM</source>
          <volume>3</volume>
          (
          <year>1960</year>
          )
          <fpage>490</fpage>
          -
          <lpage>499</lpage>
          . doi:
          <volume>10</volume>
          .1145/367390.367400.
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>T. L.</given-names>
            <surname>Veldhuizen</surname>
          </string-name>
          ,
          <article-title>Triejoin: A simple, worst-case optimal join algorithm</article-title>
          ,
          <source>in: Proc. 17th Int. Conf. on Database Theory (ICDT'14)</source>
          ,
          <year>2014</year>
          , pp.
          <fpage>96</fpage>
          -
          <lpage>106</lpage>
          . doi:
          <volume>10</volume>
          .5441/002/icdt.
          <year>2014</year>
          .
          <volume>13</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>D.</given-names>
            <surname>Vrandečić</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Krötzsch</surname>
          </string-name>
          ,
          <article-title>Wikidata: a free collaborative knowledgebase</article-title>
          ,
          <source>Commun. ACM</source>
          <volume>57</volume>
          (
          <year>2014</year>
          )
          <fpage>78</fpage>
          -
          <lpage>85</lpage>
          . doi:
          <volume>10</volume>
          .1145/2629489.
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>S.</given-names>
            <surname>Harris</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . Seaborne (Eds.),
          <source>SPARQL 1.1 Query Language, W3C Recommendation, 21 March</source>
          <year>2013</year>
          . Available at http://www.w3.org/TR/sparql11-query/.
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>C.</given-names>
            <surname>Beeri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. Y.</given-names>
            <surname>Vardi</surname>
          </string-name>
          ,
          <article-title>A proof procedure for data dependencies</article-title>
          ,
          <source>J. ACM</source>
          <volume>31</volume>
          (
          <year>1984</year>
          )
          <fpage>718</fpage>
          -
          <lpage>741</lpage>
          . doi:
          <volume>10</volume>
          .1145/1634.1636.
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>R.</given-names>
            <surname>Fagin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P. G.</given-names>
            <surname>Kolaitis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R. J.</given-names>
            <surname>Miller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Popa</surname>
          </string-name>
          ,
          <article-title>Data exchange: semantics and query answering</article-title>
          ,
          <source>Theoretical Computer Science</source>
          <volume>336</volume>
          (
          <year>2005</year>
          )
          <fpage>89</fpage>
          -
          <lpage>124</lpage>
          . doi:
          <volume>10</volume>
          .1016/j.tcs.
          <year>2004</year>
          .
          <volume>10</volume>
          .033.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>