diff options
| author | Nicholas Car <nicholas.car@surroundaustralia.com> | 2021-12-29 09:06:22 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-29 09:06:22 +1000 |
| commit | 75c545e0747032a700e0bfc68dd044b86c275d03 (patch) | |
| tree | df6b0f3738bd6a0cc9aa3632660e084839450396 | |
| parent | df07172426b760514cb9c2f205e255e82066206b (diff) | |
| parent | 32e36dbea5924a433bfd1d5aba4d70cb9faf9642 (diff) | |
| download | rdflib-75c545e0747032a700e0bfc68dd044b86c275d03.tar.gz | |
Merge pull request #1624 from gjhiggins/feature-prepareupdate
Feature prepareupdate
| -rw-r--r-- | rdflib/plugins/sparql/__init__.py | 2 | ||||
| -rw-r--r-- | rdflib/plugins/sparql/algebra.py | 4 | ||||
| -rw-r--r-- | rdflib/plugins/sparql/processor.py | 9 | ||||
| -rw-r--r-- | rdflib/plugins/sparql/sparql.py | 10 | ||||
| -rw-r--r-- | rdflib/plugins/sparql/update.py | 2 | ||||
| -rw-r--r-- | test/test_sparql_prepare.py | 43 |
6 files changed, 66 insertions, 4 deletions
diff --git a/rdflib/plugins/sparql/__init__.py b/rdflib/plugins/sparql/__init__.py index eb9230bf..97d8c56a 100644 --- a/rdflib/plugins/sparql/__init__.py +++ b/rdflib/plugins/sparql/__init__.py @@ -35,7 +35,7 @@ from . import parser from . import operators from . import parserutils -from .processor import prepareQuery, processUpdate +from .processor import prepareQuery, prepareUpdate, processUpdate assert parser assert operators diff --git a/rdflib/plugins/sparql/algebra.py b/rdflib/plugins/sparql/algebra.py index b3d1a3ba..805e62a8 100644 --- a/rdflib/plugins/sparql/algebra.py +++ b/rdflib/plugins/sparql/algebra.py @@ -13,7 +13,7 @@ from functools import reduce from rdflib import Literal, Variable, URIRef, BNode -from rdflib.plugins.sparql.sparql import Prologue, Query +from rdflib.plugins.sparql.sparql import Prologue, Query, Update from rdflib.plugins.sparql.parserutils import CompValue, Expr from rdflib.plugins.sparql.operators import ( and_, @@ -761,7 +761,7 @@ def translateUpdate(q, base=None, initNs=None): res.append(translateUpdate1(u, prologue)) - return res + return Update(prologue, res) def translateQuery(q, base=None, initNs=None): diff --git a/rdflib/plugins/sparql/processor.py b/rdflib/plugins/sparql/processor.py index 9f463a77..a0419423 100644 --- a/rdflib/plugins/sparql/processor.py +++ b/rdflib/plugins/sparql/processor.py @@ -26,6 +26,15 @@ def prepareQuery(queryString, initNs={}, base=None) -> Query: return ret +def prepareUpdate(updateString, initNs={}, base=None): + """ + Parse and translate a SPARQL Update + """ + ret = translateUpdate(parseUpdate(updateString), base, initNs) + ret._original_args = (updateString, initNs, base) + return ret + + def processUpdate(graph, updateString, initBindings={}, initNs={}, base=None): """ Process a SPARQL Update Request diff --git a/rdflib/plugins/sparql/sparql.py b/rdflib/plugins/sparql/sparql.py index eedc9e74..526203c4 100644 --- a/rdflib/plugins/sparql/sparql.py +++ b/rdflib/plugins/sparql/sparql.py @@ -408,3 +408,13 @@ class Query: def __init__(self, prologue, algebra): self.prologue = prologue self.algebra = algebra + + +class Update: + """ + A parsed and translated update + """ + + def __init__(self, prologue, algebra): + self.prologue = prologue + self.algebra = algebra diff --git a/rdflib/plugins/sparql/update.py b/rdflib/plugins/sparql/update.py index f979c387..ef4b46b9 100644 --- a/rdflib/plugins/sparql/update.py +++ b/rdflib/plugins/sparql/update.py @@ -273,7 +273,7 @@ def evalUpdate(graph, update, initBindings={}): """ - for u in update: + for u in update.algebra: initBindings = dict((Variable(k), v) for k, v in initBindings.items()) diff --git a/test/test_sparql_prepare.py b/test/test_sparql_prepare.py new file mode 100644 index 00000000..3a0f5132 --- /dev/null +++ b/test/test_sparql_prepare.py @@ -0,0 +1,43 @@ +import os +from rdflib.plugins.sparql import prepareUpdate, prepareQuery +from rdflib.namespace import FOAF +from rdflib import ( + Graph, + URIRef, +) + + +def test_prepare_update(): + + q = prepareUpdate( + """\ +PREFIX dc: <http://purl.org/dc/elements/1.1/> +INSERT DATA +{ <http://example/book3> dc:title "A new book" ; + dc:creator "A.N.Other" . + } ; +""", + initNs={}, + ) + + g = Graph() + g.update(q, initBindings={}) + assert len(g) == 2 + + +def test_prepare_query(): + + q = prepareQuery( + "SELECT ?name WHERE { ?person foaf:knows/foaf:name ?name . }", + initNs={"foaf": FOAF}, + ) + + g = Graph() + g.parse( + location=os.path.join(os.path.dirname(__file__), "..", "examples", "foaf.n3"), + format="n3", + ) + + tim = URIRef("http://www.w3.org/People/Berners-Lee/card#i") + + assert len(list(g.query(q, initBindings={"person": tim}))) == 50 |
