Skip to content

Commit 2e7efcc

Browse files
committed
Account for a property path in an uupdate coming after a BGP.
Fixes #53.
1 parent 91c50c1 commit 2e7efcc

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed

etc/sparql12.bnf

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,13 @@ GraphNode ::= VarOrTerm | TriplesNode | ReifiedTriple
115115
GraphNodePath ::= VarOrTerm | TriplesNodePath | ReifiedTriple
116116
VarOrTerm ::= Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | NIL | TripleTerm
117117
ReifiedTriple ::= '<<' ReifiedTripleSubject Verb ReifiedTripleObject Reifier? '>>'
118-
ReifiedTripleSubject ::= Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | ReifiedTriple
118+
ReifiedTripleSubject ::= Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | ReifiedTriple | TripleTerm
119119
ReifiedTripleObject ::= Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | ReifiedTriple | TripleTerm
120120
TripleTerm ::= '<<(' TripleTermSubject Verb TripleTermObject ')>>'
121-
TripleTermSubject ::= Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode
121+
TripleTermSubject ::= Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | TripleTerm
122122
TripleTermObject ::= Var | iri | RDFLiteral | NumericLiteral | BooleanLiteral | BlankNode | TripleTerm
123123
TripleTermData ::= '<<(' TripleTermDataSubject ( iri | 'a' ) TripleTermDataObject ')>>'
124-
TripleTermDataSubject ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral
124+
TripleTermDataSubject ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | TripleTermData
125125
TripleTermDataObject ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | TripleTermData
126126
VarOrIri ::= Var | iri
127127
Var ::= VAR1 | VAR2
@@ -152,7 +152,7 @@ UnaryExpression ::= '!' PrimaryExpression
152152
PrimaryExpression ::= BrackettedExpression | BuiltInCall | iriOrFunction
153153
| RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprTripleTerm
154154
ExprTripleTerm ::= '<<(' ExprTripleTermSubject Verb ExprTripleTermObject ')>>'
155-
ExprTripleTermSubject ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | Var
155+
ExprTripleTermSubject ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprTripleTerm
156156
ExprTripleTermObject ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprTripleTerm
157157
BrackettedExpression ::= '(' Expression ')'
158158
BuiltInCall ::= Aggregate

lib/sparql/algebra/update.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ def variables
2525
operands.inject({}) {|hash, o| o.executable? ? hash.merge(o.variables) : hash}
2626
end
2727

28+
# Determine if this is an empty query, having no operands
29+
def empty?
30+
self.operands.empty?
31+
end
32+
2833
##
2934
# Executes this upate on the given `queryable` graph or repository.
3035
#

lib/sparql/grammar/parser.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,8 @@ class Parser
895895
bgp
896896
elsif bgp.empty?
897897
query
898+
elsif bgp.is_a?(SPARQL::Algebra::Operator::Sequence)
899+
SPARQL::Algebra::Operator::Sequence.new(query, *bgp.operands)
898900
elsif bgp.is_a?(SPARQL::Algebra::Operator::Path)
899901
SPARQL::Algebra::Operator::Sequence.new(query, bgp)
900902
else

spec/grammar/misc_spec.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,48 @@
140140
(triple ?ev <http://example.org/b> ?b)))))
141141
}
142142
},
143+
"issue 53": {
144+
query: %(
145+
SELECT ?s
146+
WHERE {
147+
?s a skos:Concept .
148+
?s skos:related|^skos:related ?c .
149+
}
150+
),
151+
sse: %{(project (?s)
152+
(sequence
153+
(bgp (triple ?s a <Concept>))
154+
(path ?s (alt <related> (reverse <related>)) ?c)))}
155+
},
156+
"issue 53 full": {
157+
query: %(
158+
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
159+
DESCRIBE ?s
160+
WHERE {
161+
VALUES ?c {
162+
<urn:uuid:f5a254ac-4a2b-405e-91be-7de9fbf7174d>
163+
}
164+
?s a skos:Concept .
165+
?s (skos:related|^skos:related|skos:broader|^skos:broader|skos:narrower|^skos:narrower)* ?c .
166+
}
167+
),
168+
sse: %{(describe (?s)
169+
(sequence
170+
(table (vars ?c) (row (?c <urn:uuid:f5a254ac-4a2b-405e-91be-7de9fbf7174d>)))
171+
(bgp (triple ?s a <http://www.w3.org/2004/02/skos/core#Concept>))
172+
(path ?s
173+
(path*
174+
(alt
175+
(alt
176+
(alt
177+
(alt
178+
(alt <http://www.w3.org/2004/02/skos/core#related>
179+
(reverse <http://www.w3.org/2004/02/skos/core#related>))
180+
<http://www.w3.org/2004/02/skos/core#broader> )
181+
(reverse <http://www.w3.org/2004/02/skos/core#broader>))
182+
<http://www.w3.org/2004/02/skos/core#narrower> )
183+
(reverse <http://www.w3.org/2004/02/skos/core#narrower>)) ) ?c )) )}
184+
}
143185
#"dawg-optional-filter-005-not-simplified" => {
144186
# query: %(
145187
# # Double curly braces do NOT get simplified to single curly braces early on, before filters are scoped

0 commit comments

Comments
 (0)