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

Reply via email to