Skip to content

Commit

Permalink
Working on RDFLib#955 Success enough for today, basic examples pass
Browse files Browse the repository at this point in the history
Approach is horrid though, and code is being executed in the wrong place.
  • Loading branch information
JervenBolleman committed May 10, 2020
1 parent b32048c commit f1e07ec
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 21 deletions.
51 changes: 46 additions & 5 deletions rdflib/plugins/sparql/algebra.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

from rdflib import Literal, Variable, URIRef, BNode

from rdflib.namespace import RDF

from rdflib.plugins.sparql.sparql import Prologue, Query
from rdflib.plugins.sparql.parserutils import CompValue, Expr
from rdflib.plugins.sparql.operators import (
Expand Down Expand Up @@ -243,6 +245,46 @@ def collectAndRemoveFilters(parts):

return None

def collectExpandEmpTP(parts):
"""
FILTER expressions apply to the whole group graph pattern in which
they appear.
http://www.w3.org/TR/sparql11-query/#sparqlCollectFilters
"""



i = 0
while i < len(parts):
p = parts[i]
if p.name == 'TriplesBlock':
newTriples = []
for t in p.triples:
if isinstance(t[0], CompValue) and t[0].name == 'EmpTP':
r = Variable('__EMP_s_'+ str(i))
e = t[0]
t[0] = r
newTriples.append([e.s[0], e.p[0], e.o[0]])
t.extend([r, RDF.type, RDF.Statement,
r, RDF.subject, e.s[0],
r, RDF.predicate, e.p[0],
r, RDF.object, e.o[0]])
if isinstance(t[2], CompValue) and t[2].name == 'EmpTP':
r = Variable('__EMP_o_'+str(i))
e = t[2]
t[2] = r
newTriples.append([e.s[0], e.p[0], e.o[0]])
newTriples.append([r, RDF.type, RDF.Statement,
r, RDF.subject, e.s[0],
r, RDF.predicate, e.p[0],
r, RDF.object, e.o[0]])
for t in newTriples:
p.triples.append(t)
i += 1

return parts

def translateGroupOrUnionGraphPattern(graphPattern):
A = None
Expand Down Expand Up @@ -278,6 +320,7 @@ def translateGroupGraphPattern(graphPattern):

filters = collectAndRemoveFilters(graphPattern.part)

graphPattern.part = collectExpandEmpTP(graphPattern.part)
g = []
for p in graphPattern.part:
if p.name == 'TriplesBlock':
Expand Down Expand Up @@ -346,11 +389,9 @@ def _traverse(e, visitPre=lambda n: None, visitPost=lambda n: None):
return tuple([_traverse(x, visitPre, visitPost) for x in e])

elif isinstance(e, CompValue):
if e.name != 'EmpTP':
for k, val in e.items():
e[k] = _traverse(val, visitPre, visitPost)
else:
raise Exception("Sparql star not tied into the algebra jet")
for k, val in e.items():
e[k] = _traverse(val, visitPre, visitPost)

_e = visitPost(e)
if _e is not None:
return _e
Expand Down
2 changes: 1 addition & 1 deletion rdflib/plugins/sparql/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import rdflib

DEBUG = True
DEBUG = False

# ---------------- ACTIONS

Expand Down
112 changes: 97 additions & 15 deletions test/test_sparql_star.py
Original file line number Diff line number Diff line change
@@ -1,40 +1,122 @@
from rdflib import Graph
from rdflib.plugins.sparql.parser import VarOrBlankNodeOrIriOrLitOrEmbTP
import pyparsing
from rdflib.namespace import RDF, Namespace
import unittest



class SparqlStarTests(unittest.TestCase):

@staticmethod
def test_basic_sparql_star_subject():
def test_basic_sparql_star_subject(self):
g = Graph()
res = g.query('''SELECT * WHERE {
<< ?s ?p ?o >> ?p2 ?o2 .
}''')
g.parse(data="""
PREFIX ex:<http://example.org/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
ex:subject ex:predicate ex:object .
ex:reif a rdf:Statement ;
rdf:subject ex:subject ;
rdf:predicate ex:predicate ;
rdf:object ex:object .
ex:about a ex:reif .
""", format="ttl")
res = g.query('''SELECT * WHERE {<< ?s ?p ?o >> ?p2 ?o2 . }''')

@staticmethod
def test_basic_sparql_star_object():
rl = list(res)
self.assertEqual(4 , len(rl))


def test_basic_sparql_star_object(self):
g = Graph()
g.parse(data="""
PREFIX ex:<http://example.org/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
ex:subject ex:predicate ex:object .
ex:reif a rdf:Statement ;
rdf:subject ex:subject ;
rdf:predicate ex:predicate ;
rdf:object ex:object .
ex:about a ex:reif .
""", format="ttl")
res = g.query('''SELECT * WHERE {
?s ?p << ?s2 ?p2 ?o2 >> .
}''')
rl = list(res)
self.assertEqual(1 , len(rl))

@staticmethod
def test_basic_sparql():

def test_basic_sparql(self):
g = Graph()
res = g.query('''SELECT * WHERE {
g.parse(data="""
PREFIX ex:<http://example.org/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
ex:subject ex:predicate ex:object .
ex:reif a rdf:Statement ;
rdf:subject ex:subject ;
rdf:predicate ex:predicate ;
rdf:object ex:object .
ex:about a ex:reif .
""", format="ttl")
res = g.query('''PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT * WHERE {
?s ?p ?o .
?r a rdf:Statement ;
rdf:subject ?s ;
rdf:predicate ?p ;
rdf:object ?o .
ex:about a ?r.
}''')
rl = list(res)
self.assertEqual(1 , len(rl))

@staticmethod
def test_bind_sparql_star():
g = Graph()
res = g.query('''SELECT * WHERE { BIND(<< ?s2 ?p2 ?o2 >> AS ?b) }''')

@staticmethod
def test_parser():
assert VarOrBlankNodeOrIriOrLitOrEmbTP.matches("<<?s ?p ?o>>")
def test_constant_sparql_star_object(self):
g = Graph()
g.parse(data="""
PREFIX ex:<http://example.org/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
ex:subject ex:predicate ex:object .
ex:reif a rdf:Statement ;
rdf:subject ex:subject ;
rdf:predicate ex:predicate ;
rdf:object ex:object .
ex:reif a ex:about .
""", format="ttl")
res = g.query('''PREFIX ex:<http://example.org/> SELECT * WHERE {
<< ex:subject ex:predicate ?object >> a ex:about .
}''')
rl = list(res)
self.assertEqual(1 , len(rl))

def test_constant_sparql_object(self):
g = Graph()
g.parse(data="""
PREFIX ex:<http://example.org/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
ex:subject ex:predicate ex:object .
ex:reif a rdf:Statement ;
a ex:about ;
rdf:subject ex:subject ;
rdf:predicate ex:predicate ;
rdf:object ex:object .
""", format="ttl")
res = g.query('''PREFIX ex:<http://example.org/> SELECT * WHERE {
ex:subject ex:predicate ?object .
ex:reif a ex:about ;
a rdf:Statement ;
rdf:subject ex:subject ;
rdf:predicate ex:predicate ;
rdf:object ?object .
}''')
rl = list(res)
self.assertEqual(1 , len(rl))
if __name__ == '__main__':
unittest.main()

0 comments on commit f1e07ec

Please sign in to comment.