Algebra
On this page
Like most query engines, instead of internally working directly with a SPARQL query string, Comunica works with an algebraic representation of a SPARQL query, corresponding to the SPARQL 1.1 algebra. This SPARQL algebra makes it easier for operating on SPARQL operators in a consistent manner, and for applying transformations during query optimization.
Query Operation Actors
All actors on the Query Operation bus
correspond to exactly one SPARQL algebra operator type.
For example, @comunica/actor-query-operation-construct
handles algebra operations with type 'construct'
.
SPARQLAlgebra.js
Converting a query string to SPARQL algebra
happens in the SPARQL Parse bus.
The @comunica/actor-query-parse-sparql
actor
on this bus makes use of the SPARQLAlgebra.js package.
Examples on how the conversion between SPARQL query string and SPARQL algebra happens can be found in the tests: https://github.com/joachimvh/SPARQLAlgebra.js/tree/master/test
Converting a SPARQL query into algebra
If you want to quickly check what the algebra of a given SPARQL query string looks like, you can make use of Comunica's explain functionality as follows:
$ comunica-sparql https://fragments.dbpedia.org/2016-04/en -q 'SELECT * { ?s ?p ?o }' --explain parsed
{
"type": "project",
"input": {
"type": "bgp",
"patterns": [
{
"termType": "Quad",
"value": "",
"subject": {
"termType": "Variable",
"value": "s"
},
"predicate": {
"termType": "Variable",
"value": "p"
},
"object": {
"termType": "Variable",
"value": "o"
},
"graph": {
"termType": "DefaultGraph",
"value": ""
},
"type": "pattern"
}
]
},
"variables": [
{
"termType": "Variable",
"value": "s"
},
{
"termType": "Variable",
"value": "p"
},
{
"termType": "Variable",
"value": "o"
}
]
}
This tool is therefore useful if you want to implement support for a SPARQL operator, but you need to find out to what algebra operation this corresponds.
Converting algebra into a SPARQL query
You can also apply the reverse transformation from algebra to SPARQL query string, for which you will need to globally install SPARQLAlgebra.js:
$ npm install -g sparqlalgebrajs
$ sparqlalgebrajs -q -r '
{
"type": "project",
"input": {
"type": "bgp",
"patterns": [
{
"type": "pattern",
"termType": "Quad",
"value": "",
"subject": {
"termType": "Variable",
"value": "x"
},
"predicate": {
"termType": "Variable",
"value": "y"
},
"object": {
"termType": "Variable",
"value": "z"
},
"graph": {
"termType": "DefaultGraph",
"value": ""
}
}
]
},
"variables": [
{
"termType": "Variable",
"value": "x"
},
{
"termType": "Variable",
"value": "y"
},
{
"termType": "Variable",
"value": "z"
}
]
}
'
SELECT ?x ?y ?z WHERE { ?x ?y ?z }