summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Car <nicholas.car@surroundaustralia.com>2021-12-29 09:06:22 +1000
committerGitHub <noreply@github.com>2021-12-29 09:06:22 +1000
commit75c545e0747032a700e0bfc68dd044b86c275d03 (patch)
treedf6b0f3738bd6a0cc9aa3632660e084839450396
parentdf07172426b760514cb9c2f205e255e82066206b (diff)
parent32e36dbea5924a433bfd1d5aba4d70cb9faf9642 (diff)
downloadrdflib-75c545e0747032a700e0bfc68dd044b86c275d03.tar.gz
Merge pull request #1624 from gjhiggins/feature-prepareupdate
Feature prepareupdate
-rw-r--r--rdflib/plugins/sparql/__init__.py2
-rw-r--r--rdflib/plugins/sparql/algebra.py4
-rw-r--r--rdflib/plugins/sparql/processor.py9
-rw-r--r--rdflib/plugins/sparql/sparql.py10
-rw-r--r--rdflib/plugins/sparql/update.py2
-rw-r--r--test/test_sparql_prepare.py43
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