diff options
author | Pierre-Antoine Champin <pchampin@liris.cnrs.fr> | 2016-05-15 14:35:28 +0200 |
---|---|---|
committer | Pierre-Antoine Champin <pchampin@liris.cnrs.fr> | 2016-05-15 14:37:38 +0200 |
commit | 70916a2d4aad6abbf3b90dad289d3eca9d70198e (patch) | |
tree | 8e8c7824649f6691be1dc5a182d596c59b08a337 | |
parent | 5ee60ff3cb55d92e93729b01c2268282562af13d (diff) | |
download | rdflib-70916a2d4aad6abbf3b90dad289d3eca9d70198e.tar.gz |
attempt to fix #633
-rw-r--r-- | rdflib/plugins/sparql/evaluate.py | 6 | ||||
-rw-r--r-- | test-update.py | 71 |
2 files changed, 75 insertions, 2 deletions
diff --git a/rdflib/plugins/sparql/evaluate.py b/rdflib/plugins/sparql/evaluate.py index e558a825..48abc962 100644 --- a/rdflib/plugins/sparql/evaluate.py +++ b/rdflib/plugins/sparql/evaluate.py @@ -141,8 +141,10 @@ def evalLeftJoin(ctx, join): # before we yield a solution without the OPTIONAL part # check that we would have had no OPTIONAL matches # even without prior bindings... - if not any(_ebv(join.expr, b) for b in - evalPart(ctx.thaw(a.remember(join.p1._vars)), join.p2)): + p1_vars = join.p1._vars + if p1_vars is None \ + or not any(_ebv(join.expr, b) for b in + evalPart(ctx.thaw(a.remember(p1_vars)), join.p2)): yield a diff --git a/test-update.py b/test-update.py new file mode 100644 index 00000000..b324f5d8 --- /dev/null +++ b/test-update.py @@ -0,0 +1,71 @@ +from rdflib import * + +ex = Namespace('http://ex.co/') +g = Graph() +g.namespace_manager.bind('', ex) + +g.add((ex.s1, ex.p, ex.o1)) +g.add((ex.s1, ex.p, ex.o2)) +g.add((ex.s1, ex.p, ex.o3)) + +g.add((ex.s2, ex.p, ex.o2)) +g.add((ex.s2, ex.p, ex.o3)) +g.add((ex.s2, ex.p, ex.o4)) +g.add((ex.s2, ex.p, ex.o5)) + +g.add((ex.s3, ex.p, ex.o1)) +g.add((ex.s3, ex.p, ex.o3)) +g.add((ex.s3, ex.p, ex.o5)) + + +print(g.serialize(format="n3")) + +# should be +# :s1 :p :o1, :o2, :o3 . +# :s2 :p :o2, :o3, :o4, :o5 . +# :s3 :p :o1, :o3, :o5 . + +print '---' + +print(g.query(""" +PREFIX : <http://ex.co/> + +SELECT ?o ?new +WHERE { + :s1 :p ?o . + :s2 :p ?o . + OPTIONAL { + :s3 :p ?o . + BIND(:s4 as ?new) + } +} +""").serialize(format="csv")) + +# should be +# :o2 , +# :o3 , :s4 + +print '---' + +g.update(""" +PREFIX : <http://ex.co/> + +DELETE { :s1 :p ?o } +INSERT { ?new :p ?o } +WHERE { + :s1 :p ?o . + :s2 :p ?o . + OPTIONAL { + :s3 :p ?o . + BIND(:s4 as ?new) + } +} +""") + +print(g.serialize(format="n3")) + +# should now be +# :s1 :p :o1 . +# :s2 :p :o2, :o3, :o4, :o5 . +# :s3 :p :o1, :o3, :o5 . +# :s4 :p :o3 . |