An Algebraic Graph Transformation Approach
for RDF and SPARQL
Abstract
We consider the recommendations of the World Wide Web Consortium (W3C) about RDF framework and its associated query language SPARQL. We propose a new formal framework based on category theory which provides clear and concise formal definitions of the main basic features of RDF and SPARQL. We define RDF graphs as well as SPARQL basic graph patterns as objects of some nested categories. This allows one to clarify, in particular, the role of blank nodes. Furthermore, we consider basic SPARQL CONSTRUCT and SELECT queries and formalize their operational semantics following a novel algebraic graph transformation approach called POIM.
1 Introduction
Mathematical semantics of computer science languages has been advocated since early 1970’s. It allows one to give precise meaning of syntactical objects and paves the way for involved reasoning methods such as modularity, compositionality, security and verification techniques, to quote a few. Nowadays, graph databases are becoming a very influential technology in our society. Mastering programming languages involved in the encoding of such graph data is a necessity to elaborate robust modern data management systems. Relational algebra [7] was the main mathematical foundation underlying oldy SQL-like formalisms for databases. However, with the advent of new graph oriented formalisms such as the most recent recommendations of the World Wide Web Consortium (W3C) about the Resource Description Framework (RDF) [20] and the associated query language SPARQL [19], there is a clear need of an alternative to relational algebra which copes with this change in data encodings, see e.g., [5, 16, 13]. In this paper, we consider RDF and SPARQL languages and propose a new mathematical semantics of a kernel of these formalisms within algebraic graph transformations setting.
RDF graphs are the key data structure in RDF. In [20, Section 3], an RDF graph is defined as a set of RDF triples, where an RDF triple has the form . The subject is either an IRI (Internationalized Resource Identifier) or a blank node, the predicate is an IRI and the object is either an IRI, a literal (denoting a value such as a string, a number or a date) or a blank node. Blank nodes are arbitrary elements as long as they differ from IRIs and literals and they do not have any internal structure: they are used for indicating the existence of a thing and the blank node identifiers are locally scoped. For instance, let us consider a toy database, , consisting of the following four triples . The two first triples say that Alice knows Bob and Tom knows Dave whereas the last two triples say that Bob knows someone, represented by the blank node , who knows Alice. Notice that a predicate in an RDF triple cannot be a blank. For example, a triple such as standing for “there is some relationship between Paul and Henry” is not allowed in RDF, but only in generalized RDF [20, Section 7]. Following the theoretical point of view we propose in this paper, there is no harm to consider blank predicates within RDF triples. We thus consider data graphs in a more general setting including RDF graphs.
The query language SPARQL for RDF databases is based on basic graph patterns, which are kinds of RDF graphs with variables [19, Section 2]. In this paper, we consider query graphs which generalize basic graph patterns by allowing blanks to be predicates. The SPARQL query processor searches for triples within a given RDF database which match the triple patterns in the given basic graph pattern, and returns a multiset of solutions or an RDF graph. Considering basic graph patterns, one may wonder what is the difference between variables and blank nodes. SPARQL specifications in [19, Section 4.1.4] suggest similarities between them, whereas the opposite is made in [19, Section 16.2]. In the formalization of SPARQL we propose, blank nodes and variables are clearly distinguished by their respective roles in the definition of morphisms.
In the SPARQL recommendation [19], the SELECT query form is described lengthily. This query form can be compared to the SELECT query form of SQL, which returns a multiset of solutions. In contrast, the CONSTRUCT query form returns an RDF graph. Let us consider again the previous toy database and assume we formulate a CONSTRUCT query that constructs triples of the form every time there exists a third party such that the following condition, which we call , is satisfied : and . Then, and are query graphs with variables and . They intuitively stand for the left-hand and right-hand sides of a rule representing the considered CONSTRUCT query. To perform such query, one should consider all matches, , of the condition against the database and for each match , create a new triple . Starting from database, , this process yields the following result
From graph transformation point of view, is a host graph to be transformed by a rule whose left-hand and right-hand sides are respectively and . Notice that the resulting graph does not contain the non-matched triple . This means that the considered transformations are not necessarily local. In addition, the graph gathers all possible results triggered by the matches of against the host graph . This toy example is considered in Example 28.
Following our formalization, the CONSTRUCT query form, which is described very shortly in [19, Section 16.2], is more fundamental than the SELECT query form. Actually, we start by proposing an operational semantics for CONSTRUCT queries based on a new approach of algebraic graph transformations which we call POIM and we show afterward how SELECT queries can be easily encoded as CONSTRUCT queries. This new POIM approach represents a CONSTRUCT query as a rule of the form where and are basic graph patterns, and a rewrite step is made of a pushout followed by an image factorization. The result of a CONSTRUCT query is the outcome of the transformation one obtains when running the above rule against an RDF database. It happens that such rules and rewrite techniques can be used also to encode the solutions computed by SELECT query forms. As said earlier, the involved graph transformations are not local in the sense that only query answers should be computed out of the graph database. All parts which are not matched are deleted. Classical graph transformation techniques such as Double Pushout [9] and Single Pushout [10] or even more RDF oriented transformations like MPOC-PO [6] are not best recommended in this case (cf. Section 6 for a comparison with related work).
The paper is organized as follows. Section 2 defines the objects and the morphisms of the categories of data graphs and query graphs. Section 3 introduces the POIM algebraic transformation. In Section 4, we define two different operational semantics for CONSTRUCT queries and prove their equivalence. We first define a high-level calculus as a mere application of the POIM transformation. Then we propose a low-level calculus which is defined by means of several applications of the POIM transformation followed by a “merging” process. Both calculi implement faithfully the SPARQL semantics for CONSTRUCT queries (Theorem 21). In Section 5, we show how the POIM transformation can be used to define a novel operational semantics of the SELECT queries. This semantics, which is faithful to SPARQL definitions (Theorem 40), is obtained by an original translation of each SELECT query into a CONSTRUCT query. Concluding remarks and related work are discussed in Section 6.
2 Graphs of Triples
The set of IRIs, denoted , and the set of literals, denoted , with its usual operations, are defined in [20]. Essentially, an IRI (Internationalized Resource Identifier) is an internet address and a literal denotes a value such as a string, a number or a date. The sets and are disjoint. In addition, let be a countably infinite set, disjoint from and . The elements of are called blanks. According to [20, Section 3.1], an RDF graph is a set of RDF triples, where an RDF triple consists of three components: the subject, which is an IRI or a blank node; the predicate, which is an IRI; and the object, which is an IRI, a literal or a blank node. The set of nodes of an RDF graph is the set of subjects and objects of triples in the graph. Using set-theoretic notations, this can be expressed as follows: let , then an RDF triple is an element of and an RDF graph is a subset of . Let us also consider the following extension of RDF [20, Section 7]: A generalized RDF triple is a triple having a subject, a predicate, and object, where each can be an IRI, a blank node or a literal. A generalized RDF graph is a set of generalized RDF triples. Let , so that a generalized RDF triple is an element of and a generalized RDF graph is a subset of .
Let be a countably infinite set disjoint from , and . The elements of are called variables. According to [19, Section 2] a set of triple patterns is called a basic graph pattern, where triple patterns are like RDF triples except that each of the subject, predicate and object may be a variable. Let , then a triple pattern is an element of and a basic graph pattern is a subset of . Since is a subset of , each basic graph pattern is a subset of .
RDF graphs and basic graph patterns are generalized in Definition 2 as data graphs and query graphs respectively, are both relying on Definition 1.
Definition 1.
For each set , the triples on are the elements of . For each triple on the elements , and of are called respectively the subject, the predicate and the object of . A graph on is a set of triples on , i.e. a subset of . For each graph on , the subset of made of the subjects, predicates and objects of is called the set of attributes of and is denoted ; it follows that is a subset of . Let and be two graphs on . A morphism is a map such that there is a map such that is the restriction of to . Then is uniquely determined by and will be denoted by . This yields the category of graphs on , denoted . We say that a morphism of graphs on fixes a subset of if for each in . For each subset of , the subcategory of made of the graphs on with the morphisms fixing is denoted .
Thus, by mapping to we get a one-to-one correspondence between the morphisms of graphs on and the maps such that .
An isomorphism (i.e., an invertible morphism) in is a morphism of graphs on such that is a bijection and . A morphism fixing is determined by the restriction of the map to , where . An isomorphism in is a morphism of graphs on such that is the identity on and a bijection between and and . The notions of inclusion, subgraph, image and union for graphs on are defined as inclusion, subset, image and union for subsets of .
Definition 2.
Let , and be three pairwise distinct countably infinite sets, called respectively the sets of resource identifiers, blanks and variables. Let , and . The category of data graphs is and for each subset of the category of data graphs fixing is the subcategory of . The category of query graphs is and for each subset of the category of query graphs fixing is the subcategory of .
Thus, since , the RDF graphs are the data graphs where only nodes can be blanks and only nodes that are not subjects can be literals, and the RDF terms of an RDF graph are its attributes when it is seen as a data graph. Then the isomorphisms of RDF graphs, as defined in [20, Section 3.6.], are the isomorphisms in the category of data graphs fixing : indeed, two data graphs and are isomorphic in if and only if they differ only by the names of their blanks. For each data graph , let and , so that is the disjoint union of and . Similarly, the basic graph patterns of SPARQL are the query graphs where only nodes can be blanks and only nodes that are not subjects can be literals. For each query graph , let , and , so that is the disjoint union of , and .
Morphisms of graphs can be used, for instance, for substituting the variables of a query graph (Definition 3) or for interpreting a data graph in a universe of discourse (Definition 4).
Definition 3.
A match from a query graph to a data graph is a morphism of query graphs from to which fixes . The set of matches from to is denoted and the set of all matches from to any data graph is denoted .
Thus, a match fixes each resource identifier and it maps a variable or a blank to a resource identifier or a blank.
The interpretations of an RDF graph are also kinds of morphisms, see Definition 4. Note that this will not be used later in this paper. We define an interpretation of a data graph in a universe of discourse by generalizing the definition of a morphism, according to [20, Section 1.2.]: Any IRI or literal denotes something in the world (the “universe of discourse”). These things are called resources. The predicate itself is an IRI and denotes a property, that is, a resource that can be thought of as a binary relation. Recall that the binary relations on a set are the subsets of . It may happen that a binary relation on is itself an element of , this is important for understanding Definition 4 and the semantics of RDF in general.
Definition 4.
Given a set and a subset of made of binary relations on , let be the set of triples in such that and . The universe of discourse with as set of resources and as set of properties is the graph on . Given a universe of discourse on a set and a map , an interpretation of a data graph is a map such that for a map which extends .
In this paper, we consider categories and for various subsets of and respectively. It will always be the case that contains , so that we can say that resource identifiers have a “global scope”. In contrast, blanks have a “local scope”: in the basic part of RDF and SPARQL considered in this paper, the scope of a blank node is restricted to one data graph or one query graph. The note about blank node identifiers in [20, Section 3.4] distinguishes two kinds of syntaxes for RDF: an abstract syntax where blank nodes do not have identifiers and concrete syntaxes where blank nodes have identifiers. In our approach a blank is an attribute, which corresponds to a concrete syntax, and the abstract syntax is obtained by considering data graphs as objects of the category up to isomorphism, so that any blank node can be changed for a fresh blank node if needed.
Notation 5.
In the examples variables are denoted as ?x
, ?y
, …
and blanks as _:b
, _:c
, …
The IRIs are written in an abbreviated way as
:alice
(the address of Alice’s web page),
:knows
(the address where the “knows” relation is described), …
Each triple is written as s p o
and a dot is used for
separating triples inside an RDF graph or a basic graph pattern.
Example 6.
Consider three RDF graphs , and as follows. They are pairwise distinct, thus pairwise non-isomorphic in . Graphs and are isomorphic in . In the RDF semantics the name of blanks does not matter, so that both and mean that “Alice knows someone” and “someone knows Bob”. Graph is not isomorphic to (thus nor to ) in , it means more precisely that “Alice knows someone who knows Bob”.
:alice :knows _:b .
_:c :knows :bob
:alice :knows _:c .
_:b :knows :bob
:alice :knows _:b.
_:b :knows :bob
Now consider basic graph patterns to (each RDF graph can be seen as a basic graph pattern without variables, like and ). They are pairwise non-isomorphic in because they are pairwise distinct. In only and are isomorphic. In these query graphs belong to two different isomorphism classes: on one side and are isomorphic and on the other side , , and are isomorphic.
:alice :knows _:b.
_:b :knows :bob
:alice :knows ?x.
?x :knows :bob
:alice :knows _:b.
_:c :knows :bob
:alice :knows ?x.
?y :knows :bob
:alice :knows ?x.
_:b :knows :bob
:alice :knows ?x.
_:c :knows :bob
Assumption 7.
From now on is a countably infinite set, a subset of , the complement of in , and we assume that both and are countably infinite.
Remark 8.
Since is countably infinite, when dealing with a finite number of finite graphs
on it is always possible to find a fresh attribute outside ,
i.e., an element of that is not an attribute of any of the given graphs.
We will use repeatedly the following consequence of this fact:
Given a graph on , if any attribute of in
is replaced by any fresh attribute outside the result is
a graph on that is isomorphic to in .
Such a exists when is finite.
Now let us focus on some kinds of colimits of graphs on : coproducts in Proposition 9 and pushouts in Proposition 10. Recall that colimits in any category are defined up to isomorphism in this category. Remember that a morphism in and a map are such that for each attribute if and only if for each triple .
Proposition 9.
Given graphs on such that for each , the union is a coproduct of in . Given any finite graphs on there are graphs on such that is isomorphic to in for each and for each , and then the union is a coproduct of in .
Proof.
First, assume that for each . Consider morphisms in for and the maps . Note that and that is the disjoint union of the sets for and , because of the assumption for each . Thus we can define a map by: for each and each and for each . Then coincides with on for each . Thus for each we have , which proves that the image of by is in and that the restriction of defines a morphism in which coincides with on for each . Unicity is clear. Now, the last statement, about any finite graphs on , is a consequence of Remark 8. ∎
Proposition 10.
Let and be morphisms of graphs on such that and are finite, is an inclusion and fixes . Let us assume that (this is always possible up to isomorphism in , by Remark 8). Let be such that for and otherwise. Let , let be the restriction of and the inclusion. Then and the square is a pushout square in .
This means that is a kind of “union of and over ”, however it is not the case that is the union of and , in general. It is always the case that where but in general is not the identity on and moreover and are not disjoint.
Proof.
From we get , and since with we get . The definition of implies that . Now let and be any morphisms in such that . First, let us focus on attributes. We have and . Since we have for each . Since there is a unique map such that for and for . Thus on the one hand for each , so that . And on the other hand for each , if then , otherwise , so that . Second, let us consider triples. Since and and we get , which means that there is a morphism of graphs on such that , and . Unicity is clear. ∎
3 The POIM Transformation
A SPARQL query like “CONSTRUCT {} WHERE {}” is called basic when both and are basic graph patterns. In such a query, variables with the same name in and denote the same RDF term, whereas it is not the case for blank nodes. The statement “blank nodes in graph patterns act as variables” in [19, Section 4.1.4] holds for , whereas blank nodes in give rise to fresh blank nodes in the result of the query as in Examples 18 and 23. Thus, the meaning of blank nodes in is unrelated to the meaning of blank nodes in , and in both and each blank can be replaced by a fresh blank.
We generalize this situation in Definition 11 by allowing any data graphs for and up to isomorphism in : the resource identifiers and the variables in and are fixed but each blank can be replaced by a fresh blank. Thus, without loss of generality, we can assume that . Under this assumption, the set of triples with the inclusions of and in is a coproduct of and in the category . We also assume that each variable in occurs in , so that every substitution for the variables in provides a substitution for the variables in . The relevance of this assumption with respect to SPARQL queries is discussed in Section 4.1. Note that this assumption is equivalent to .
Definition 11.
A basic construct query is a pair of finite query graphs such that and , up to isomorphism in the category . The transformation rule of a basic construct query is the cospan where and and are the inclusions. Its left-hand side is and its right-hand side is .
Example 12.
Consider the following SPARQL CONSTRUCT query, based on the examples given
in the “CONSTRUCT” section (Section 16.2) of [19].
This query builds a triple ?x :FN ?name
for each triple
?x :name ?name
:
Query CONSTRUCT { ?x :FN ?name } WHERE { ?x :name ?name }
In the corresponding transformation rule there are no blanks in nor in , thus and and are the inclusions.
?x :name ?name
?x :name ?name . ?x :FN ?name ?x :FN ?name
Example 13.
Now the SPARQL CONSTRUCT query from Example 12 is modified by replacing both occurrences of the variable ?x by the blank node x:
Query CONSTRUCT { _:x :FN ?name } WHERE { _:x :name ?name }
In the corresponding transformation rule one blank has been modified so as to ensure that is empty, so that it is still the case that .
_:x :name ?name
_:x :name ?name . _:y :FN ?name _:y :FN ?name
When a basic SPARQL query “CONSTRUCT {} WHERE {}” is run against an RDF graph , and when there is precisely one match of into , the result of the query is an RDF graph obtained by substituting the variables in . This substitution can be seen as a match of into . We claim that the process of building with this match of into from the match of into can be seen as a two-step process involving an intermediate match of in an RDF graph . This claim will be proved, more generally, in Section 4. The definition of this two-step process relies on an algebraic construction that we call the POIM transformation: PO for pushout and IM for image (Definition 14). The POIM transformation is related to a large family of algebraic graph transformations based on pushouts, like the SPO (Simple Pushout) [10], DPO (Double Pushout) [9] or SqPO (Sesqui-Pushout) [8]. In the POIM transformation, the PO step creates fresh blank nodes and instantiates the variables of , while the IM step deletes everything that is not in the image of , as explained now.
Given a basic construct query and its transformation rule , the POIM transformation is defined as a map from the matches of to the matches of , in two steps: first from the matches of to the matches of , then from the matches of to the matches of . Given an inclusion in , the cobase change along is the map that maps each to defined from the pushout of and in , as described in Proposition 10. Note that is a data graph because of the assumption . Given an inclusion in , the image factorization along is the map that maps each to where is the image of in and is the restriction of and is the inclusion. This leads to Definition 14 and Proposition 15.
Definition 14.
Let be a basic construct query and its transformation rule. The POIM transformation map of is the map
composed of the cobase change map and the image factorization map . The result of applying to a match is the match or simply the query graph .
(1) |
Proposition 15 says that is obtained from by instantiating all variables as in and by renaming blanks in an arbitrary way, as long as this renaming is one-to-one. Note that only the image of the match is transformed and the remaining parts of the RDF graph are deleted.
Proposition 15.
Let be a basic construct query and a match. Let be defined by for and otherwise. Then, up to isomorphism in , the result of applying to is where and is the restriction of .
Proof.
We use the notations of Diagram (1). Up to isomorphism in we can assume that all blanks in or in are distinct from the blanks in . Then , so that by Proposition 10 the data graph is where is such that for and otherwise. It follows that the restriction of to is such that for and otherwise. Note that is the disjoint union of , that is fixed by all morphisms in , and , with since . Thus the restriction of to is such that for and otherwise. The result follows. ∎
Remark 16.
Each set can be seen as a coslice category, then the maps and can be seen as functors: this could be useful when extending this paper to additional features of SPARQL.
Example 17.
Consider the SPARQL CONSTRUCT query from Example 12:
Query CONSTRUCT { ?x :FN ?name } WHERE { ?x :name ?name }
and let us run this query against the RDF graph :
:alice :name "Alice" . :alice :nick "Lissie"
There is a single match , it is such that and . The POIM transformation produces successively the following data graphs and , where is the query result:
:alice :name "Alice" .
:alice :nick "Lissie"
:alice :name "Alice" . :alice :nick "Lissie" . :alice :FN "Alice" :alice :FN "Alice"
Example 18.
Now consider the SPARQL CONSTRUCT query from Example 13:
Query CONSTRUCT { _:x :FN ?name } WHERE { _:x :name ?name }
Let us run this query against the RDF graph from Example 17. There is a single match , it is such that and . The POIM transformation produces successively the following data graphs and , where is the query result:
:alice :name "Alice" .
:alice :nick "Lissie"
:alice :name "Alice" . :alice :nick "Lissie" . _:b :FN "Alice" _:b :FN "Alice"
4 Running Basic Construct Queries
This Section begins with our definition of the query result of applying a basic construct query (Definition 11) to a data graph (Definition 2). Theorem 21 in Section 4.1 proves that our query result coincides (up to renaming blanks) with the answer returned by SPARQL when and are basic graph patterns and is an RDF graph. In Section 3, we defined the POIM transformation for running a basic construct query against a data graph , when there is exactly one match from to . Now, we define two different calculi for running a basic construct query against a data graph without any assumption on the number of matches. The high-level calculus (Definition 24) is one “large” application of the POIM transformation. The low-level calculus (Definition 26) consists of several “small” applications of the POIM transformation followed by a “merging” process. The construction of the high-level calculus is simpler, while the low-level calculus better fits with the description of the running process in SPARQL. Proposition 25 in Section 4.2 and Proposition 29 in Section 4.3 prove that both calculi compute the query result.
Definition 19.
Let be a basic construct query and a data graph. Assume (without loss of generality) that and . Let be the matches from to . For each let be the data graph obtained from by replacing each variable in by and each blank in by a fresh blank (which means: a fresh blank for each blank in and each in ). The query result of applying the basic construct query to the data graph is the data graph .
4.1 Running Basic Construct Queries in SPARQL
The answer of a SPARQL CONSTRUCT query over an RDF graph is defined in [15, Section 5], based on the seminal paper [16]. Note that in [15] literals are allowed as subjects or predicates in RDF graphs, however for our purpose this does not matter, so that we stick to the definition of an RDF graph from [20], as reminded at the beginning of Section 2. Thus, as , a data graph is an RDF graph if and only if each triple in is an RDF triple, which means that and . Note that for each subset of and each subset of , each map gives rise to a map such that when and otherwise, then gives rise to which is the restriction of to . There will not be any ambiguity in denoting not only the given but also its extensions and . For simplicity we consider only the SPARQL queries “CONSTRUCT WHERE ” such that each variable in occurs in . Indeed, variables outside cannot be instantiated in the result, and according to [19, Section 16.2], if a triple contains an unbound variable, then that triple is not included in the output RDF graph. Thus, triples involving a variable in , if any, can be dropped. It is assumed in [15] that there is no blank in . Indeed, since blank nodes in graph patterns act as variables, each blank in can be replaced by a fresh variable.
Definition 20 ([15]).
A solution mapping (or simply a mapping) from a basic graph pattern to an RDF graph is a map such that . When and are basic graph patterns such that , the answer of the SPARQL query “CONSTRUCT WHERE ” over an RDF graph is the set of all RDF triples for all triples and all mappings from to , where for each a map is chosen in such a way that the subsets of are pairwise distinct and all of them are distinct from .
Theorem 21.
Let and be basic graph patterns with and . Then is a basic construct query and the set of RDF triples in the query result of applying to an RDF graph is isomorphic in to the answer of the SPARQL query “CONSTRUCT WHERE ” over .
Proof.
Clearly is a basic construct query and . We can assume without loss of generality that . The query result of applying to is given by Definition 19, based on the set of matches from to . The Theorem now follows from the fact that the maps (or ) on triples which are associated to the mappings are precisely the matches from to . ∎
Example 22.
Query CONSTRUCT { ?x :FN ?name } WHERE { ?x :name ?name }
and let us run this query against the RDF graph :
:alice :name "Alice" . :alice :nick "Lissie" . :bob :name "Bob" . :bob :nick "Bobby"
There are two matches and we get the RDF graphs , and the result :
:alice :FN "Alice"
:bob :FN "Bob"
:alice :FN "Alice" .
:bob :FN "Bob"
Example 23.
Consider the SPARQL CONSTRUCT query:
Query CONSTRUCT { _:c :FN ?name } WHERE { ?x :name ?name }
Note that this query always returns the same result as the query from Examples 13 and 18. Let us run this query against the RDF graph from Example 22. There are two matches and we get the RDF graphs , and the result :
_:c :FN "Alice"
_:c :FN "Bob"
_:c1 :FN "Alice" .
_:c2 :FN "Bob"
4.2 The High-level Calculus
Let be a natural number. According to Proposition 9, for each query graph the query graph , coproduct of copies of in , can be built (up to isomorphism) as follows: for each let be a copy of where each blank and variable has been renamed in such a way that there is no blank or variable common to two of the ’s, then the query graph is the union . Now let be a basic construct query. The transformation rule is a cospan in , that gives rise to the cospan . Since and are inclusions, this renaming can be done simultaneously in the copies of , and , so that and and are the inclusions. Thus, is a basic construct query and is its corresponding transformation rule.
Definition 24.
Let be a basic construct query and a data graph. Let be the matches from to . Consider the basic construct query . Let be the match from to that coincides with on the -th component of . The high-level query result of against is the result of applying the POIM transformation map to the match , as in Diagram (2).
(2) |
Proposition 25.
Let be a basic construct query and a data graph. The high-level query result of against is isomorphic, in the category , to the query result of against .
Proof.
This is a consequence of the description of the result of a POIM transformation from Proposition 15. ∎
4.3 The Low-level Calculus
The low-level calculus is a two-step process: first one local result is obtained for each match, using a POIM transformation, then the local results are glued together in order to form the low-level query result.
Definition 26.
Let be a basic construct query and a data graph. Let be the matches from to . For each let be the image of and let us still denote the restriction . The local result of against along is the result of applying the POIM transformation map to the match . Let . The low-level query result of against is the coproduct of the ’s in the category of data graphs with morphisms fixing all resource identifiers and the blanks that are in .
(3) |
Example 27.
Let us apply the low-level calculus to Example 23. The match produces :
:alice :name "Alice"
:alice :name "Alice" . _:c :FN "Alice" _:c :FN "Alice"
and similarly the match produces :
:bob :name "Bob"
:bob :name "Bob" . _:c :FN "Bob" _:c :FN "Bob"
Finally the query result , which is the coproduct of and in category , is isomorphic to from Example 23.
_:c1 :FN "Alice" . _:c2 :FN "Bob"
Example 28.
This example illustrates how local results are “merged” to compute the result in the low-level calculus. The SPARQL query is the following:
Query CONSTRUCT { ?x :acquaintedWith ?z } WHERE { ?x :knows ?y . ?y :knows ?z }
Its corresponding transformation rule is:
?x :knows ?y .
?y :knows ?z
?x :knows ?y . ?y :knows ?z . ?x :acquaintedWith ?z ?x :acquaintedWith ?z
This query is applied to the following graph :
:alice :knows :bob . :bob :knows _:c . _:c :knows :alice . :cathy :knows :david
There are three matches , , , thus three local results , , :
:alice :acquaintedWith _:c
_:c :acquaintedWith :bob
:bob :acquaintedWith :alice
The blank _:c in and is not duplicated in the coproduct because it comes from . Thus the result is:
:alice :acquaintedWith _:c . _:c :acquaintedWith :bob . :bob :acquaintedWith :alice
Proposition 29.
Let be a basic construct query and a data graph. The low-level query result of against is isomorphic, in the category , to the query result of against .
5 Running Basic Select Queries
The CONSTRUCT query form of SPARQL returns a data graph whereas the SELECT query form returns a table, like the SELECT query form of SQL. Both in SQL and in SPARQL, it is well-known that such tables are not exactly relations in the mathematical sense: in mathematics a relation on is a subset of the cartesian product , while the result of a SELECT query in SQL or SPARQL is a multiset of elements of . In order to avoid ambiguities, such a multiset is called a multirelation on . When all ’s are the same set it is called a multirelation of arity on .
A SPARQL query such as “SELECT WHERE {}” is called basic when is a basic graph pattern and are distinct variables. We generalize this situation by defining a basic select query as a pair where is a finite query graph and is a finite set of variables. Then we associate to each basic select query a basic construct query . Finally we define the result of running the basic select query against a data graph from the data graph result of running the basic construct query against . This process is first described on an example.
Example 30.
Consider the following SPARQL SELECT query:
SELECT Query SELECT ?nameX ?nameY WHERE { ?x :knows ?y . ?x :name ?nameX . ?y :name ?nameY }
We associate to this SELECT query the following CONSTRUCT query:
CONSTRUCT Query CONSTRUCT { _:r nameX ?nameX . _:r nameY ?nameY } WHERE { ?x :knows ?y . ?x :name ?nameX . ?y :name ?nameY }
Let us run this CONSTRUCT query against the RDF graph :
_:alice :name "Alice" . _:bob :name "Bob" . _:bobby :name "Bob" . _:cathy :name "Cathy" . _:alice :knows _:bob . _:alice :knows _:bobby . _:alice :knows _:cathy
The result is the RDF graph :
_:l1 nameX "Alice" . _:l1 nameY "Bob" . _:l2 nameX "Alice" . _:l2 nameY "Bob" . _:l3 nameX "Alice" . _:l3 nameY "Cathy"
From the data graph we get the following table, by considering each blank in as the identifier of a line in the table. Note that the set of triples in becomes a multiset of lines in the table. This table is indeed the answer of the SPARQL SELECT query over .
nameX | nameY |
---|---|
"Alice" | "Bob" |
"Alice" | "Bob" |
"Alice" | "Cathy" |
In order to generalize Example 30 we have to define a transformation from each SELECT query to a CONSTRUCT query and a transformation from the result of this CONSTRUCT query to the result of the given SELECT query. For this purpose, we first define relational data graphs (Definition 31) and relational query graphs (Definition 34).
Definition 31.
A relational data graph on a finite set of resource identifiers is a data graph made of triples where the ’s are pairwise distinct blanks and the ’s are in , for and in some finite set .
Proposition 32.
Each relational data graph determines a multirelation of arity on .
Proof.
This result is clear from the definitions of relational data graphs and multirelations. ∎
Example 33.
In Example 30 the graph is a relational data graph on the set and the table result of the SELECT query is its corresponding multirelation.
Assume that each variable in SPARQL is written as “” for some string .
Definition 34.
The relational query graph on a finite set of variables is the query graph made of the triples where and is a blank. Note that is uniquely determined by up to isomorphism in .
Example 35.
Here is the relational query graph on :
_:r nameX ?nameX . _:r nameY ?nameY
Below, we show how a basic select query can be encoded as a basic construct query (Definition 36) and we prove that the result of the given select query is easily recovered from the result of its associated construct query (Theorem 40).
Definition 36.
A basic select query is a pair where is a finite query graph and is a finite set of variables such that each variable in occurs in . The basic construct query associated to a basic select query is where is the relational query graph on .
Proposition 37.
Let be a basic select query and a data graph. The query result of against is a relational data graph . More precisely, let and let be the matches from to , then is the set of triples where , , and the blanks are pairwise distinct.
Proof.
We have , so that according to Definition 19 the query result of against is where and the blanks are pairwise distinct. ∎
Because of Proposition 37 we can state the following definition.
Definition 38.
Let be a basic select query and a data graph. Let be the query result of against . The query result of against is the multirelation on .
The answer, or evaluation, of a SPARQL SELECT query over an RDF graph is defined in [13, Section 2.3] as follows.
Definition 39 ([13]).
Let be a basic graph pattern of SPARQL, a finite set of variables included in and let be an RDF graph. The answer of the SPARQL query “SELECT WHERE {}” over is the multiset with elements the restrictions of the mappings from to to the subset of , each with multiplicity the number of corresponding ’s.
Theorem 40.
Let be a basic graph pattern of SPARQL and a finite set of variables included in and let be an RDF graph. Then the query result of against is the answer of the SPARQL query “SELECT WHERE {}” over .
Proof.
Since the mappings from to correspond bijectively to the matches from to , the result follows from Proposition 37. ∎
6 Conclusion
In this paper, we bet to base our work entirely on algebraic theories behind graphs and their transformations. Suitable categories of data graphs and query graphs are defined and the definition of morphisms of query graphs clarifies the difference between blank nodes and variables. Besides, we propose to encode CONSTRUCT and SELECT queries as graph rewrite rules, of the form , and define their operational semantics following a novel algebraic approach called POIM. From the proposed semantics, blanks in play the same role as variables and thus can be replaced by variables, whereas blanks in are used for creating new blanks in the result of a CONSTRUCT query. As in [15], we focus on the CONSTRUCT query form as the fundamental query form. In addition we propose a translation of the SELECT queries as CONSTRUCT queries compatible with their operational semantics. One of the benefits of using category theory is that coding of data graphs as sets of triples is not that important. The results we propose hold for all data models which define a category with enough colimits. For intance, one may expect to define data graph categories for the well-known Edge-labelled graphs or Property graphs [17]. The proposed operational semantics can clearly benefit from all results regarding efficient graph matching implementation, see e.g. [12].
Among related works, a category of RDF graphs as well as their transformations have been proposed in [6]. The authors defined objects of RDF graph categories of the form where and denote respectively the set of blank nodes and the set of triples of graph . In addition, the morphisms of such RDF graphs associate blank nodes to blank nodes. These definitions of object and morphisms are different from ours. Associating a blank node to any element of a triple, as our homomorphisms do, is called instantiation in [6]. The authors did not tackle the problem of answering SPARQL queries but rather proposed an algebraic approach to transform RDF graphs. Their approach, called MPOC-PO, is inspired from DPO where the first square is replaced by a “minimal” pushout complement (MPOC). However, MPOC-PO drastically departs from the POIM transformations we propose. This difference is quite natural since the two approaches have different aims : the POIM approach is dedicated to implement SPARQL queries while the MPOC-PO is intended to transform RDF graphs in general. However, MPOC-PO and DPO approaches are clearly not tailored to implement CONSTRUCT or SELECT queries since the (minimal) pushout complements always include parts of large data graphs which are not matched by the queries while such parts are not involved in the query answers. The same remark applies also to graph transformations where rules are cospans as in [11].
The image factorization part of POIM steps does not yield, in general, the same result as a pushout complement or a pullback complement constructs. For example, let us consider the following query
Query CONSTRUCT {?x :pred :bob} WHERE {?x :pred ?y. ?z :pred :bob}
The POIM rule corresponding to this query and its application to a graph consisting of one triple are depicted below.
?x :pred ?y . ?z :pred :bob | ?x :pred ?y . ?z :pred :bob . ?x :pred :bob | ?x :pred :bob | ||
|
|
|
||
:alice :pred :bob | :alice :pred :bob | :alice :pred :bob |
The reader can easily check that the right square is neither a pushout nor a pullback.
In [2], even if the authors use a categorical setting, their objectives and results depart from ours as they mainly encode every ontology as a category. However, Graph Transformations have already been used in modeling relational databases, see e.g. [4] where a visual and textual hybrid query language has been proposed. In [14], the main features of a data management system based on graphs have been proposed where the underlying typed attributed data graphs are different from those of RDF and SPARQL. In [3], triple graph grammars (TGG) have also been used for data modelling and model transformation rules to be compiled into Graph Data Bases code for execution.
In this paper, we consider basic graphs and queries, which form a significant kernel of RDF and SPARQL. Future work includes the generalization of the present study to other features of RDF and SPARQL in order to encompass general SPARQL queries. We also consider investigating RDF Schema [21] and ontologies from this point of view.
References
- [1]
- [2] S. Aliyu, S.B. Junaidu & A. F. Donfack Kana (2015): A Category Theoretic Model of RDF Ontology. International Journal of Web & Semantic Technology 6(3), pp. 41–51, 10.5121/ijwest.2015.6304.
- [3] Abdullah Alqahtani & Reiko Heckel (2018): Model Based Development of Data Integration in Graph Databases Using Triple Graph Grammars. In: STAF 2018, LNCS 11176, Springer, pp. 399–414, 10.1007/978-3-030-04771-9_29.
- [4] Marc Andries & Gregor Engels (1996): A Hybrid Query Language for an Extended Entity-Relationship Model. J. Vis. Lang. Comput. 7(3), pp. 321–352, 10.1006/jvlc.1996.0017.
- [5] Renzo Angles, Marcelo Arenas, Pablo Barceló, Aidan Hogan, Juan L. Reutter & Domagoj Vrgoc (2017): Foundations of Modern Query Languages for Graph Databases. ACM Comput. Surv. 50(5), pp. 68:1–68:40, 10.1145/3104031.
- [6] Benjamin Braatz & Christoph Brandt (2008): Graph Transformations for the Resource Description Framework. ECEASST 10, 10.14279/tuj.eceasst.10.158.
- [7] Edgar F. Codd (1990): The relational Model for Database Management (Version 2 ed.). Addison-Wesley.
- [8] Andrea Corradini, Tobias Heindel, Frank Hermann & Barbara König (2006): Sesqui-Pushout Rewriting. In: ICGT 2006, LNCS 4178, Springer, pp. 30–45, 10.1007/11841883_4.
- [9] Andrea Corradini, Ugo Montanari, Francesca Rossi, Hartmut Ehrig, Reiko Heckel & Michael Löwe (1997): Algebraic Approaches to Graph Transformation - Part I: Basic Concepts and Double Pushout Approach. In Rozenberg [18], pp. 163–246, 10.1142/3303.
- [10] Hartmut Ehrig, Reiko Heckel, Martin Korff, Michael Löwe, Leila Ribeiro, Annika Wagner & Andrea Corradini (1997): Algebraic Approaches to Graph Transformation - Part II: Single Pushout Approach and Comparison with Double Pushout Approach. In Rozenberg [18], pp. 247–312, 10.1142/3303.
-
[11]
Hartmut Ehrig,
Frank Hermann &
Ulrike Prange
(2009): Cospan DPO Approach: An
Alternative for DPO Graph Transformations.
Bulletin of the EATCS
98, pp. 139–149.
Available at https://eatcs.org/images/bulletin/beatcs98.pdf. - [12] Wenfei Fan, Jianzhong Li, Shuai Ma, Hongzhi Wang & Yinghui Wu (2010): Graph Homomorphism Revisited for Graph Matching. PVLDB 3(1), pp. 1161–1172, 10.14778/1920841.1920986.
- [13] Mark Kaminski, Egor V. Kostylev & Bernardo Cuenca Grau (2017): Query Nesting, Assignment, and Aggregation in SPARQL 1.1. ACM Trans. Database Syst. 42(3), pp. 17:1–17:46, 10.1145/3083898.
- [14] Norbert Kiesel, Andy Schürr & Bernhard Westfechtel (1995): GRAS, a Graph-Oriented (Software) Engineering Database System. Inf. Syst. 20(1), pp. 21–51, 10.1016/0306-4379(95)00002-L.
- [15] Egor V. Kostylev, Juan L. Reutter & Martín Ugarte (2015): CONSTRUCT Queries in SPARQL. In: 18th International Conference on Database Theory, ICDT 2015, March 23-27, 2015, Brussels, Belgium, pp. 212–229, 10.4230/LIPIcs.ICDT.2015.212.
- [16] Jorge Pérez, Marcelo Arenas & Claudio Gutiérrez (2009): Semantics and complexity of SPARQL. ACM Trans. Database Syst. 34(3), pp. 16:1–16:45, 10.1145/1567274.1567278.
- [17] Ian Robinson, Jim Webber & Emil Eifrem (2013): Graph Databases. O’Reilly Media, Inc.
- [18] Grzegorz Rozenberg, editor (1997): Handbook of Graph Grammars and Computing by Graph Transformations, Volume 1: Foundations. World Scientific, 10.1142/3303.
-
[19]
(2013): SPARQL 1.1 Query Language.
W3C Recommendation.
Available at https://www.w3.org/TR/sparql11-query/. -
[20]
(2014): RDF 1.1 Concepts and Abstract
Syntax.
W3C Recommendation.
Available at https://www.w3.org/TR/rdf11-concepts/. -
[21]
(2014): RDF Schema 1.1.
W3C Recommendation.
Available at https://www.w3.org/TR/2014/REC-rdf-schema-20140225/.