summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Car <nicholas.car@surroundaustralia.com>2020-12-27 21:22:34 +1000
committerGitHub <noreply@github.com>2020-12-27 21:22:34 +1000
commit009dc24f413fb6136e0ffbb78c4963749f8999bb (patch)
treef415801b36ff5ea0a9fba681326f572a492b5704
parent7e2c8e3c93916298aeabdf8968e1b3b8ff14f96a (diff)
parent80fa7da772fe170ef868dd4c8ab3c0d8ea0e4bad (diff)
downloadrdflib-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.py3
-rw-r--r--test/test_sparql.py34
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