OK I simply fed Jena's source to ChatGPT and asked it to produce an RDFLIb version :) No idea if it's correct but I'll find out I guess.
from rdflib import Variable, BNode, Literal from rdflib.plugins.sparql.algebra import BGP, Filter, Join, LeftJoin, Union, Graph, Extend, Minus, OrderBy, Project def substitute(algebra, binding): if isinstance(algebra, BGP): new_triples = [] for s, p, o in algebra.triples: s = binding.get(s, s) p = binding.get(p, p) o = binding.get(o, o) new_triples.append((s, p, o)) return BGP(new_triples) elif isinstance(algebra, Filter): new_p = substitute(algebra.p, binding) new_expr = algebra.expr for var, val in binding.items(): new_expr = new_expr.substitute(var, val) return Filter(new_expr, new_p) elif isinstance(algebra, Join): return Join(substitute(algebra.p1, binding), substitute(algebra.p2, binding)) elif isinstance(algebra, LeftJoin): return LeftJoin(substitute(algebra.p1, binding), substitute(algebra.p2, binding), algebra.expr) elif isinstance(algebra, Union): return Union(substitute(algebra.p1, binding), substitute(algebra.p2, binding)) elif isinstance(algebra, Graph): return Graph(algebra.term, substitute(algebra.p, binding)) elif isinstance(algebra, Extend): new_p = substitute(algebra.p, binding) new_expr = algebra.expr for var, val in binding.items(): new_expr = new_expr.substitute(var, val) return Extend(new_p, new_expr, algebra.var) elif isinstance(algebra, Minus): return Minus(substitute(algebra.p1, binding), substitute(algebra.p2, binding)) elif isinstance(algebra, OrderBy): return OrderBy(substitute(algebra.p, binding), algebra.expr) elif isinstance(algebra, Project): return Project(substitute(algebra.p, binding), algebra.PV) else: return algebra On Thu, Feb 6, 2025 at 12:54 AM Martynas Jusevičius <marty...@atomgraph.com> wrote: > > Hi, > > I was looking to implement something like substitute() using RDFLib. > > I checked the note: > https://afs.github.io/substitute.htm > But I couldn't find a clear example. > > For example, how would this query string (the template) > > PREFIX dbo: <http://dbpedia.org/ontology/> > CONSTRUCT > WHERE { ?city dbo:populationTotal ?population } > > would look like after substituting (?city, > <http://dbpedia.org/resource/Copenhagen>)? > > > Martynas