<?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">A Practical Query Language for Graph DBs</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Renzo</forename><surname>Angles</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">Department of Computer Science</orgName>
								<orgName type="institution">Universidad de Talca</orgName>
							</affiliation>
							<affiliation key="aff1">
								<orgName type="department">Department of Computer Science</orgName>
								<orgName type="institution">VU University Amsterdam</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Pablo</forename><surname>Barceló</surname></persName>
							<affiliation key="aff2">
								<orgName type="department">Department of Computer Science</orgName>
								<orgName type="institution">Universidad de Chile</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Gonzalo</forename><surname>Ríos</surname></persName>
							<affiliation key="aff2">
								<orgName type="department">Department of Computer Science</orgName>
								<orgName type="institution">Universidad de Chile</orgName>
							</affiliation>
						</author>
						<title level="a" type="main">A Practical Query Language for Graph DBs</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">92EF68EC31DE26BEE891499E0AC2FBD2</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T03:41+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>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Query languages for current graph DB systems lack clear syntax and semantics, which difficults the understanding of its expressiveness and complexity. In particular, many of them suffer from poor performance due to the inherently high complexity of the queries they can express. We propose propositional dynamic logic (PDL) as a yardstick query language for graph database engines, based on the fact that it can express many relevant properties with very low computational cost. We present an implementation of the language that shows its potential applicability for querying massive graph databases by building on existing graph database support.</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>Some of the current systems for managing graph data implement APIs with special functions for querying graph properties (e.g., Dex and Titan). Others include graphoriented query languages; e.g., Neo4j provides Cypher <ref type="foot" target="#foot_0">4</ref> , based on expressions of the form start-match-where-return; OrientDB<ref type="foot" target="#foot_1">5</ref> includes a SQL-style language extended for querying graphs; InfiniteGraph <ref type="foot" target="#foot_2">6</ref> allows navigation through the implementation of Java classes; and RDF stores like AllegroGraph, Virtuoso and BigData support SPARQL <ref type="foot" target="#foot_3">7</ref> , the standard query language for RDF.</p><p>But with the exception of SPARQL, none of the above languages provides a formal syntax and semantics, which difficults the accurate evaluation of their expressive power and complexity. Moreover, after some empirical experiments (not included here due to lack of space), we found that many of them suffer from poor performance. This is not due to the implementation, but to the inherently high computational complexity of the queries they allow to express.</p><p>We propose a navigational language -originally designed for program verification -as a yardstick for graph database engines. The language is propositional dynamic logic <ref type="bibr" target="#b4">[5]</ref>, PDL, that extends several important graph database languages <ref type="bibr" target="#b2">[3]</ref>. The reason is that the language combines good properties of evaluation and expressiveness: It can be evaluated in polynomial time, and even in linear time for an important fragment of graph queries. In addition, it allows to express relevant properties of graph databases, as we will see soon.</p><p>We also present an implementation of the language that works reasonably well, but decreases its performance for large graph databases in comparison with other engines (more specifically, DEX) that have much better support. The conclusion we draw is that implementation of PDL for querying massive graph databases seems promising, but it can only be achieved by building on existing graph database engines.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">The Query Language</head><p>We work with a simple graph data model that lies at the core of most graph data models studied in the literature <ref type="bibr" target="#b1">[2]</ref>. In essence, our graph databases are edge-labeled directed graphs, in which each element (node) is attached a single attribute with its corresponding value. We formalize this below.</p><p>Let V be a countably infinite set of node ids and Str the set of strings over some alphabet. Let Σ be a finite alphabet. A graph database G over Σ is a tuple (V, E, @) such that: (1) V is a finite set of node ids (i.e., elements in V), called the nodes of G, (2) E ⊆ V ×Σ×V is the set of labeled edges of G, and (3) @Att : V → Str is the attributevalue assignment of G. The intuitive interpretation behind an edge (u, c, v) ∈ E, for u, v ∈ V and c ∈ Σ, is that there exists a c-labeled edge from u to v in G. Also, @Att(v) = k, for a node v ∈ V and a string k ∈ Str, means that the single attribute @Att of node v in G is assigned value k.</p><p>The query language for graph databases we propose is the extension of propositional dynamic logic <ref type="bibr" target="#b4">[5]</ref>, PDL, with the inverse operator <ref type="bibr" target="#b7">[8]</ref>. This extension allows to increase the expressive power of the language without computational cost. The syntax of the language is as follows. Recall that V is a countably infinite set of node ids over which nodes of graph databases are taken. Let Σ be a finite alphabet. The language PDL with converse (PDL − ) over Σ is defined by the following grammar, in which α denotes programs and φ denotes formulas:</p><formula xml:id="formula_0">α := ǫ | c (c ∈ Σ) | c − (c ∈ Σ) | α ∪ α | α • α | α * | φ? φ := ⊤ | [↓ v] (v ∈ V) | [@Att = k] (k ∈ Str) | φ ∧ φ | ¬φ | α φ.</formula><p>We now formalize the semantics. Let G = (V, E) be a graph database over Σ (that is, V ⊆ V). Each program α defines a binary relation α G on V . Analogously, each formula φ defines over G a subset φ G of V . The definitions of α G and φ G are mutually inductive. We start with the case of programs. We assume that c belongs to Σ, that α, α 1 and α 2 are programs, and that φ is a formula: (1) Basis cases: (a)</p><formula xml:id="formula_1">ǫ G = {(v, v) | v ∈ V }, (b) c G = {(u, v) | (u, c, v) ∈ E}, and (c) c − G = {(u, v) | (v, c, u) ∈ E}. (2) Inductive cases: (a) α 1 ∪ α 2 G = α 1 G ∪ α 2 G , (b) α 1 • α 2 G = α 1 G • α 2 G , (c) α * G = ǫ G ∪ α G ∪ ( α G • α G ) ∪ • • • , and (d) φ? G = {(u, u) | u ∈ φ G }. Here, • denotes the usual composition of binary relations. That is, α 1 G • α 2 G is the set of pairs (u, v) such that (u, w) ∈ α 1 G and (w, v) ∈ α 2 G , for some w ∈ V .</formula><p>Let us provide some intuition for the semantics of programs: ǫ defines the identity on V × V , the pairs of nodes linked by a c-labeled edge are defined by the expression c, and c − defines the inverse of c. Definable binary relations are closed under union, composition and transitive-reflexive closure, which are represented by operators ∪, • and ( ) * , respectively. Finally, φ? defines the set of pairs (u, u) such that u satisfies the formula φ.</p><p>The semantics of formulas is defined as follows. We assume that v ∈ V, k ∈ Str, α is a program, and φ, φ 1 and φ 2 are formulas: (1) Basis cases: (a)</p><formula xml:id="formula_2">⊤ G = V , (b) [↓ v] G = {v}, if v ∈ V , and [↓ v] G = ∅, otherwise, and (c) [@Att = k] G = {v ∈ V | @Att(v) = k}. (2) Inductive cases: (a) φ 1 ∧ φ 2 G = φ 1 G ∩ φ 2 G , (b) ¬φ G = V \ φ G , and (c) α φ G = {u | (u, v) ∈ α G , for some v ∈ φ G }.</formula><p>The intuition behind the semantics of formulas is as follows: ⊤ defines the whole set of vertices, [↓ v] is true only at the node id v, and [@Att = k] defines the set of nodes whose attribute value is k. Definable sets are closed under Boolean operations, represented by operators ∧ and ¬. Finally, α φ defines the set of nodes u from which a node v that satisfies φ can be "reached" using program α.</p><p>Example 1. Let us consider a toy example of a social network over alphabet Σ = {friend}, where nodes are persons and attributes denote their names. The query that retrieves all friends of person p is definable in our language by the following expression: friend [↓ p]. Intuitively, this expression defines the set of persons p ′ in the social network that are adjacent via a friend-labeled edge to another person p ′′ (or, formally, the pair (p ′ , p ′′ ) satisfies the program friend ), and the id of p ′′ is p (or, formally, p ′′ satisfies the formula [↓ p]).</p><p>Closure of formulas under Boolean combinations allows us to express important properties. For instance, the expression friend [↓ p] ∧ friend [↓ p ′ ] defines the common friends of p and p ′ .</p><p>The use of regular expressions helps expressing interesting navigational properties of graph databases. For instance, the expression friend * [↓ p] defines the people that is connected by a friendship sequence to person p, i.e., the people who knows someone who knows someone ... who knows p.</p><p>The language also allows to talk about the inverse of a relation, which is useful when relationships -unlike friendship in a social network -are not bidirectional. Assume, for instance, that Σ is now extended with a new symbol parent, that defines the set of pairs (p, p ′ ) such that p is a parent of p ′ . Then the expression parent − •parent [↓ p] defines the set of siblings of p.</p><p>Finally, the combination of features of the language and the use of attributes allows us to express some sophisticated queries. For instance, the expression friend • (parent[@ = John])?</p><p>* [↓ p] defines the set of persons that are linked by a friendship sequence to p, in such a way that each person in the sequence has a son named John.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Expressiveness and complexity</head><p>In the above sections we presented examples of relevant properties of graph databases that can be expressed in PDL − . The language also subsumes some important navigational query languages for graph databases that have been studied in the literature, e.g., nested regular expressions <ref type="bibr" target="#b2">[3]</ref>, that were originally proposed for querying Semantic Web data <ref type="bibr" target="#b6">[7]</ref>, and a tailored version of the XML query language XPath for querying graph data <ref type="bibr" target="#b5">[6]</ref>.</p><p>Expressions in PDL − are acyclic, i.e., they cannot express interesting properties about cycles in the underlying graph database. For instance, consider again the case of social networks over alphabet Σ = {friend, parent}. There is no PDL − formula φ such that for each graph database G over Σ it is the case that φ G coincides with the set of persons that have two friends, one of which is a parent of the other <ref type="bibr" target="#b2">[3]</ref>. This shortcoming of the language is at the service of efficiency: Allowing cycles in queries easily leads to intractability of evaluation <ref type="bibr" target="#b0">[1]</ref>, while we will see next that evaluation of expressions in PDL − is tractable.</p><p>The language PDL − has good properties in terms of evaluation complexity, that is, the theoretical cost of computing α G and φ G , for a PDL − program α and a PDL − formula φ, respectively, over a graph database G. This is confirmed by the following folklore result that can be proved using standard model checking techniques <ref type="bibr" target="#b3">[4]</ref>. Here, |G|, |φ| and |α| denote the size of a reasonable encoding of a graph database G, a PDL − formula φ, and a PDL − program α, respectively: In practice, specifications (formulas and programs) are much smaller than the data where they are evaluated (the graph database). Under such view, the previous result essentially tells us that PDL − formulas can be evaluated in linear time in the size of the data, and that programs can be evaluated in quadratic time in the size of the data. The quadratic running time for evaluating programs is optimal, since in the worst case a program can define the whole set of pairs of nodes of a graph database.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Implementation and Evaluation</head><p>Implementation: We wanted our implementation to work on reasonably large graph databases, and, thus, we decided to concentrate on the evaluation of PDL − formulas, as they have linear time complexity. In fact, a quadratic running time for program evaluation may be rendered as unfeasible unless deep and novel optimization techniques are used in the implementation. Our main assumption, based on the size of the graph databases we want to query, is that main memory structures used in the implementation must be of size at most O(|V |) (i.e., only boolean operations on nodes may be handled there), while external memory structures are of size O(|G|) (that is, the graph database is kept on disk).</p><p>In order to minimize the access to external memory, we identified a minimal set of operations that have to be handled there. These are: Given a set V 0 of nodes, compute the set V 1 of nodes that have a c-labeled edge to a node in V 0 , and the set V 2 of nodes that can be reached by a c-labeled edge from a node in V 0 . We used the following data structure to implement these operations: For each label c we have an array that contains an element for each node v ∈ V . Each such element is a linked list containing the c-neighbors of the node. This structure can not be explicitly implemented in external disk, but it can be emulated as follows (nodes are represented by long integers): (1) For each label label we create two files: label.gdb y label.aux. These files consist of lines of fixed size. (2) The k-th line of label.gdb stores data related to k-th node. ( <ref type="formula">3</ref>  <ref type="table">1</ref>. Results of loading graphs of three sizes in PDL, Dex and Neo4j. For each system we show the loading time and the disk space used for data storing. of label.gdb will have n consecutive longs, where the first and last long will be used as a node identifier and a pointer to the auxiliary file, respectively. The n − 2 remaining longs will store the neighboring nodes of the respective node. ( <ref type="formula">4</ref>) Once these n − 2 longs are occupied, we create a new empty line with m longs at the end of label.aux, and we assign the pointer of label.gdb to this new line. <ref type="bibr" target="#b4">(5)</ref> The first m − 1 longs will store the neighbors of the respective node, and the last one will be used as a pointer in the same way than in the file label.gdb. (6) For the inverse label − , we analogously create the files label .gdb y label .aux.</p><p>If pointers in the files were arranged so that the disk access was sequential, then the algorithm would be optimal. Unfortunately, the way the data is ordered depends on the order of insertion, which can not be known a priori. But notice that in label.aux pointers are always higher than the line they point to, that is, if in the k-th line pointer is p, then p &gt; k. The idea of the algorithm is, thus, to keep in main memory a data structure, called LazyP, that stores the "pending accesses" to the lines in label.aux. The pseudo-algorithm is the following: (1) Read sequentially all lines in label.gdb, where the k-th line corresponds to the k-th node. If any of the n − 2 nodes belongs to V 0 , add the node k to the output, else if the pointer p is not 0, add the pair (p, k) to LazyP. (2) Iterate LazyP in ascending order in p, and read the p-th line in label.aux. If any of the m − 1 nodes belongs to V 0 , add the k-th node to the output, else if the new pointer p is not 0, add the pair (p, k) to LazyP.</p><p>In the first part of the algorithm the file label.gdb is read sequentially, and in the second part the file label.aux is read sequentially, which is optimal.</p><p>Evaluation results : We present an experimental evaluation of the implementation of our query language. The objective is to show the performance of PDL for loading and querying several sizes of data, and a referential comparison with two well-know graph databases, Dex and Neo4j.</p><p>All the experiments were conducted on a PC with 7 processors Intel Core i7-2600 of 3.4GHz, 15.6 GB RAM, running a Fedora Linux 64-bits. The execution of the java programs were done by using the java -jar command with parameter -Xmx10000m in order to set the maximum heap memory size used by Java.</p><p>We use a social network data use-case consisting of people and Webpages. A person has attributes id and name, and a Web page has attribute id. Two people can be related by an undirected edge friend, and a person can be connected with a Web page via a directed edge like. The data follows a power-law distribution for both relations (e.g,  <ref type="table">2</ref>. Results of evaluating the query mix over graphs of 10K (G1), 100K (G2) and 1M (G3) nodes. For each query we include the time (in milliseconds) of executing 100 instances of the query. The last column shows the total time of executing.</p><p>there are a small number of people having a lot of friends, and most people have a reduced number of friends). The datasets were created using the generator available at http://dcc.utalca.cl/∼rangles/research/gdg/.</p><p>The evaluation considered loading and querying tests for graphs of three sizes. Table <ref type="table">1</ref> shows the number of nodes and edges for each size, the loading time and the space on disk occupied for each system after data loading. Notice that PDL presents the highest loading time, and it spends a lot of disk space for storing its data structures in comparison with Dex and Neo4j that have better support for this task.</p><p>For the query processing test, we used the following query set:</p><p>- -(Q7) Get people that likes a Web page which a person P likes:</p><formula xml:id="formula_4">like like − [@id = P] .</formula><p>-(Q8) Is there a "friend" connection (path) between person P1 and P2?</p><formula xml:id="formula_5">[@id = P1] ∧ friend * [@id = P2].</formula><p>-(Q9) Get the common friends between people P1 and P2:</p><formula xml:id="formula_6">friend [@id = P1] ∧ friend [@id = P2].</formula><p>-(Q10) Get the common Web pages that people P1 and P2 like:</p><formula xml:id="formula_7">like − [@id = P1] ∧ like − [@id = P2].</formula><p>This query mix is oriented to evaluate the support of essential graph queries, that is: attribute searching (Q1 and Q4), node/edge adjacency (Q2 and Q3), fixed-length paths (Q5, Q6 and Q7), reachability (Q8) and graph pattern matching (Q9 and Q10).</p><p>Table <ref type="table">2</ref> shows the results of evaluating the test queries for the graphs G1, G2 and G3. The table shows the time of evaluating each query 100 times, and the total time of the query mix. According to this table we can see that PDL − works better than Dex and Neo4j just one time (Q1 for G1), rarely is better than Dex (Q1 for G1, G2 and G3), and several times is better than Neo4j. Note that Dex is the system with the best performance in the test.</p><p>These results show that our current implementation of PDL works well for small graphs, but its performance decreases when the data size grows. This suggests that a potential application of PDL − for querying large graph databases seems promising, but this has to be accompanied by the support of existing graph database engines.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Conclusions and Future Work</head><p>In this paper we have proposed a yardstick language for querying graph databases that supports relevant graph queries and can be evaluated in linear time. In the future we plan to consider the definition of a high-level syntax for the language, in order to facilitate the construction and understanding of complex queries by the general user. Although the simplest approach would be considering an extension of the well-known SQL syntax, we hope to explore and design a more interesting syntax based on graph structures but enforcing the restrictions of PDL formulas.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Theorem 1 . 1 .</head><label>11</label><figDesc>The cost of computing the set φ G , for G a graph database and φ a PDL − formula over the same alphabet Σ, is O(|G| • |φ|). 2. The cost of computing the set α G , for G a graph database and α a PDL − program over the same alphabet Σ, is O(|G| 2 • |φ|).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head></head><label></label><figDesc>Q1) Get people having name N: [@name = N]. -(Q2) Get people that likes a given Web page W: like [@id = W]. -(Q3) Get the Web pages that person P likes: likes − [@id = P]. -(Q4) Check if N is the name of person P: [@id = P] ∧ [@name = N]. -(Q5) Get the friends of the friends of person P: friend friend [@id = P] . -(Q6) Get the Web pages liked by the friends of a given person P: like − friend [@id = P] .</figDesc></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_0">http://docs.neo4j.org/chunked/milestone/cypher-query-lang.html</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="5" xml:id="foot_1">http://www.orientdb.org</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="6" xml:id="foot_2">http://http://objectivity.com</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="7" xml:id="foot_3">http://www.w3.org/TR/rdf-sparql-query/</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Acknowledgements: Angles is funded by Fondecyt grant 11100364 and Barceló by Fondecyt grant 1130104.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<title level="m" type="main">Foundations of Databases</title>
		<author>
			<persName><forename type="first">Serge</forename><surname>Abiteboul</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Richard</forename><surname>Hull</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Victor</forename><surname>Vianu</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1995">1995</date>
			<publisher>Addison-Wesley</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Survey of graph database models</title>
		<author>
			<persName><forename type="first">Renzo</forename><surname>Angles</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Claudio</forename><surname>Gutiérrez</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM Computing Surveys</title>
		<imprint>
			<biblScope unit="volume">40</biblScope>
			<biblScope unit="issue">1</biblScope>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Relative expresiveness of nested regular expressions</title>
		<author>
			<persName><forename type="first">Pablo</forename><surname>Barceló</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jorge</forename><surname>Pérez</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Juan</forename><surname>Reutter</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Alberto Mendelzon Workshop, AMW</title>
				<imprint>
			<date type="published" when="2012">2012</date>
			<biblScope unit="page" from="180" to="195" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<title level="m" type="main">Model Checking</title>
		<author>
			<persName><forename type="first">Edmund</forename><surname>Clarke</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Orna</forename><surname>Grumberg</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Doron</forename><surname>Peled</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1999">1999</date>
			<publisher>MIT Press</publisher>
		</imprint>
	</monogr>
	<note>1st edition</note>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Propositional dynamic logic of regular programs</title>
		<author>
			<persName><forename type="first">J</forename><surname>Michael</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Richard</forename><forename type="middle">E</forename><surname>Fischer</surname></persName>
		</author>
		<author>
			<persName><surname>Ladner</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Journal of Computer and System Sciences</title>
		<imprint>
			<biblScope unit="volume">18</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="194" to="211" />
			<date type="published" when="1979">1979</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Querying graph databases with xpath</title>
		<author>
			<persName><forename type="first">Leonid</forename><surname>Libkin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Wim</forename><surname>Martens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Domagoj</forename><surname>Vrgoc</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Conference on Database Theory</title>
				<imprint>
			<publisher>ICDT</publisher>
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">nSPARQL: A navigational language for RDF</title>
		<author>
			<persName><forename type="first">Jorge</forename><surname>Pérez</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Marcelo</forename><surname>Arenas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Claudio</forename><surname>Gutierrez</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">J. Web Sem</title>
		<imprint>
			<biblScope unit="volume">8</biblScope>
			<biblScope unit="issue">4</biblScope>
			<biblScope unit="page" from="255" to="270" />
			<date type="published" when="2010">2010</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">The taming of converse: Reasoning about two-way computations</title>
		<author>
			<persName><forename type="first">Moshe</forename><forename type="middle">Y</forename><surname>Vardi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Logic of Programs</title>
				<imprint>
			<date type="published" when="1985">1985</date>
			<biblScope unit="page" from="413" to="423" />
		</imprint>
	</monogr>
</biblStruct>

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