diff options
author | Nicholas Car <nicholas.car@surroundaustralia.com> | 2020-04-16 10:41:21 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-16 10:41:21 +1000 |
commit | acb9d100813c263add36754033847aaa669ae443 (patch) | |
tree | 9c84e724c411ff0283f1a7223b6845776245bb41 | |
parent | 604d63e1b1750b26f7fd21b1d4ffb42d481d44c4 (diff) | |
parent | 1dbe7acc945a545d3b18ec5025c19b26d1ed110f (diff) | |
download | rdflib-acb9d100813c263add36754033847aaa669ae443.tar.gz |
Merge pull request #1002 from sa-bpelakh/1001-construct-init-bindings
CONSTRUCT resolve with initBindings fixes #1001
-rw-r--r-- | rdflib/plugins/sparql/sparql.py | 5 | ||||
-rw-r--r-- | test/test_sparql_construct_bindings.py | 40 |
2 files changed, 44 insertions, 1 deletions
diff --git a/rdflib/plugins/sparql/sparql.py b/rdflib/plugins/sparql/sparql.py index d6d445e8..be980f44 100644 --- a/rdflib/plugins/sparql/sparql.py +++ b/rdflib/plugins/sparql/sparql.py @@ -173,7 +173,10 @@ class FrozenBindings(FrozenDict): if not type(key) in (BNode, Variable): return key - return self._d[key] + if key not in self._d: + return self.ctx.initBindings[key] + else: + return self._d[key] def project(self, vars): return FrozenBindings( diff --git a/test/test_sparql_construct_bindings.py b/test/test_sparql_construct_bindings.py new file mode 100644 index 00000000..d5a68b94 --- /dev/null +++ b/test/test_sparql_construct_bindings.py @@ -0,0 +1,40 @@ +from rdflib import Graph, URIRef, Literal, BNode +from rdflib.plugins.sparql import prepareQuery +from rdflib.compare import isomorphic + +import unittest +from nose.tools import eq_ + +class TestConstructInitBindings(unittest.TestCase): + + def test_construct_init_bindings(self): + """ + This is issue https://github.com/RDFLib/rdflib/issues/1001 + """ + + g1 = Graph() + + q_str = (""" + PREFIX : <urn:ns1:> + CONSTRUCT { + ?uri :prop1 ?val1; + :prop2 ?c . + } + WHERE { + bind(uri(concat("urn:ns1:", ?a)) as ?uri) + bind(?b as ?val1) + } + """) + q_prepared = prepareQuery(q_str) + + expected = [ + (URIRef('urn:ns1:A'),URIRef('urn:ns1:prop1'), Literal('B')), + (URIRef('urn:ns1:A'),URIRef('urn:ns1:prop2'), Literal('C')) + ] + results = g1.query(q_prepared, initBindings={ + 'a': Literal('A'), + 'b': Literal('B'), + 'c': Literal('C') + }) + + eq_(sorted(results, key=lambda x: str(x[1])), expected) |