<!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>Universal Query Language</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Piotr Wi-niewski</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Krzysztof Stencel</string-name>
          <email>stencel@mat.umk.pl</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Faculty of Mathematics and Computer Science Nicolaus Copernicus University Chopina 12/18</institution>
          ,
          <addr-line>87-100 Toru«</addr-line>
        </aff>
      </contrib-group>
      <abstract>
        <p>In the prequel paper we introduced the Unied State Model (USM), i.e. a single model that allowed conveying objects of popular programming languages and databases. That model exploited and emphasized common properties of all these objects. We showed mappings between those popular data models and USM. Our natural next research goal is the Unied Query Language (UQL). UQL is intended to be a minimalistic and elegant query language that allows expressing queries of major query languages. We plan to build a concise set of operators and show its coverage for mentioned languages' constructs. In this paper we present our initial eorts towards UQL. We present a set of language operators. We also provide a number of redolent examples of queries expressed in UQL.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        Our research originates from the so called object-relational impedance mismatch
[
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. The relational model proposed in [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] eventually became dominant in data
storage and nothing seems be a sign of a change in this respect. On the other
hand already for a couple of decades applications are mainly written using
objectoriented methods [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. It soon turned out that object methods encounter
nontrivial diculties with the persistent relational data storage. Problems of impedance
mismatch manifest themselves as (1) the mismatch of the data models, (2) the
mismatch of the binding time, (3) the mismatch of the lifecycle. The impedance
mismatch is not only related to the abovementioned paradigms. It also occurs
when trying to interconnect object-oriented programming languages and other
database systems like XML stores [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        In our prequel paper [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] we focused on the mismatch of data models. We
analysed data models of major programming languages and database systems.
Using results of this analyses we proposed the Unied State Model (USM) that
allows smooth mapping of the analysed data models. The conclusion of [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] is that
although there are minor discrepancies, data models of modern object-oriented
programming languages (e.g. Java and Python) and relational databases are
noteworthy similar. Thus the object-relational mapping systems for such
languages are feasible. The software market contains a number of proofs of this
statement (e.g. Hibernate [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] for Java, LINQ [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] for .NET language family,
django-models [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] for Python).
      </p>
      <p>Having the data model of major programming and storage environments
(USM), we were naturally tempted to pose a new research question. Is it
possible to dene a Universal Query Language (UQL) on the USM? UQL should
subsume query languages for models that were subsumed by USM. This will
supply evidence that also mapping queries between major programming and storage
systems is a not miracle but a natural consequence of numerous similarities.</p>
      <p>
        In this paper we show initial results of our research, i.e. a preliminary list
of UQL operators and a number of representative examples of queries and their
expression in UQL. Of course, the naturalness of the example mapping prove
nothing. However, it suggests that building UQL is feasible. The next genuine
step will be to establish a full set of UQL operators and to develop proofs that
UQL subsumes query part of SQL, OQL [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ], SQBL [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] and XQuery [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ].
      </p>
      <p>In fact, the success of Hibernate, observed on the market place, and
objectrelational mapping systems show that after C++ ceased to be the programming
language of the rst choice in favour of e.g. Java, Python and the C#, the
development of object-relation mapping became signicantly easier.</p>
      <p>The paper is organized as follows. In Section 2 we sketch basic denitions
of the Universal State Model (USM). Section 3 enumerates operators of the
preliminary version of the Universal Query Language (UQL). In Section 4 we
show a number of example queries and disccus their smooth mapping to UQL.
Section 5 concludes.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Universal State Model</title>
      <p>
        In this Section we remind some denition of the Unied State Model (USM)
introduced in [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. The Universal Query Language proposed in this paper processes
objects of USM.
      </p>
      <p>We use the following symbols. V is a set of atomic values. We assume that
it contains all simple values. N V is a set of external names of objects with a
chosen value 2 N to tag nameless objects. External names are used by
designers and programmers to access objects. Nameless objects can only be accessed
through object references. I V is a set of identities with a chosen value nil 2 I
to represent empty identier/address. We assume that N \ I = ;.</p>
      <p>For any set S we denote by S = Lt2N S, i.e. the set of all nite sequence
of elements of S.</p>
      <p>Denition. A state of an object of the level 0 is a triple (i; n; v) 2 I N V .
By O0 we mean the set of all states of the level 0. This set is also denoted by S0.
Denition. Let t 2 N be a positive natural number and assume that we have
dened states of objects of the level k for all k &lt; t and St 1 denotes the set of
all states of objects of the levels lesser than t. A state of an object of the level t
is a triple (i; n; L) 62 St 1 where i 2 I; n 2 N and L 2 St 1 is a nite sequence
of elements of St 1 and L 2= St 2. We assume that S 1 = ;. The set of all states
of objects of the level t will be denoted by Ot. By St = Ot [ St 1 we denote the
set of all states of objects of the levels not greater than t. Members of the list L
will be called states of subobjects of the object state o.</p>
      <p>Each object has a name, an identier and a value. This value can be simple
(like in objects of the level 0) or be a list of objects. According to the above
denition an object of level t &gt; 0, i.e. a member of Ot, has at least one subobject
of level t 1. Therefore, the level of an object is the maximum subobject nesting
depth in this object.</p>
      <sec id="sec-2-1">
        <title>Denition.</title>
        <p>S1 is the set of all states of objects of all natural levels.</p>
        <p>
          In [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ] we have formally dened the notion of proper states. In a proper state no
object identity is repeated and all object references are valid, i.e. there are no
dangling pointer objects.
        </p>
        <p>
          Since in Section 4 we use SQL queries to illustrate concepts of UQL, below we
also remind some information on the mapping between USM and the relational
model presented in [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ]. Our analysis of the relational data model is based on the
multi-set extended relational algebra [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ].
        </p>
        <p>Let R be a relational schema, also called the type of a relation denoted by
dom(R) such that dom(R) = dom(A1) ::: dom(An), where dom(A) V is
some domain.</p>
        <p>
          We dene a tuple of a relation of type dom(R) as a state of an object o =
(i; R; o1; :::; on) such that for k = 1; :::; n ok = (ik; Ak; vk) is an atomic object
such that vk 2 dom(Ak). In particular, a tuple o 2 O1 is a state of the rst level.
Let us recall a denition from [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ]:
Denition. The tuples o = (i; R; o1; :::; on); o0 = (i0; R; o01; :::; o0n) shall be called
relationally equal if for all k = 1; :::; n it holds that vk = v0 .
k
Let us consider the table emp with ve columns empno, firstname, lastname,
salary, and deptno. The two object states o and o0 represent the tuple (1, "Jan",
"Kowalski", 2) of this table. Although they are dierent, they are relationally
equal:
(i0; empno; 1)
(i1; f irstname; "Jan")
(i2; lastname; "Kowalski")
(i3; deptno; 2)
(i4; salary; 3000)
g ) 2 S1
(i00; empno; 1)
(i01; f irstname; "Jan")
(i02; lastname; "Kowalski")
(i03; deptno; 2)
(i04; salary; 3000)
g ) 2 S1
o
        </p>
        <p>
          = (i; emp; f
o0 = (i0; person; f
Next we deal with relations that are dened by Grefen [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ] as multisets of tuples.
The state of a relation R is any object (i; R; T ), where T is a sequence of tuples
of the type R.
        </p>
        <p>Denition. Let the states o = (i; R; T ) 2 O2 and o0 = (i0; R; T 0) 2 O2 be of the
second level, where T and T 0 are sequences of states of the rst level. Assume
also that o R o0. States o and o0 are called relationally equal i jT j = jT 0j and
there is a permutation p of the sequence T , such that for each t = 1; :::; jT j the
states of the tuples p(T )t and Tt0 are relationally equal.</p>
        <p>Note that states of the second level from the above denition model multisets
of tuples and the relational equality of states dened above is an equivalence
relation.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>UQL Operators</title>
      <p>In this Section we introduce operators of the Universal Query Language (UQL).
Let SS be the set of all functions Q : S ! S. Queries of UQL are functions from
the set SS. These functions are compositions of UQL operators dened below.
3.1</p>
      <p>Renaming
The operator as gives an object a new name:</p>
      <p>as : N ! SS
as(n)((i; n0; v)) = (i; n; v)</p>
      <sec id="sec-3-1">
        <title>Otherwise: 3.3 Mapping 3.2</title>
        <p>Flattening
For a complex object the operator f lat replaces its subjects with the contents
of these subobjects. If the argument complex object is simple or has any simple
subjects, f lat returns an empty object. Assume o = (i; n; (o1; o2; : : : ; ok)). If for
all t = 1 : : : k ot 62 O0 and ot = (it; nt; (ot;1; : : : ; ot;jt ), then
f lat(o) = (i; n; (o1;1; o1;2; : : : ; o1;j1 ; o2;1; : : : ; ok;jk ))</p>
        <p>f lat(o) = (i; n; nil)
The purpose of the operator map is the application of a function to all subobjects
of the given object. The functor map : SS ! SS is dened as follows. Let
f : S ! S be the function to be applied. Then:
map(f )(o) =
(i; n; (f (o1); : : : ; f (on)) if o = (i; n; (o1; o2; : : : ; ok)) 62 O0
(i; n; nil) if o 2 O0:
3.4</p>
        <p>Evaluating
Given a function on simple values we can apply it to the simple values stored
inside an object. We introduce a family of functors eval. For a given natural t
evalt maps any function f : V t ! V to the query evalt(f ) such that:
evalt(f )(i; n; (o1; : : : ; ok)) =
8 (i0; ; f (v1; : : : ; vt))
&lt;
: (i0; ; nil)
if k = t and</p>
        <p>oj = (ij ; nj ; vj ) 2 O0
otherwise.
3.5</p>
        <p>Getting k-th subobject
Let o = (i; n; (o1; o2; : : : ; ot)) be a state of an object. We dene:
takek(i; n; (o1; : : : ; ot)) =
ok
(i0; ; nil)
if k &lt; t and
otherwise.</p>
        <p>For k = 1 we will use notation takeF irst instead of take1.
3.6</p>
        <p>Filtering
Filtering is also performed by a functor. Assume a function p : S ! V that
returns Boolean values. Then:</p>
        <p>f ilter(p)(o = (i; n; (o1; o2; : : : ; ok))) = (i; n; (oi1 ; oi2 ; : : : ; oi0k ))
where the sequence (oi1 ; oi2 ; : : : ; oi0k ) is the subsequence of (o1; o2; : : : ; ok)
composed of all objects oj such that eval1(p(oj )) = true.
3.7</p>
        <p>Nesting
3.8</p>
        <p>Cloning
The operator nest creates a new nameless object and puts the argument object
into it:</p>
        <p>nest(o) = (i0; ; o)
The operator clonet for natural t &gt; 1 duplicates the state of the given object
t times. This operator does not preserve the propriety of the object since the
clones will have repeated identities inside. The operator clonet : SS ! SS is
dened as follows:</p>
        <p>clonet(o = (i; n; x)) = (i0; n; ((i1; n; x1); : : : ; (in; n; xt)))
where x1; x2; : : : ; xt are fresh object identiers.
Let o = (i; n; (o1; :::; ot)); o0 = (i0; n0; (o01; :::; o0t0 )) be complex objects. The cross
product operator is dened as follows:</p>
        <p>cross(o; o0) = (i; ; ((o11; :::; o1t0 ; :::; ott0 ), where ojk = (ijk; ; (oj; o0k))
Let be an equivalence relation on a subset of states S
(i; n; (o1; :::; ot)) be a complex object such that fo1; :::; otg
abstract is dened as follows:
S . Let o =</p>
        <p>1</p>
        <p>S. The operator
where uj = (ij; n; (oj1; :::; ojtj )) and the following conditions are satised:
a. The sequence (oj1; :::; ojtj ) is a subsequence of (o1; :::; ot) for all j = 1; : : : ; k
and the sequence o11; :::; ok1 is a subsequence of (o1; :::; ot).
b. The items in (oj1; :::; ojtj ) are pairwise related with respect to .
c. For any j 6= j0 and m; m0 it is true that ojm 6 oj0m0 .
3.11</p>
        <p>Transposing
Let o = (i; n; (o1; :::; om)) be a complex state of an object, such that there
exists a number t and a name n0, such that for all j = 1; :::; m, we have
oj = (ij; n0; (oj;1; :::; oj;t)). In other words the state o represents a two
dimensional m t matrix of states of objects. We dene the transpose operator as
follows:</p>
        <p>transpose(o) = (i0; n; (o1; :::; ot));
where ok = (i0k; n0; (o1;k; :::; ot;k)); for k = 1:::t
3.12</p>
        <p>Folding
Let o = (i; n; (o1; :::; ot)) be an complex model and f : S
operator. We dene f old via induction:
S ! S be a binary
f oldf (o = (i; n; fo1; :::; otg)) =
o , if t = 1
f oldf ((i0; n; (f (o1; o2); o3; :::; ot))) , if t &gt; 1</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Mapping example queries</title>
      <p>In this Section we show some examples of SQL queries mapped to UQL. As we
mentioned in the introduction, we do not treat them as a proof of the quality of
UQL. However, the smoothness of the mappings in an indicator of the feasibility
of our research goal.</p>
      <p>In order to simplify the presentation we are going to use the following
notation. When two unary operators op1; op2 are applied to a pair of objects, it is
expressed as (op1 op2)(o1; o2).</p>
      <p>Let us assume that we have the following relational database schema with
two well-known tables:
emp: empno, firstname, lastname, salary, deptno
dept: deptno, deptname, location</p>
      <sec id="sec-4-1">
        <title>Consider the following SQL query:</title>
      </sec>
      <sec id="sec-4-2">
        <title>SELECT firstname, lastname FROM emp WHERE lastname = ’Schmidt’</title>
        <p>Let us assume that the variable o represents the state of the database with the
above schema. Our example query gets the following form in UQL:
map( f iltername=0firstname0_name=0lastname0 (
f ilter9on:name(on)=0lastname0^value(on)=0Schmidt0 (
f latten(
f iltername=0emp0 (o)
)
Now let us consider a join. The following query is a natural join with an equality
selection:
)
)</p>
        <p>)</p>
      </sec>
      <sec id="sec-4-3">
        <title>SELECT first, lastname FROM dept join emp using deptno WHERE dept.deptname = ’IT’</title>
      </sec>
      <sec id="sec-4-4">
        <title>This query is equivalent to:</title>
      </sec>
      <sec id="sec-4-5">
        <title>SELECT e.first, e.lastname FROM dept d, emp e WHERE d.deptname = ’IT’ AND d.deptno = e.deptno</title>
        <p>Let us build the mapping step by step. Again we assume that the variable o is
the state of the database. A from clause for a single table is realised as follows
(we lter out other tables):</p>
        <p>f iltername=0tablename0 (o)
Thus, the clause from dept d is mapped as (the operator as augments the
column name with d_):</p>
        <p>map(asd_+name; f iltername=0dept0 (o))
Furthermore, from dept d, emp e is expressed as:
(map(asd_+name; : : :)
(f iltername=0dept0
duplicate2(o)
)
)</p>
        <p>map(ase_+name; : : :))(
f iltern0ame=0emp0 )(
Now the obtained objects are glued together:</p>
        <p>f latten(cross(: : :))
and ltered:</p>
        <p>f ilterval(d_deptno)=val(e_deptno)^val(d_deptname)=0IT 0 (: : :)
Finally, we have to select the columns that constitute the result of the query:
Altogether, our query formulated in UQL has the following form:
map(f iltername=0firstname0_name=0lastname0 ; )
map(f iltername=0firstname0_name=0lastname0 ;
f latten(cross(
(map(asd_+name; :)
(f iltername=0dept0
duplicate2(o)
)
map(ase_+name; :))(
f iltern0ame=0emp0 )(
)</p>
        <p>)
))
Note that this construction of standard SPJ queries is quite regular. We start
from the from clause, then goes where and nally select. Note that in all three
steps most of the eort is in fact ltration. The process is compositional, so the
mapping of subqueries will be similarly smooth. This way we can map other
query languages:
SBQL: emp where lastname = ’Schmidt’
HQL: from emp where lastname = ’Schmidt’
SQL: SELECT * from emp where lastname = ’Schmidt’
All of these queries simply map to the following UQL query:</p>
        <p>f iltervalue(lastname)=0Schmidt0 (f latten(f iltername=0emp0 ))
Finally, let us consider the aggregation. The example query follows:</p>
      </sec>
      <sec id="sec-4-6">
        <title>SELECT deptno, SUM(salary) FROM emp GROUP BY deptno</title>
        <p>Like previously, at the beginning we need to select the emp objects, atten them
and lter out uninteresting subobjects:
selo = map(f iltername=0deptno0_name=0salary0 ;</p>
        <p>f latten(f iltername=0emp0 (o))
)
In the next step we cluster resulting objects using relation dn. Two objects are
related by dn, if their subobjects deptno have the same value:</p>
        <p>grpo = abstractdn(selo)
The subobjects of grpo contain collections of pairs, but in order to f old them
we need pairs of collections, so we transpose the matrices:</p>
        <p>trso = map(transpose; grpo)</p>
      </sec>
      <sec id="sec-4-7">
        <title>Then we f old attened states:</title>
        <p>map(takeF irst (f laten f old+); trso)
Eventually we have received a state containing a collection of pairs composed of
deptno and the sum of salary. Thus, the example aggregation query maps to:
map(takeF irst( f laten f old+);
map(translate;
abstractdn(
map(f iltername=0deptno0_name=0salary0 ;</p>
        <p>f latten(f iltername=0emp0 (o))
)
)
)</p>
        <p>)
The construction of this UQL query has been stepwise and natural. We are
convinced that even complex SQL (and other QL as well) queries will smoothly
map to UQL.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Conclusions and future work</title>
      <p>After successfully constructing USM (the Unied State Model), i.e. the unied
model for a number of major programming and storage environments, we were
naturally excited, if it is possible to build a Universal Query Language (UQL)
on the USM? UQL is planned to subsume query languages for models that were
covered by USM.</p>
      <p>In this paper we made an initial attempt to answer this question. We
presented a pilot list of UQL operators and a number of representative examples
of queries and their expression in UQL. We chose two SPJ queries and one
aggregate query, showed their smooth mapping to UQL and concluded that such
queries seem to map well. Of course, this proves nothing. However, it indicates
that building UQL is feasible.</p>
      <p>The next step planned in our research it to found a nal robust set of UQL
operator and show that UQL allows expressing the query part of SQL, OQL,
SQBL, XQuery and other interesting query languages.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Neward</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>The Vietnam of computer science</article-title>
          .
          <source>Online</source>
          (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Neward</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>Avoiding the quagmire</article-title>
          .
          <source>Online</source>
          (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Hughes</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Object relational mapping; how Vietnam can still be won</article-title>
          .
          <source>Online</source>
          (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Codd</surname>
            ,
            <given-names>E.F.</given-names>
          </string-name>
          :
          <article-title>A relational model of data for large shared data banks</article-title>
          .
          <source>Commun. ACM</source>
          <volume>13</volume>
          (
          <year>1970</year>
          )
          <fpage>377387</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Coad</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Nicola</surname>
          </string-name>
          , J.:
          <string-name>
            <surname>Object-Oriented Programming</surname>
          </string-name>
          . Yourdon Press (
          <year>1993</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Laemmel</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Meijer</surname>
          </string-name>
          , E.:
          <article-title>Revealing the X/O impedance mismatch</article-title>
          . In Backhouse, R.,
          <string-name>
            <surname>Gibbons</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hinze</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jeuring</surname>
          </string-name>
          , J., eds.:
          <string-name>
            <surname>Datatype-Generic Programming</surname>
          </string-name>
          . Volume
          <volume>4719</volume>
          of Lecture Notes in Computer Science. Springer Berlin / Heidelberg (
          <year>2007</year>
          )
          <fpage>285367</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7. Wi-niewski, P., Burza«ska,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Stencel</surname>
          </string-name>
          ,
          <string-name>
            <surname>K.</surname>
          </string-name>
          :
          <article-title>The impedance mismatch in light of the unied state model</article-title>
          .
          <source>Fundam. Inform</source>
          . (
          <year>2012</year>
          , to appear)
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>O</given-names>
            <surname>'Neil</surname>
          </string-name>
          ,
          <string-name>
            <surname>E.J.</surname>
          </string-name>
          : Object/relational mapping 2008:
          <article-title>Hibernate and the Entity Data Model (EDM)</article-title>
          . In
          <string-name>
            <surname>Wang</surname>
          </string-name>
          , J.T.L., ed.
          <source>: SIGMOD Conference</source>
          , ACM (
          <year>2008</year>
          )
          <fpage>1351</fpage>
          <lpage>1356</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Meijer</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          :
          <article-title>The world according to LINQ. Queue 9 (</article-title>
          <year>2011</year>
          )
          <volume>60</volume>
          :
          <fpage>6060</fpage>
          :
          <fpage>72</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Forcier</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bissex</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chun</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          :
          <article-title>Python Web Development with Django. 1 edn</article-title>
          . Addison-Wesley
          <string-name>
            <surname>Professional</surname>
          </string-name>
          (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Cattell</surname>
            ,
            <given-names>R.G.G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barry</surname>
            ,
            <given-names>D.K.</given-names>
          </string-name>
          :
          <article-title>The Object Data Standard: ODMG 3.0</article-title>
          . Morgan Kaufmann (
          <year>2000</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Card</surname>
            ,
            <given-names>M.:</given-names>
          </string-name>
          <article-title>OMG next-generation object database standardization white paper</article-title>
          .
          <source>Online</source>
          (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <article-title>W3C: XQuery 1.0: An XML Query Language</article-title>
          . (
          <year>2005</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Grefen</surname>
            ,
            <given-names>P.W.P.J.</given-names>
          </string-name>
          , de By, R.A.:
          <article-title>A multi-set extended relational algebra - a formal approach to a practical issue</article-title>
          . In: ICDE, IEEE Computer Society (
          <year>1994</year>
          )
          <fpage>8088</fpage>
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>