Corese 3.0 / KGRAM SPARQL AST

olivier.corby at inria.fr - Edelweiss - INRIA Sophia Antipolis-Méditerranée - 2011.

This document describes SPARQL Abstract Syntax Tree API. It can be used to create a query by program. The resulting ast can be executed right away by KGRAM. TBD: SPARQL Update.

SPARQL Abstract Syntax Tree with namespace manager:

ASTQuery ast  = ASTQuery.create();
NSManager nsm = NSManager.create();
ast.setNSM(nsm);
nsm.defNamespace("http://ns.inria.fr/schema/", "ns");

Variable:

Variable.create("?x");

URI Constant, Datatype Constant, Literal with lang

ast.createConstant("ns:John");	
ast.createConstant("12", "xsd:integer", null);
ast.createConstant("engineer", null, "en");

Triple:

Triple t1 = Triple.create(
  Variable.create("?x"), ast.createConstant("rdf:type"), Variable.create("?y"));

Body:

Exp body = BasicGraphPattern.create();
body.add(t1);
ast.setBody(body);	

SPARQL Statements:

BasicGraphPattern bgp = BasicGraphPattern.create();
Option.create(bgp);
Source.create(graph, bgp);
Minus.create(bgp);
Or.create(bgp1, bgp2);

bgp.add(e1);
bgp.add(e2);

Filter:

Term.create("<", Variable.create("?x"), ast.createConstant("100", "xsd:integer", null)); 

Term.create("&&", t1, t2);

Term.create("||", t1, t2);

Term.create("!", t1, t2);

Term.function("isBlank", Variable("?t"));

// future sparql 1.0.1
Term list = Term.list();
list.add(t1);
list.add(t2);
Term.create("in", Variable.create("?x"), list);

Add a filter:

Term t = Term.create("&&", t1, t2);
Triple triple = Triple.create(t);
BasicGraphPattern bgp = BasicGraphPattern.create();
bgp.add(triple);

Select:

ast.setSelect(Variable.create("?x"));

ast.setSelect(Variable.create("?sum"), 
  Term.create("+", Variable.create("?x"), Variable.create("?y)));

ast.setSelectAll(true);

ast.setDistinct(true);

From:

ast.setFrom (ast.createConstant("http://www.example.org/graph"));
ast.setNamed(ast.createConstant("http://www.example.org/graph"));

Construct:

ast.setConstruct(bgp);

Describe:

ast.setDescribe(Variable.create("?z"));

Ask:

ast.setResultForm(ASTQuery.QT_ASK);
// future sparql 1.0.1: 
ast.setAsk(true);

Order by, group by:

ast.setSort(var);
ast.setSort(var, true);

ast.setSort(exp);
ast.setSort(exp, true);

ast.setGroup(var);
ast.setGroup(exp, var);

Limit, offset:

ast.setMaxResult(10);
// future sparql 1.0.1:
ast.setLimit(10);

ast.setOffset(10);

Subquery:

ASTQuery sub = ast.subCreate();

q = Query.create(sub); 
body.add(q);

Property Path Regex:

ast.createConstant("rdf:type");

ast.createOperator("^", regex);
ast.createOperator("!", regex);
ast.createOperator("+", regex);
ast.createOperator("*", regex);
ast.createOperator("?", regex);
ast.createOperator("1", "5", regex);

ast.createConditionalOrExpression ("|", regex1, regex2);
ast.createConditionalAndExpression("/", regex1, regex2);

// future sparql 1.0.1:
ast.createOperator ("|", regex1, regex2);
ast.createOperator ("/", regex1, regex2);

Property Path:

ast.createTriple(subject, ast.createProperty(regex), object);

Aggregates:

Term agg = Term.function("group_concat", Variable.create("?x"));
agg.setDistinct(true);
agg.setModality("; ");
ast.setSelect(Variable.create("?conc"), agg);

Having:

// future sparql 1.0.1:
Term exp = Term.create(">=", Variable.create("?x"), ast.createConstant("12", "xsd:integer"));
ast.setHaving(exp);

Bindings:

List<Variable> lVar = new ArrayList<Variable>();
lVar.add(Variable.create("?x"));
lVar.add(Variable.create("?y"));

ast.setVariableBindings(lVar);

List<Constant> lValue = new ArrayList<Constant>();
lValue.add(ast.createConstant("ns:John"));
lValue.add(ast.createConstant("1", "xsd:integer"));

ast.setValueBindings(lValue);