diff options
author | Nicholas Car <nicholas.car@surroundaustralia.com> | 2020-12-27 21:22:34 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-27 21:22:34 +1000 |
commit | 009dc24f413fb6136e0ffbb78c4963749f8999bb (patch) | |
tree | f415801b36ff5ea0a9fba681326f572a492b5704 | |
parent | 7e2c8e3c93916298aeabdf8968e1b3b8ff14f96a (diff) | |
parent | 80fa7da772fe170ef868dd4c8ab3c0d8ea0e4bad (diff) | |
download | rdflib-009dc24f413fb6136e0ffbb78c4963749f8999bb.tar.gz |
Merge pull request #1206 from sa-bpelakh/graph-filter-query
Reset graph on exit from context
-rw-r--r-- | rdflib/plugins/sparql/evaluate.py | 3 | ||||
-rw-r--r-- | test/test_sparql.py | 34 |
2 files changed, 36 insertions, 1 deletions
diff --git a/rdflib/plugins/sparql/evaluate.py b/rdflib/plugins/sparql/evaluate.py index 496bc872..f5fd86ed 100644 --- a/rdflib/plugins/sparql/evaluate.py +++ b/rdflib/plugins/sparql/evaluate.py @@ -187,6 +187,7 @@ def evalGraph(ctx, part): ctx = ctx.clone() graph = ctx[part.term] + prev_graph = ctx.graph if graph is None: for graph in ctx.dataset.contexts(): @@ -199,11 +200,13 @@ def evalGraph(ctx, part): c = c.push() graphSolution = [{part.term: graph.identifier}] for x in _join(evalPart(c, part.p), graphSolution): + x.ctx.graph = prev_graph yield x else: c = ctx.pushGraph(ctx.dataset.get_context(graph)) for x in evalPart(c, part.p): + x.ctx.graph = prev_graph yield x diff --git a/test/test_sparql.py b/test/test_sparql.py index 8da1f799..ae11226c 100644 --- a/test/test_sparql.py +++ b/test/test_sparql.py @@ -1,4 +1,5 @@ -from rdflib import Graph, URIRef, Literal, BNode +from rdflib import Graph, URIRef, Literal, BNode, ConjunctiveGraph +from rdflib.namespace import Namespace, RDF, RDFS from rdflib.plugins.sparql import prepareQuery from rdflib.compare import isomorphic @@ -112,6 +113,37 @@ def test_sparql_update_with_bnode_serialize_parse(): assert not raised +def test_named_filter_graph_query(): + g = ConjunctiveGraph() + g.namespace_manager.bind('rdf', RDF) + g.namespace_manager.bind('rdfs', RDFS) + ex = Namespace('https://ex.com/') + g.namespace_manager.bind('ex', ex) + g.get_context(ex.g1).parse(format="turtle", data=f""" + PREFIX ex: <{str(ex)}> + PREFIX rdfs: <{str(RDFS)}> + ex:Boris rdfs:label "Boris" . + ex:Susan rdfs:label "Susan" . + """) + g.get_context(ex.g2).parse(format="turtle", data=f""" + PREFIX ex: <{str(ex)}> + ex:Boris a ex:Person . + """) + + assert list(g.query("SELECT ?l WHERE { GRAPH ex:g1 { ?a rdfs:label ?l } ?a a ?type }", + initNs={'ex': ex})) == [(Literal('Boris'),)] + assert list(g.query("SELECT ?l WHERE { GRAPH ex:g1 { ?a rdfs:label ?l } FILTER EXISTS { ?a a ?type }}", + initNs={'ex': ex})) == [(Literal('Boris'),)] + assert list(g.query("SELECT ?l WHERE { GRAPH ex:g1 { ?a rdfs:label ?l } FILTER NOT EXISTS { ?a a ?type }}", + initNs={'ex': ex})) == [(Literal('Susan'),)] + assert list(g.query("SELECT ?l WHERE { GRAPH ?g { ?a rdfs:label ?l } ?a a ?type }", + initNs={'ex': ex})) == [(Literal('Boris'),)] + assert list(g.query("SELECT ?l WHERE { GRAPH ?g { ?a rdfs:label ?l } FILTER EXISTS { ?a a ?type }}", + initNs={'ex': ex})) == [(Literal('Boris'),)] + assert list(g.query("SELECT ?l WHERE { GRAPH ?g { ?a rdfs:label ?l } FILTER NOT EXISTS { ?a a ?type }}", + initNs={'ex': ex})) == [(Literal('Susan'),)] + + if __name__ == "__main__": import nose |