<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Compression of the Stream Array Data Structure ⋆</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Radim</forename><surname>Bača</surname></persName>
							<email>radim.baca@vsb.cz</email>
							<affiliation key="aff0">
								<orgName type="department">Department of Computer Science</orgName>
								<orgName type="institution">Technical University of Ostrava Czech Republic</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Martin</forename><surname>Pawlas</surname></persName>
							<email>martin.pawlas@vsb.cz</email>
							<affiliation key="aff0">
								<orgName type="department">Department of Computer Science</orgName>
								<orgName type="institution">Technical University of Ostrava Czech Republic</orgName>
							</affiliation>
						</author>
						<title level="a" type="main">Compression of the Stream Array Data Structure ⋆</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">357CA5AF08EA3EC61C3F04DDEB54DE9E</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T06:54+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>Stream ADT, XML</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>In recent years, many approaches to XML twig pattern query (TPQ) processing have been developed. Some algorithms are supported by a stream abstract data type. Stream is an abstract data type usually implemented using inverted list or special purpose data structure. In this article, we focus on an efficient implementation of a stream ADT. We utilize features of a stream ADT in order to implement compressed stream array and compare it with regular stream array.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>In recent years, many approaches to XML twig pattern query (TPQ) processing have been developed. Indexing techniques for a XML document structure have been studied extensively and works such as <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b9">10,</ref><ref type="bibr" target="#b7">8,</ref><ref type="bibr" target="#b0">1,</ref><ref type="bibr" target="#b2">3,</ref><ref type="bibr" target="#b8">9,</ref><ref type="bibr" target="#b3">4,</ref><ref type="bibr" target="#b4">5]</ref> have outlined basic principles of streaming scheme approaches. Node of an XML tree is labeled by a labeling scheme <ref type="bibr" target="#b10">[11,</ref><ref type="bibr" target="#b9">10]</ref> and stored in a stream array. Streaming methods usually use the XML node tag as a key for one stream. Labels retrieved for each query node tag are then merged by some type of XML join algorithm such as structural join <ref type="bibr" target="#b0">[1]</ref> or holistic join <ref type="bibr" target="#b2">[3]</ref>.</p><p>We can use also relational databases in order to store and query labeled XML tree, however relational query processor join operation is not designed for this purpose. Due to this fact, XML joins outperform significantly relational query processors <ref type="bibr" target="#b10">[11]</ref>.</p><p>XML joins are based on a stream abstract data type which usually implemented using inverted list or special purpose data structure. In this article, we focus on an efficient implementation of a stream ADT. We utilize features of a stream ADT in order to implement compressed stream array and compare it with regular stream array. We utilize fast fibonacci encoding and decoding algorithms in order to achieve maximal efficiency of the result data structure. Moreover, our compressed stream array data structure allows us to store variable length labels such as Dewey order without storage overhead.</p><p>In Section 2, we describe XML model. Section 3 introduce the stream abstract data type and outline persistent stream array and its compression. In Section 4, we describe different compression techniques applied on a block of a stream array. Section 5 describes some experimental results.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">XML model</head><p>An XML document can be modeled as a rooted, ordered, labeled tree, where every node of the tree corresponds to an element or an attribute of the document and edges connect elements, or elements and attributes, having a parent-child relationship. We call such representation of an XML document an XML tree. We can see an example of the XML tree in Figure <ref type="figure" target="#fig_0">1</ref>. We use the term 'node' to define a node of an XML tree which represents an element or an attribute.</p><p>The labeling scheme associates every node in the XML tree with a label. These labels allow to determine structural relationship between nodes. Figures <ref type="figure" target="#fig_0">1(a</ref>) and 1(b) show the XML tree labeled by containment labeling scheme <ref type="bibr" target="#b10">[11]</ref> and dewey order <ref type="bibr" target="#b9">[10]</ref>, respectively.</p><p>The containment labeling scheme creates labels according to the document order. We can use simple counter, which is incremented every time we visit a start or end tag of an element. The first and the second number of a node label represent a value of the counter when the start tag and the end tag are visited, respectively. In the case of dewey order every number in the label corresponds to one ancestor node. Holistic approaches use an abstract data type (ADT) called a stream. A stream is an ordered set of node labels with the same schema node label. There are many options for creating schema node labels (also known as streaming schemes). A cursor pointing to the first node label is assigned to each stream. We distinguish the following operations of a T stream: head(T) -returns the node label to the cursor's position, eof(T)returns true iff the cursor is at the end of T , advance(T) -moves the cursor to the next node label. Implementation of the stream ADT usually contains additional operations: openStream(T) -open the stream T for reading, closeStream(T) -close the stream. The Stream ADT is often implemented by an inverted list. In this article we describe simple data structure called stream array, which implement stream ADT. We test different compression techniques in order to decrease number of disk accesses. It also allows us to store variable length vectors efficiently.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1">Persistent stream array</head><p>Persistent stream array is a data structure, which uses common architecture, where data are stored in blocks on secondary storage and main memory cache keeps blocks read from the secondary storage. In Figure <ref type="figure" target="#fig_1">2</ref> we can see an overview of such architecture. Cache uses the least recently used (LRU) schema for a selection of cache blocks <ref type="bibr" target="#b6">[7]</ref>. Each block consists of an array of tuples (node labels) and from a pointer to the next block in a stream. Pointers enable dynamic character of the data structure. We can easily insert or remove tuples from the blocks without time-consuming shift of all items in a data structure. Blocks do not have to be fully utilized, therefore we also keep the number of tuples stored in each block.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Insert and delete operations</head><p>We briefly describe the insert and delete operations of the stream array in order to see how the data structure is created. In Algorithm 1 we can observe how a label is inserted. B.next is a pointer to the next block in the stream. We try to keep higher utilization of blocks by using similar split technique used by B + tree <ref type="bibr" target="#b5">[6]</ref>, where we create three 66% full blocks of two full block if possible.</p><p>Delete operation is very similar to insert. We process merge of blocks in a case that their utilization is bellow a threshold. However, this operation is out of scope of this article.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2">Compressed stream array</head><p>There are two reasons for a stream array compression. The first advantage is that we can decrease the size of the data file and therefore decrease number of disk accesses. Of The second advantage is that we can store variable length tuples. Tuples in a regular stream block are stored in a array with fixed items' size. The items' size has to be equal to the longest label stored in the stream array and we waste quite a lot of space in this way. Compressed stream block do not use array of items in the block but the byte array where the tuples are encoded.</p><p>The stream array has a specific feature which enables efficient compression. We never access items in one block randomly during the stream read. Random access to a tuple in the block may occur only during the stream open operation, but the stream open is not processed very often. Therefore, we can keep the block items encoded in the byte array and remember only the actual cursor position in the byte array. The cursor is created during the stream open and it also contains one tuple, where we store encoded label of the current cursor position. Each label is encoded only once during the advance(T) operation. The head(T) operation only returns the encoded tuple assigned to cursor. Using this schema we keep data compressed even in the main memory and have to have only one decompressed tuple assigned to each opened stream.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Block Compression</head><p>In following chapters we will describe compression algorithms implemented during our tests and also we will show examples of these algorithms.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1">Variable length tuple</head><p>This compression is only based on fact that we can store variable length tuple. It is done by saving dimension length with each tuple.</p><p>Example 41 Let us have these two tuples: 1, 2 and 1, 2, 3, 7 . When using this compression they will occupy 6×4 B + 2 B for dimension length for these two tuples. If we use regular stream array without supporting variable tuple length we will have to align first tuple, so it will look like 1, 2, 0, 0 and these two tuples will occupy 8×4 B.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2">Fibonacci coding</head><p>This kind of compression is based on Fibonacci coding of number. Because each dimension of tuple contain only non negative number we can use Fibonacci coding.</p><p>Example 42 Let us have a tuple 1, 2, 3, 7 . After encoding the tuple will be stored as a sequence of bits 11011001101011, which occupy 2 B instead of original 24 B (each dimension is 4 B length).</p><p>The problem for this compression technique might be when tuple contains large numbers and then compression of the tuple will take more time, because the number is encoded bit-by-bit. Due to this fact we used the the fast Fibonacci decompression algorithm, which is described in more details in <ref type="bibr" target="#b1">[2]</ref>. This decompression algorithm is faster because it is working with whole bytes.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.3">Compression based on reference item</head><p>Tuples in a stream array are sorted and we can use this feature to compress a tuple with knowledge of his ancestor.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Common prefix compression Common prefix compression is based on idea of Run</head><p>Length Encoding (RLE). Usually ancestor of actual compressing tuple is very similar and therefore we do not have to store every dimension.</p><p>Example 43 Let us have these tuples: 1, 2, 3, 7, 9, 7 , 1, 2, 3, 7, 5, 6, 7 , 1, 2, 3, 7, 7, 0, 0, 7 . First tuple in the block cannot be compressed, because there is no ancestor. Second tuple have to store only 3 dimensions and third one have to store last 4 dimensions. The result after compression looks like: 0 − 1, 2, 3, 7, 9, 7 , 4 − 5, 6, 7 , 4 − 7, 0, 0, 7 , where the first number says how many dimensions are common. In this example we saved 28 B (original size is 23×4 B, compressed size is (13+3)×4 B).</p><p>Fibonacci coding with reference item The Fibonacci code is designed for a small numbers. However, numbers in the case of containment labeling scheme grows rapidly. In this case, the Fibonacci code becomes inefficient and compression does not work appropriately. In order to keep the numbers small we subtract each tuple with its previous tuple.</p><p>Example 44 Let us have these two tuples: 1000, 200, 300, 7 and 1005, 220, 100, 7 . From this example we see that we can subtract first 2 dimensions. After subtraction we will have 1000, 200, 300, 7 and 5, 20, 100, 7 , which are encoded faster and also occupy less space.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Experimental results</head><p>In our experiments<ref type="foot" target="#foot_0">2</ref> , we used XMARK 1 data collection and we generated labels for two different labeling schemes: containment labeling scheme with fixed size of labels and dewey order labeling scheme with variable dimension length. We tested scalability of the compression schemes on different collection sizes. We provide test for XMARK collections containing approximately 200k, 400k, 600k, 800k and 1000k labels. Each collection contains 512 streams.</p><p>The stream array and all compression algorithms were implemented in C++. We created one persistent stream array for each collection of labels. We provide set of tests, where we simulate real work with the stream and measure the influence of the compression. For each test we randomly selected 100 streams and read them until the end. Test is processed with a cold cache. During tests we measured file size, query time and Disk Access Cost (DAC). Query time include time interval needed for opening of each randomly selected stream and his reading until the end. DAC is equal to the number of disk accesses during the query processing.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.1">Fixed dimension length</head><p>In Figure <ref type="figure">3</ref>(a) we can see that file size is same for the block without compression and for the block which support storing variable tuple dimensionality. There is small difference, but it is only because of supporting variable length of dimension. As we can see in Figure <ref type="figure">3</ref>(a) the regular Fibonacci compression can save us about 25 %. Due to the fact, that the labels values are very close, we can achieve significantly better results in the case of Fibonacci compression using reference tuple. This kind of compression can save about 50 % compared to the regular stream array. Common prefix compression saved us only about 10 %.</p><p>Even thought that the compression ratio is good, the query time for compressed stream array is a little bit worse than for regular stream array as you can see in Figure <ref type="figure">3(b)</ref>. Disk access cost that we save using the compression is not sufficient in this case and it is less than the time spend on decompression.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.2">Variable dimension length</head><p>If collection data contains tuples with variable dimension length we can save from 55 % (only by using block which support variable dimension length) up to 85 % (for Fibonacci compression with reference item) of file size when comparing to regular stream array.</p><p>The query time of the compressed stream array is always smaller for every implemented compression technique than query time of regular stream array as you can see in Figure <ref type="figure">4(b)</ref>. The Fibonacci compression has the best result for this data collection, with or without reference tuple. The results are comparable because the labels' numbers do not grow so quickly in the case of dewey order labeling scheme.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Fig. 1 .</head><label>1</label><figDesc>Fig. 1. (a) Containment labeling scheme (b) Dewey order labeling scheme</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Fig. 2 .</head><label>2</label><figDesc>Fig. 2. Overview of a persistent architecture</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Algorithm 1 : 1 if B is full then 2 if 4 Find the right block and insert lT ; 5 else 6 7 Insert</head><label>1124567</label><figDesc>Insert lT label into the stream array Find the block B where the lT label belongs; block B.next is full ∨ B.next does not exist then 3 Create three blocks from B and B.next (if B.next exist); Shift some items from B to the B.next; lT into B; is an extra time spend on a compression and decompression of data. The compression and decompression time should be lower or equal to time saved having less disk accesses. As a result compression algorithm should be fast and should have good compression ratio. We describe different compression algorithms in Section 4.</figDesc></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_0">The experiments were executed on an Intel Celeron D</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="356" xml:id="foot_1">-3.33 Ghz, 512 kB L2 cache; 3 GB 533 MHz DDR2 SDRAM; Windows Vista. 1 http://monetdb.cwi.nl/xml/</note>
		</body>
		<back>
			<div type="annex">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>X200k</head><p>X400k X600k X800k X1000k</p><p>File size <ref type="bibr">[</ref>  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Conclusion</head><p>In this article we evaluate the persistent stream array compression. The persistent stream array is designed to implement the stream ADT which support an XML indexing approaches. We tested two most common types of labeling schemes of XML trees: containment labeling scheme and dewey order labeling scheme. We performed series of experiments with different compression techniques. The compression of Containment labeling scheme is feasible only if we want to decrease the size of data file. The data decompression time is always higher than the time saved on a DAC, therefore, the query processing using a compressed stream array is less efficient than the regular stream array. On the other hand, compressed stream array storing the dewey order labels perform significantly better than the regular stream array. The best query time is achieved with the compression technique utilizing the fast fibonacci coding.  </p></div>			</div>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Structural Joins: A Primitive for Efficient XML Query Pattern Matching</title>
		<author>
			<persName><forename type="first">S</forename><surname>Al-Khalifa</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><forename type="middle">V</forename><surname>Jagadish</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Koudas</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ICDE 2002</title>
				<meeting>ICDE 2002</meeting>
		<imprint>
			<publisher>IEEE CS</publisher>
			<date type="published" when="2002">2002</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<title level="m" type="main">The Fast Fibonacci Decompression Algorithm</title>
		<author>
			<persName><forename type="first">R</forename><surname>Baca</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Snasel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Platos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Kratky</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>El-Qawasmeh</surname></persName>
		</author>
		<idno type="arXiv">arXiv:0712.0811</idno>
		<imprint>
			<date type="published" when="2007">2007</date>
		</imprint>
	</monogr>
	<note type="report_type">Arxiv preprint</note>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Holistic Twig Joins: Optimal XML Pattern Matching</title>
		<author>
			<persName><forename type="first">N</forename><surname>Bruno</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Srivastava</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Koudas</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ACM SIGMOD 2002</title>
				<meeting>ACM SIGMOD 2002</meeting>
		<imprint>
			<publisher>ACM Press</publisher>
			<date type="published" when="2002">2002</date>
			<biblScope unit="page" from="310" to="321" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Twig2Stack: Bottom-up Processing of Generalized-tree-pattern Queries Over XML documents</title>
		<author>
			<persName><forename type="first">S</forename><surname>Chen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H.-G</forename><surname>Li</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Tatemura</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W.-P</forename><surname>Hsiung</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">S</forename><surname>Candan</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of VLDB 2006</title>
				<meeting>VLDB 2006</meeting>
		<imprint>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="283" to="294" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Index Structures for Matching XML Twigs Using Relational Query Processors</title>
		<author>
			<persName><forename type="first">Z</forename><surname>Chen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Korn</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Koudas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Shanmugasundaram</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Srivastava</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ICDE 2005</title>
				<meeting>ICDE 2005</meeting>
		<imprint>
			<publisher>IEEE CS</publisher>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="1273" to="1273" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Ubiquitous b-tree</title>
		<author>
			<persName><forename type="first">D</forename><surname>Comer</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ACM Computing Surveys</title>
				<imprint>
			<publisher>ACM Press</publisher>
			<date type="published" when="1979-06">June, 1979</date>
			<biblScope unit="page" from="121" to="137" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<title level="m" type="main">Database systems: the complete book</title>
		<author>
			<persName><forename type="first">H</forename><surname>Garcia-Molina</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Ullman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Widom</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2002">2002</date>
			<publisher>Prentice Hall</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Staircase Join: Teach a Relational DBMS to Watch Its (Axis) Steps</title>
		<author>
			<persName><forename type="first">T</forename><surname>Grust</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Van Keulen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Teubner</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of VLDB 2003</title>
				<meeting>VLDB 2003</meeting>
		<imprint>
			<date type="published" when="2003">2003</date>
			<biblScope unit="page" from="524" to="535" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">XR-Tree: Indexing XML Data for Efficient</title>
		<author>
			<persName><forename type="first">H</forename><surname>Jiang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Lu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Wang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Ooi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ICDE</title>
				<meeting>ICDE<address><addrLine>India</addrLine></address></meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2003">2003. 2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Storing and Querying Ordered XML Using a Relational Database System</title>
		<author>
			<persName><forename type="first">I</forename><surname>Tatarinov</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ACM SIGMOD 2002</title>
				<meeting>ACM SIGMOD 2002<address><addrLine>New York, USA</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2002">2002</date>
			<biblScope unit="page" from="204" to="215" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">On Supporting Containment Queries in Relational Database Management Systems</title>
		<author>
			<persName><forename type="first">C</forename><surname>Zhang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Naughton</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Dewitt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Q</forename><surname>Luo</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Lohman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ACM SIGMOD 2001</title>
				<meeting>ACM SIGMOD 2001</meeting>
		<imprint>
			<date type="published" when="2001">2001</date>
			<biblScope unit="page" from="425" to="436" />
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
