sparql 3.1.8 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +29 -22
 - data/VERSION +1 -1
 - data/bin/sparql +13 -4
 - data/lib/sparql/algebra/extensions.rb +93 -33
 - data/lib/sparql/algebra/operator/abs.rb +22 -2
 - data/lib/sparql/algebra/operator/add.rb +21 -2
 - data/lib/sparql/algebra/operator/alt.rb +26 -2
 - data/lib/sparql/algebra/operator/and.rb +25 -3
 - data/lib/sparql/algebra/operator/asc.rb +20 -1
 - data/lib/sparql/algebra/operator/ask.rb +17 -1
 - data/lib/sparql/algebra/operator/avg.rb +17 -1
 - data/lib/sparql/algebra/operator/base.rb +18 -1
 - data/lib/sparql/algebra/operator/bgp.rb +5 -1
 - data/lib/sparql/algebra/operator/bnode.rb +33 -10
 - data/lib/sparql/algebra/operator/bound.rb +22 -1
 - data/lib/sparql/algebra/operator/ceil.rb +25 -2
 - data/lib/sparql/algebra/operator/clear.rb +16 -2
 - data/lib/sparql/algebra/operator/coalesce.rb +33 -11
 - data/lib/sparql/algebra/operator/compare.rb +9 -0
 - data/lib/sparql/algebra/operator/concat.rb +26 -2
 - data/lib/sparql/algebra/operator/construct.rb +29 -6
 - data/lib/sparql/algebra/operator/contains.rb +24 -2
 - data/lib/sparql/algebra/operator/copy.rb +19 -2
 - data/lib/sparql/algebra/operator/count.rb +17 -1
 - data/lib/sparql/algebra/operator/create.rb +19 -2
 - data/lib/sparql/algebra/operator/dataset.rb +17 -0
 - data/lib/sparql/algebra/operator/datatype.rb +25 -6
 - data/lib/sparql/algebra/operator/day.rb +23 -5
 - data/lib/sparql/algebra/operator/delete.rb +27 -2
 - data/lib/sparql/algebra/operator/delete_data.rb +23 -2
 - data/lib/sparql/algebra/operator/delete_where.rb +24 -2
 - data/lib/sparql/algebra/operator/desc.rb +20 -1
 - data/lib/sparql/algebra/operator/describe.rb +27 -4
 - data/lib/sparql/algebra/operator/distinct.rb +18 -1
 - data/lib/sparql/algebra/operator/divide.rb +26 -2
 - data/lib/sparql/algebra/operator/drop.rb +17 -2
 - data/lib/sparql/algebra/operator/encode_for_uri.rb +24 -2
 - data/lib/sparql/algebra/operator/equal.rb +12 -2
 - data/lib/sparql/algebra/operator/exists.rb +28 -4
 - data/lib/sparql/algebra/operator/exprlist.rb +12 -1
 - data/lib/sparql/algebra/operator/extend.rb +31 -6
 - data/lib/sparql/algebra/operator/filter.rb +27 -5
 - data/lib/sparql/algebra/operator/floor.rb +25 -2
 - data/lib/sparql/algebra/operator/graph.rb +13 -0
 - data/lib/sparql/algebra/operator/greater_than.rb +12 -3
 - data/lib/sparql/algebra/operator/greater_than_or_equal.rb +12 -2
 - data/lib/sparql/algebra/operator/group.rb +34 -8
 - data/lib/sparql/algebra/operator/group_concat.rb +19 -7
 - data/lib/sparql/algebra/operator/hours.rb +23 -5
 - data/lib/sparql/algebra/operator/if.rb +21 -4
 - data/lib/sparql/algebra/operator/in.rb +18 -1
 - data/lib/sparql/algebra/operator/insert.rb +22 -2
 - data/lib/sparql/algebra/operator/insert_data.rb +23 -2
 - data/lib/sparql/algebra/operator/iri.rb +21 -4
 - data/lib/sparql/algebra/operator/is_blank.rb +19 -1
 - data/lib/sparql/algebra/operator/is_iri.rb +19 -1
 - data/lib/sparql/algebra/operator/is_literal.rb +19 -1
 - data/lib/sparql/algebra/operator/is_numeric.rb +21 -3
 - data/lib/sparql/algebra/operator/is_triple.rb +32 -0
 - data/lib/sparql/algebra/operator/join.rb +22 -1
 - data/lib/sparql/algebra/operator/lang.rb +25 -0
 - data/lib/sparql/algebra/operator/lang_matches.rb +22 -1
 - data/lib/sparql/algebra/operator/lcase.rb +23 -2
 - data/lib/sparql/algebra/operator/left_join.rb +29 -1
 - data/lib/sparql/algebra/operator/less_than.rb +12 -3
 - data/lib/sparql/algebra/operator/less_than_or_equal.rb +12 -2
 - data/lib/sparql/algebra/operator/load.rb +25 -2
 - data/lib/sparql/algebra/operator/max.rb +17 -1
 - data/lib/sparql/algebra/operator/md5.rb +22 -5
 - data/lib/sparql/algebra/operator/min.rb +18 -2
 - data/lib/sparql/algebra/operator/minus.rb +25 -7
 - data/lib/sparql/algebra/operator/minutes.rb +23 -5
 - data/lib/sparql/algebra/operator/modify.rb +41 -5
 - data/lib/sparql/algebra/operator/month.rb +23 -5
 - data/lib/sparql/algebra/operator/move.rb +20 -2
 - data/lib/sparql/algebra/operator/multiply.rb +26 -3
 - data/lib/sparql/algebra/operator/negate.rb +23 -3
 - data/lib/sparql/algebra/operator/not.rb +24 -3
 - data/lib/sparql/algebra/operator/not_equal.rb +13 -0
 - data/lib/sparql/algebra/operator/notexists.rb +30 -6
 - data/lib/sparql/algebra/operator/notin.rb +20 -3
 - data/lib/sparql/algebra/operator/notoneof.rb +12 -2
 - data/lib/sparql/algebra/operator/now.rb +24 -5
 - data/lib/sparql/algebra/operator/object.rb +32 -0
 - data/lib/sparql/algebra/operator/or.rb +26 -3
 - data/lib/sparql/algebra/operator/order.rb +20 -1
 - data/lib/sparql/algebra/operator/path.rb +29 -2
 - data/lib/sparql/algebra/operator/path_opt.rb +21 -2
 - data/lib/sparql/algebra/operator/path_plus.rb +21 -2
 - data/lib/sparql/algebra/operator/path_star.rb +20 -2
 - data/lib/sparql/algebra/operator/plus.rb +42 -3
 - data/lib/sparql/algebra/operator/predicate.rb +32 -0
 - data/lib/sparql/algebra/operator/prefix.rb +24 -3
 - data/lib/sparql/algebra/operator/project.rb +51 -5
 - data/lib/sparql/algebra/operator/rand.rb +30 -2
 - data/lib/sparql/algebra/operator/reduced.rb +18 -1
 - data/lib/sparql/algebra/operator/regex.rb +26 -18
 - data/lib/sparql/algebra/operator/replace.rb +26 -6
 - data/lib/sparql/algebra/operator/reverse.rb +20 -2
 - data/lib/sparql/algebra/operator/round.rb +25 -2
 - data/lib/sparql/algebra/operator/same_term.rb +24 -6
 - data/lib/sparql/algebra/operator/sample.rb +30 -8
 - data/lib/sparql/algebra/operator/seconds.rb +23 -5
 - data/lib/sparql/algebra/operator/seq.rb +20 -2
 - data/lib/sparql/algebra/operator/sequence.rb +0 -10
 - data/lib/sparql/algebra/operator/sha1.rb +18 -1
 - data/lib/sparql/algebra/operator/sha256.rb +18 -1
 - data/lib/sparql/algebra/operator/sha384.rb +18 -1
 - data/lib/sparql/algebra/operator/sha512.rb +18 -1
 - data/lib/sparql/algebra/operator/slice.rb +27 -5
 - data/lib/sparql/algebra/operator/str.rb +21 -1
 - data/lib/sparql/algebra/operator/strafter.rb +25 -2
 - data/lib/sparql/algebra/operator/strbefore.rb +25 -2
 - data/lib/sparql/algebra/operator/strdt.rb +22 -1
 - data/lib/sparql/algebra/operator/strends.rb +25 -3
 - data/lib/sparql/algebra/operator/strlang.rb +25 -6
 - data/lib/sparql/algebra/operator/strlen.rb +23 -2
 - data/lib/sparql/algebra/operator/strstarts.rb +25 -2
 - data/lib/sparql/algebra/operator/struuid.rb +29 -9
 - data/lib/sparql/algebra/operator/subject.rb +32 -0
 - data/lib/sparql/algebra/operator/substr.rb +23 -2
 - data/lib/sparql/algebra/operator/subtract.rb +28 -2
 - data/lib/sparql/algebra/operator/sum.rb +17 -1
 - data/lib/sparql/algebra/operator/table.rb +42 -4
 - data/lib/sparql/algebra/operator/timezone.rb +23 -5
 - data/lib/sparql/algebra/operator/tz.rb +22 -5
 - data/lib/sparql/algebra/operator/ucase.rb +23 -2
 - data/lib/sparql/algebra/operator/union.rb +29 -6
 - data/lib/sparql/algebra/operator/update.rb +25 -4
 - data/lib/sparql/algebra/operator/using.rb +32 -2
 - data/lib/sparql/algebra/operator/uuid.rb +27 -8
 - data/lib/sparql/algebra/operator/with.rb +38 -4
 - data/lib/sparql/algebra/operator/year.rb +23 -5
 - data/lib/sparql/algebra/operator.rb +99 -6
 - data/lib/sparql/algebra/sxp_extensions.rb +3 -3
 - data/lib/sparql/grammar/parser11.rb +4 -4
 - metadata +22 -35
 - data/lib/sparql/algebra/operator/triple.rb +0 -27
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: ecbe9289bf43f7fa28940a82545ec08b19c54d8bdf64693934405e83ddb4cc53
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 24ab0942be18a9d9d281452ba9a7195dcad2a31755bda6d84afe4f49fe7c34c1
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 89a77c749eb99b0fe83f27d5f413556ac2f6cf22af7e06b8e0588155bbf5a50eb053b1f87ffe11a13b5fd873d5fcaaee1166cdf336aacd3029380898a82da382
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 13be95c405b9fdf7e678bc9bbaf6dcc45075a692a08e1762deacc0779948996fdc992376f3a564644f50270282c76a759023d7393e28db07ec7828a73324a948
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -23,8 +23,7 @@ This is a [Ruby][] implementation of [SPARQL][] for [RDF.rb][]. 
     | 
|
| 
       23 
23 
     | 
    
         
             
              * Compatible with any [Rack][] or [Sinatra][] application and any Rack-based framework.
         
     | 
| 
       24 
24 
     | 
    
         
             
              * Helper method for describing [SPARQL Service Description][SSD]
         
     | 
| 
       25 
25 
     | 
    
         
             
            * Implementation Report: {file:etc/earl.html EARL}
         
     | 
| 
       26 
     | 
    
         
            -
            * Compatible with Ruby >= 2. 
     | 
| 
       27 
     | 
    
         
            -
            * Compatible with older Ruby versions with the help of the [Backports][] gem.
         
     | 
| 
      
 26 
     | 
    
         
            +
            * Compatible with Ruby >= 2.6.
         
     | 
| 
       28 
27 
     | 
    
         
             
            * Supports Unicode query strings both on all versions of Ruby.
         
     | 
| 
       29 
28 
     | 
    
         
             
            * Provisional support for [SPARQL-star][].
         
     | 
| 
       30 
29 
     | 
    
         | 
| 
         @@ -248,27 +247,27 @@ a full set of RDF formats. 
     | 
|
| 
       248 
247 
     | 
    
         
             
            ### Querying a repository with a SPARQL query
         
     | 
| 
       249 
248 
     | 
    
         | 
| 
       250 
249 
     | 
    
         
             
                queryable = RDF::Repository.load("etc/doap.ttl")
         
     | 
| 
       251 
     | 
    
         
            -
                 
     | 
| 
       252 
     | 
    
         
            -
                queryable.query( 
     | 
| 
      
 250 
     | 
    
         
            +
                query = SPARQL.parse("SELECT * WHERE { ?s ?p ?o }")
         
     | 
| 
      
 251 
     | 
    
         
            +
                queryable.query(query) do |result|
         
     | 
| 
       253 
252 
     | 
    
         
             
                  result.inspect
         
     | 
| 
       254 
253 
     | 
    
         
             
                end
         
     | 
| 
       255 
254 
     | 
    
         | 
| 
       256 
255 
     | 
    
         
             
            ### Executing a SPARQL query against a repository
         
     | 
| 
       257 
256 
     | 
    
         | 
| 
       258 
257 
     | 
    
         
             
                queryable = RDF::Repository.load("etc/doap.ttl")
         
     | 
| 
       259 
     | 
    
         
            -
                 
     | 
| 
       260 
     | 
    
         
            -
                 
     | 
| 
      
 258 
     | 
    
         
            +
                query = SPARQL.parse("SELECT * WHERE { ?s ?p ?o }")
         
     | 
| 
      
 259 
     | 
    
         
            +
                query.execute(queryable) do |result|
         
     | 
| 
       261 
260 
     | 
    
         
             
                  result.inspect
         
     | 
| 
       262 
261 
     | 
    
         
             
                end
         
     | 
| 
       263 
262 
     | 
    
         | 
| 
       264 
263 
     | 
    
         
             
            ### Updating a repository
         
     | 
| 
       265 
264 
     | 
    
         | 
| 
       266 
265 
     | 
    
         
             
                queryable = RDF::Repository.load("etc/doap.ttl")
         
     | 
| 
       267 
     | 
    
         
            -
                 
     | 
| 
      
 266 
     | 
    
         
            +
                update = SPARQL.parse(%(
         
     | 
| 
       268 
267 
     | 
    
         
             
                  PREFIX doap: <http://usefulinc.com/ns/doap#>
         
     | 
| 
       269 
268 
     | 
    
         
             
                  INSERT DATA { <https://rubygems> doap:implements <http://www.w3.org/TR/sparql11-update/>}
         
     | 
| 
       270 
269 
     | 
    
         
             
                ), update: true)
         
     | 
| 
       271 
     | 
    
         
            -
                 
     | 
| 
      
 270 
     | 
    
         
            +
                update.execute(queryable)
         
     | 
| 
       272 
271 
     | 
    
         | 
| 
       273 
272 
     | 
    
         
             
            ### Rendering solutions as JSON, XML, CSV, TSV or HTML
         
     | 
| 
       274 
273 
     | 
    
         
             
                queryable = RDF::Repository.load("etc/doap.ttl")
         
     | 
| 
         @@ -277,8 +276,13 @@ a full set of RDF formats. 
     | 
|
| 
       277 
276 
     | 
    
         | 
| 
       278 
277 
     | 
    
         
             
            ### Parsing a SPARQL query string to SSE
         
     | 
| 
       279 
278 
     | 
    
         | 
| 
       280 
     | 
    
         
            -
                 
     | 
| 
       281 
     | 
    
         
            -
                 
     | 
| 
      
 279 
     | 
    
         
            +
                query = SPARQL.parse("SELECT * WHERE { ?s ?p ?o }")
         
     | 
| 
      
 280 
     | 
    
         
            +
                query.to_sxp #=> (bgp (triple ?s ?p ?o))
         
     | 
| 
      
 281 
     | 
    
         
            +
             
     | 
| 
      
 282 
     | 
    
         
            +
            ### Parsing a SSE to SPARQL query or update string to SPARQL
         
     | 
| 
      
 283 
     | 
    
         
            +
             
     | 
| 
      
 284 
     | 
    
         
            +
                query = SPARQL::Algebra.parse(%{(bgp (triple ?s ?p ?o))})
         
     | 
| 
      
 285 
     | 
    
         
            +
                sparql = query.to_sparql #=> "SELECT * WHERE { ?s ?p ?o }"
         
     | 
| 
       282 
286 
     | 
    
         | 
| 
       283 
287 
     | 
    
         
             
            ### Command line processing
         
     | 
| 
       284 
288 
     | 
    
         | 
| 
         @@ -289,6 +293,10 @@ a full set of RDF formats. 
     | 
|
| 
       289 
293 
     | 
    
         
             
                sparql parse etc/input.rq
         
     | 
| 
       290 
294 
     | 
    
         
             
                sparql parse -e "SELECT * WHERE { ?s ?p ?o }"
         
     | 
| 
       291 
295 
     | 
    
         | 
| 
      
 296 
     | 
    
         
            +
                # Generate SPARQL Query from SSE
         
     | 
| 
      
 297 
     | 
    
         
            +
                sparql parse --sse etc/input.sse --format sparql
         
     | 
| 
      
 298 
     | 
    
         
            +
                sparql parse --sse --format sparql -e "(dataset (<http://usefulinc.com/ns/doap>) (bgp (triple ?s ?p ?o))))"
         
     | 
| 
      
 299 
     | 
    
         
            +
             
     | 
| 
       292 
300 
     | 
    
         
             
                # Run query using SSE input
         
     | 
| 
       293 
301 
     | 
    
         
             
                sparql execute --dataset etc/doap.ttl --sse etc/input.sse
         
     | 
| 
       294 
302 
     | 
    
         
             
                sparql execute --sse -e "(dataset (<etc/doap.ttl>) (bgp (triple ?s ?p ?o))))"
         
     | 
| 
         @@ -368,19 +376,19 @@ Full documentation available on [Rubydoc.info][SPARQL doc] 
     | 
|
| 
       368 
376 
     | 
    
         | 
| 
       369 
377 
     | 
    
         
             
            ## Dependencies
         
     | 
| 
       370 
378 
     | 
    
         | 
| 
       371 
     | 
    
         
            -
            * [Ruby](https://ruby-lang.org/) (>= 2. 
     | 
| 
       372 
     | 
    
         
            -
            * [RDF.rb](https://rubygems.org/gems/rdf) (~> 3. 
     | 
| 
       373 
     | 
    
         
            -
            * [SPARQL::Client](https://rubygems.org/gems/sparql-client) (~> 3. 
     | 
| 
       374 
     | 
    
         
            -
            * [SXP](https://rubygems.org/gems/sxp) (~> 1. 
     | 
| 
       375 
     | 
    
         
            -
            * [Builder](https://rubygems.org/gems/builder) ( 
     | 
| 
       376 
     | 
    
         
            -
            * [JSON](https://rubygems.org/gems/json) ( 
     | 
| 
       377 
     | 
    
         
            -
            * Soft dependency on [Linked Data][] (>= 3. 
     | 
| 
       378 
     | 
    
         
            -
            * Soft dependency on [Nokogiri](https://rubygems.org/gems/nokogiri) ( 
     | 
| 
      
 379 
     | 
    
         
            +
            * [Ruby](https://ruby-lang.org/) (>= 2.6)
         
     | 
| 
      
 380 
     | 
    
         
            +
            * [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.2)
         
     | 
| 
      
 381 
     | 
    
         
            +
            * [SPARQL::Client](https://rubygems.org/gems/sparql-client) (~> 3.1)
         
     | 
| 
      
 382 
     | 
    
         
            +
            * [SXP](https://rubygems.org/gems/sxp) (~> 1.2)
         
     | 
| 
      
 383 
     | 
    
         
            +
            * [Builder](https://rubygems.org/gems/builder) (~> 3.2)
         
     | 
| 
      
 384 
     | 
    
         
            +
            * [JSON](https://rubygems.org/gems/json) (~> 2.6)
         
     | 
| 
      
 385 
     | 
    
         
            +
            * Soft dependency on [Linked Data][] (>= 3.1)
         
     | 
| 
      
 386 
     | 
    
         
            +
            * Soft dependency on [Nokogiri](https://rubygems.org/gems/nokogiri) (~> 1.12)
         
     | 
| 
       379 
387 
     | 
    
         
             
              Falls back to REXML for XML parsing Builder for XML serializing. Nokogiri is much more efficient
         
     | 
| 
       380 
     | 
    
         
            -
            * Soft dependency on [Equivalent XML](https://rubygems.org/gems/equivalent-xml) (>= 0. 
     | 
| 
      
 388 
     | 
    
         
            +
            * Soft dependency on [Equivalent XML](https://rubygems.org/gems/equivalent-xml) (>= 0.6)
         
     | 
| 
       381 
389 
     | 
    
         
             
              Equivalent XML performs more efficient comparisons of XML Literals when Nokogiri is included
         
     | 
| 
       382 
     | 
    
         
            -
            * Soft dependency on [Rack][] ( 
     | 
| 
       383 
     | 
    
         
            -
            * Soft dependency on [Sinatra][] ( 
     | 
| 
      
 390 
     | 
    
         
            +
            * Soft dependency on [Rack][] (~> 2.2)
         
     | 
| 
      
 391 
     | 
    
         
            +
            * Soft dependency on [Sinatra][] (~> 2.1)
         
     | 
| 
       384 
392 
     | 
    
         | 
| 
       385 
393 
     | 
    
         
             
            ## Installation
         
     | 
| 
       386 
394 
     | 
    
         | 
| 
         @@ -450,7 +458,6 @@ A copy of the [SPARQL 1.0 tests][] and [SPARQL 1.1 tests][] are also included in 
     | 
|
| 
       450 
458 
     | 
    
         
             
            [RDF.rb]:           https://rubydoc.info/github/ruby-rdf/rdf
         
     | 
| 
       451 
459 
     | 
    
         
             
            [RDF-star]:             https://w3c.github.io/rdf-star/rdf-star-cg-spec.html
         
     | 
| 
       452 
460 
     | 
    
         
             
            [SPARQL-star]:          https://w3c.github.io/rdf-star/rdf-star-cg-spec.html#sparql-query-language
         
     | 
| 
       453 
     | 
    
         
            -
            [Backports]:        https://rubygems.org/gems/backports
         
     | 
| 
       454 
461 
     | 
    
         
             
            [Linked Data]:      https://rubygems.org/gems/linkeddata
         
     | 
| 
       455 
462 
     | 
    
         
             
            [SPARQL doc]:       https://rubydoc.info/github/ruby-rdf/sparql/frames
         
     | 
| 
       456 
463 
     | 
    
         
             
            [SPARQL XML]:       https://www.w3.org/TR/rdf-sparql-XMLres/
         
     | 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            3. 
     | 
| 
      
 1 
     | 
    
         
            +
            3.2.0
         
     | 
    
        data/bin/sparql
    CHANGED
    
    | 
         @@ -45,9 +45,18 @@ def run(input, **options) 
     | 
|
| 
       45 
45 
     | 
    
         
             
                SPARQL::Grammar.parse(input, **options)
         
     | 
| 
       46 
46 
     | 
    
         
             
              end
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
              puts ("\nSSE:\n" + query.to_sse) if options[:debug] 
     | 
| 
      
 48 
     | 
    
         
            +
              puts ("\nSSE:\n" + query.to_sse) if options[:debug]
         
     | 
| 
       49 
49 
     | 
    
         | 
| 
       50 
     | 
    
         
            -
               
     | 
| 
      
 50 
     | 
    
         
            +
              if options[:parse_only]
         
     | 
| 
      
 51 
     | 
    
         
            +
                case options[:format]
         
     | 
| 
      
 52 
     | 
    
         
            +
                when :sparql
         
     | 
| 
      
 53 
     | 
    
         
            +
                  puts ("\nSPARQL:\n" + query.to_sparql)
         
     | 
| 
      
 54 
     | 
    
         
            +
                when nil, :sse
         
     | 
| 
      
 55 
     | 
    
         
            +
                  puts ("\nSSE:\n" + query.to_sse)
         
     | 
| 
      
 56 
     | 
    
         
            +
                else
         
     | 
| 
      
 57 
     | 
    
         
            +
                  $stderr.puts "Unknown output format for parsing: #{options[:format]}. Use 'sse' or 'sparql'"
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
              else
         
     | 
| 
       51 
60 
     | 
    
         
             
                res = query.execute(options[:dataset], logger: options[:logger])
         
     | 
| 
       52 
61 
     | 
    
         
             
                display_results(res, **options)
         
     | 
| 
       53 
62 
     | 
    
         
             
              end
         
     | 
| 
         @@ -98,7 +107,7 @@ def usage 
     | 
|
| 
       98 
107 
     | 
    
         
             
              puts "      --dataset:            File containing RDF graph or dataset"
         
     | 
| 
       99 
108 
     | 
    
         
             
              puts "      --debug:              Display detailed debug output"
         
     | 
| 
       100 
109 
     | 
    
         
             
              puts "      --execute,-e:         Use option argument as the SPARQL input if no query-file given"
         
     | 
| 
       101 
     | 
    
         
            -
              puts "      --format:             Output format for results"
         
     | 
| 
      
 110 
     | 
    
         
            +
              puts "      --format:             Output format for results (json, xml, csv, tsv, html, sparql, sse, or another RDF format)"
         
     | 
| 
       102 
111 
     | 
    
         
             
              puts "      --port,-p             Port on which to run server; defaults to 9292"
         
     | 
| 
       103 
112 
     | 
    
         
             
              puts "      --sse:                Query input is in SSE format"
         
     | 
| 
       104 
113 
     | 
    
         
             
              puts "      --update:             Process query as a SPARQL Update"
         
     | 
| 
         @@ -151,7 +160,7 @@ end 
     | 
|
| 
       151 
160 
     | 
    
         | 
| 
       152 
161 
     | 
    
         
             
            case cmd
         
     | 
| 
       153 
162 
     | 
    
         
             
            when 'execute', 'parse'
         
     | 
| 
       154 
     | 
    
         
            -
              options[: 
     | 
| 
      
 163 
     | 
    
         
            +
              options[:parse_only] = true if cmd == 'parse'
         
     | 
| 
       155 
164 
     | 
    
         
             
              input ||= ARGV.empty? ? $stdin.read : RDF::Util::File.open_file(ARGV.first).read
         
     | 
| 
       156 
165 
     | 
    
         
             
              run(input, **options)
         
     | 
| 
       157 
166 
     | 
    
         
             
            when 'query'
         
     | 
| 
         @@ -43,6 +43,15 @@ class Object 
     | 
|
| 
       43 
43 
     | 
    
         
             
              def deep_dup
         
     | 
| 
       44 
44 
     | 
    
         
             
                dup
         
     | 
| 
       45 
45 
     | 
    
         
             
              end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
              ##
         
     | 
| 
      
 48 
     | 
    
         
            +
              #
         
     | 
| 
      
 49 
     | 
    
         
            +
              # Returns a partial SPARQL grammar for this term.
         
     | 
| 
      
 50 
     | 
    
         
            +
              #
         
     | 
| 
      
 51 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 52 
     | 
    
         
            +
              def to_sparql(**options)
         
     | 
| 
      
 53 
     | 
    
         
            +
                to_sxp(**options)
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
       46 
55 
     | 
    
         
             
            end
         
     | 
| 
       47 
56 
     | 
    
         | 
| 
       48 
57 
     | 
    
         
             
            ##
         
     | 
| 
         @@ -56,6 +65,16 @@ class Array 
     | 
|
| 
       56 
65 
     | 
    
         
             
                map {|x| x.to_sxp_bin}
         
     | 
| 
       57 
66 
     | 
    
         
             
              end
         
     | 
| 
       58 
67 
     | 
    
         | 
| 
      
 68 
     | 
    
         
            +
              ##
         
     | 
| 
      
 69 
     | 
    
         
            +
              #
         
     | 
| 
      
 70 
     | 
    
         
            +
              # Returns a partial SPARQL grammar for this array.
         
     | 
| 
      
 71 
     | 
    
         
            +
              #
         
     | 
| 
      
 72 
     | 
    
         
            +
              # @param [String] delimiter (" ")
         
     | 
| 
      
 73 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 74 
     | 
    
         
            +
              def to_sparql(delimiter: " ", **options)
         
     | 
| 
      
 75 
     | 
    
         
            +
                map {|e| e.to_sparql(**options)}.join(delimiter)
         
     | 
| 
      
 76 
     | 
    
         
            +
              end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
       59 
78 
     | 
    
         
             
              ##
         
     | 
| 
       60 
79 
     | 
    
         
             
              # Evaluates the array using the given variable `bindings`.
         
     | 
| 
       61 
80 
     | 
    
         
             
              #
         
     | 
| 
         @@ -216,15 +235,6 @@ end 
     | 
|
| 
       216 
235 
     | 
    
         
             
            ##
         
     | 
| 
       217 
236 
     | 
    
         
             
            # Extensions for Ruby's `Hash` class.
         
     | 
| 
       218 
237 
     | 
    
         
             
            class Hash
         
     | 
| 
       219 
     | 
    
         
            -
              ##
         
     | 
| 
       220 
     | 
    
         
            -
              # Returns the SXP representation of this object, defaults to `self`.
         
     | 
| 
       221 
     | 
    
         
            -
              #
         
     | 
| 
       222 
     | 
    
         
            -
              # @return [String]
         
     | 
| 
       223 
     | 
    
         
            -
              def to_sxp_bin
         
     | 
| 
       224 
     | 
    
         
            -
                to_a.to_sxp_bin
         
     | 
| 
       225 
     | 
    
         
            -
              end
         
     | 
| 
       226 
     | 
    
         
            -
              def to_sxp; to_sxp_bin; end
         
     | 
| 
       227 
     | 
    
         
            -
             
     | 
| 
       228 
238 
     | 
    
         
             
              ##
         
     | 
| 
       229 
239 
     | 
    
         
             
              # A duplicate of this hash.
         
     | 
| 
       230 
240 
     | 
    
         
             
              #
         
     | 
| 
         @@ -278,24 +288,20 @@ module RDF::Term 
     | 
|
| 
       278 
288 
     | 
    
         
             
              # @see SPARQL::Algebra::Expression#optimize
         
     | 
| 
       279 
289 
     | 
    
         
             
              def optimize(**options)
         
     | 
| 
       280 
290 
     | 
    
         
             
                optimized = self.deep_dup
         
     | 
| 
       281 
     | 
    
         
            -
                optimized.lexical = nil if optimized.respond_to?(:lexical=)
         
     | 
| 
       282 
     | 
    
         
            -
                optimized
         
     | 
| 
      
 291 
     | 
    
         
            +
                #optimized.lexical = nil if optimized.respond_to?(:lexical=)
         
     | 
| 
      
 292 
     | 
    
         
            +
                #optimized
         
     | 
| 
       283 
293 
     | 
    
         
             
              end
         
     | 
| 
       284 
     | 
    
         
            -
            end # RDF::Term
         
     | 
| 
       285 
294 
     | 
    
         | 
| 
       286 
     | 
    
         
            -
            class RDF::Literal::Double
         
     | 
| 
       287 
295 
     | 
    
         
             
              ##
         
     | 
| 
       288 
     | 
    
         
            -
              # 
     | 
| 
      
 296 
     | 
    
         
            +
              #
         
     | 
| 
      
 297 
     | 
    
         
            +
              # Returns a partial SPARQL grammar for this term.
         
     | 
| 
       289 
298 
     | 
    
         
             
              #
         
     | 
| 
       290 
299 
     | 
    
         
             
              # @return [String]
         
     | 
| 
       291 
     | 
    
         
            -
              def  
     | 
| 
       292 
     | 
    
         
            -
                 
     | 
| 
       293 
     | 
    
         
            -
                  when nan? then 'nan.0'
         
     | 
| 
       294 
     | 
    
         
            -
                  when infinite? then (infinite? > 0 ? '+inf.0' : '-inf.0')
         
     | 
| 
       295 
     | 
    
         
            -
                  else canonicalize.to_s.downcase
         
     | 
| 
       296 
     | 
    
         
            -
                end
         
     | 
| 
      
 300 
     | 
    
         
            +
              def to_sparql(**options)
         
     | 
| 
      
 301 
     | 
    
         
            +
                to_sxp(**options)
         
     | 
| 
       297 
302 
     | 
    
         
             
              end
         
     | 
| 
       298 
     | 
    
         
            -
            end
         
     | 
| 
      
 303 
     | 
    
         
            +
            end # RDF::Term
         
     | 
| 
      
 304 
     | 
    
         
            +
             
     | 
| 
       299 
305 
     | 
    
         | 
| 
       300 
306 
     | 
    
         
             
            # Override RDF::Queryable to execute against SPARQL::Algebra::Query elements as well as RDF::Query and RDF::Pattern
         
     | 
| 
       301 
307 
     | 
    
         
             
            module RDF::Queryable
         
     | 
| 
         @@ -343,6 +349,15 @@ module RDF::Queryable 
     | 
|
| 
       343 
349 
     | 
    
         
             
                  query_without_sparql(pattern, **options, &block)
         
     | 
| 
       344 
350 
     | 
    
         
             
                end
         
     | 
| 
       345 
351 
     | 
    
         
             
              end
         
     | 
| 
      
 352 
     | 
    
         
            +
             
     | 
| 
      
 353 
     | 
    
         
            +
              ##
         
     | 
| 
      
 354 
     | 
    
         
            +
              #
         
     | 
| 
      
 355 
     | 
    
         
            +
              # Returns a partial SPARQL grammar for this term.
         
     | 
| 
      
 356 
     | 
    
         
            +
              #
         
     | 
| 
      
 357 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 358 
     | 
    
         
            +
              def to_sparql(**options)
         
     | 
| 
      
 359 
     | 
    
         
            +
                raise NotImplementedError, "SPARQL::Algebra '#{first}' operator not implemented"
         
     | 
| 
      
 360 
     | 
    
         
            +
              end
         
     | 
| 
       346 
361 
     | 
    
         
             
            end
         
     | 
| 
       347 
362 
     | 
    
         | 
| 
       348 
363 
     | 
    
         
             
            class RDF::Statement
         
     | 
| 
         @@ -361,9 +376,29 @@ class RDF::Statement 
     | 
|
| 
       361 
376 
     | 
    
         
             
              ##
         
     | 
| 
       362 
377 
     | 
    
         
             
              # Returns an S-Expression (SXP) representation
         
     | 
| 
       363 
378 
     | 
    
         
             
              #
         
     | 
| 
      
 379 
     | 
    
         
            +
              # @param [Hash{Symbol => RDF::URI}] prefixes (nil)
         
     | 
| 
      
 380 
     | 
    
         
            +
              # @param [RDF::URI] base_uri (nil)
         
     | 
| 
       364 
381 
     | 
    
         
             
              # @return [String]
         
     | 
| 
       365 
     | 
    
         
            -
              def to_sxp
         
     | 
| 
       366 
     | 
    
         
            -
                to_sxp_bin.to_sxp
         
     | 
| 
      
 382 
     | 
    
         
            +
              def to_sxp(prefixes: nil, base_uri: nil)
         
     | 
| 
      
 383 
     | 
    
         
            +
                to_sxp_bin.to_sxp(prefixes: prefixes, base_uri: base_uri)
         
     | 
| 
      
 384 
     | 
    
         
            +
              end
         
     | 
| 
      
 385 
     | 
    
         
            +
             
     | 
| 
      
 386 
     | 
    
         
            +
              ##
         
     | 
| 
      
 387 
     | 
    
         
            +
              #
         
     | 
| 
      
 388 
     | 
    
         
            +
              # Returns a partial SPARQL grammar for this term.
         
     | 
| 
      
 389 
     | 
    
         
            +
              #
         
     | 
| 
      
 390 
     | 
    
         
            +
              # @param [Boolean] as_statement (false) serialize as < ... >, otherwise TRIPLE(...)
         
     | 
| 
      
 391 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 392 
     | 
    
         
            +
              def to_sparql(as_statement: false, **options)
         
     | 
| 
      
 393 
     | 
    
         
            +
                return "TRIPLE(#{to_triple.to_sparql(as_statement: true, **options)})" unless as_statement
         
     | 
| 
      
 394 
     | 
    
         
            +
             
     | 
| 
      
 395 
     | 
    
         
            +
                to_triple.map do |term|
         
     | 
| 
      
 396 
     | 
    
         
            +
                  if term.is_a?(::RDF::Statement)
         
     | 
| 
      
 397 
     | 
    
         
            +
                    "<<" + term.to_sparql(**options) + ">>"
         
     | 
| 
      
 398 
     | 
    
         
            +
                  else
         
     | 
| 
      
 399 
     | 
    
         
            +
                    term.to_sparql(**options)
         
     | 
| 
      
 400 
     | 
    
         
            +
                  end
         
     | 
| 
      
 401 
     | 
    
         
            +
                end.join(" ") + " ."
         
     | 
| 
       367 
402 
     | 
    
         
             
              end
         
     | 
| 
       368 
403 
     | 
    
         | 
| 
       369 
404 
     | 
    
         
             
              ##
         
     | 
| 
         @@ -411,6 +446,19 @@ class RDF::Query 
     | 
|
| 
       411 
446 
     | 
    
         
             
                end
         
     | 
| 
       412 
447 
     | 
    
         
             
              end
         
     | 
| 
       413 
448 
     | 
    
         | 
| 
      
 449 
     | 
    
         
            +
              ##
         
     | 
| 
      
 450 
     | 
    
         
            +
              #
         
     | 
| 
      
 451 
     | 
    
         
            +
              # Returns a partial SPARQL grammar for this term.
         
     | 
| 
      
 452 
     | 
    
         
            +
              #
         
     | 
| 
      
 453 
     | 
    
         
            +
              # @param [Boolean] top_level (true)
         
     | 
| 
      
 454 
     | 
    
         
            +
              #   Treat this as a top-level, generating SELECT ... WHERE {}
         
     | 
| 
      
 455 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 456 
     | 
    
         
            +
              def to_sparql(top_level: true, **options)
         
     | 
| 
      
 457 
     | 
    
         
            +
                str = @patterns.map { |e| e.to_sparql(as_statement: true, top_level: false, **options) }.join("\n")
         
     | 
| 
      
 458 
     | 
    
         
            +
                str = "GRAPH #{graph_name.to_sparql(**options)} {\n#{str}\n}\n" if graph_name
         
     | 
| 
      
 459 
     | 
    
         
            +
                top_level ? SPARQL::Algebra::Operator.to_sparql(str, **options) : str
         
     | 
| 
      
 460 
     | 
    
         
            +
              end
         
     | 
| 
      
 461 
     | 
    
         
            +
             
     | 
| 
       414 
462 
     | 
    
         
             
              ##
         
     | 
| 
       415 
463 
     | 
    
         
             
              # Binds the pattern to a solution, making it no longer variable if all variables are resolved to bound variables
         
     | 
| 
       416 
464 
     | 
    
         
             
              #
         
     | 
| 
         @@ -462,11 +510,11 @@ class RDF::Query 
     | 
|
| 
       462 
510 
     | 
    
         
             
              def optimize!(**options)
         
     | 
| 
       463 
511 
     | 
    
         
             
                @patterns = @patterns.map do |pattern|
         
     | 
| 
       464 
512 
     | 
    
         
             
                  components = pattern.to_quad.map do |term|
         
     | 
| 
       465 
     | 
    
         
            -
                    if term.respond_to?(:lexical=)
         
     | 
| 
       466 
     | 
    
         
            -
             
     | 
| 
       467 
     | 
    
         
            -
                    else
         
     | 
| 
      
 513 
     | 
    
         
            +
                    #if term.respond_to?(:lexical=)
         
     | 
| 
      
 514 
     | 
    
         
            +
                    #  term.dup.instance_eval {@lexical = nil; self}
         
     | 
| 
      
 515 
     | 
    
         
            +
                    #else
         
     | 
| 
       468 
516 
     | 
    
         
             
                      term
         
     | 
| 
       469 
     | 
    
         
            -
                    end
         
     | 
| 
      
 517 
     | 
    
         
            +
                    #end
         
     | 
| 
       470 
518 
     | 
    
         
             
                  end
         
     | 
| 
       471 
519 
     | 
    
         
             
                  RDF::Query::Pattern.from(components, **pattern.options)
         
     | 
| 
       472 
520 
     | 
    
         
             
                end
         
     | 
| 
         @@ -530,11 +578,15 @@ class RDF::Query::Variable 
     | 
|
| 
       530 
578 
     | 
    
         
             
                self
         
     | 
| 
       531 
579 
     | 
    
         
             
              end
         
     | 
| 
       532 
580 
     | 
    
         | 
| 
       533 
     | 
    
         
            -
               
     | 
| 
       534 
     | 
    
         
            -
              # 
     | 
| 
       535 
     | 
    
         
            -
               
     | 
| 
       536 
     | 
    
         
            -
             
     | 
| 
       537 
     | 
    
         
            -
             
     | 
| 
      
 581 
     | 
    
         
            +
              ##
         
     | 
| 
      
 582 
     | 
    
         
            +
              #
         
     | 
| 
      
 583 
     | 
    
         
            +
              # Returns a partial SPARQL grammar for this term.
         
     | 
| 
      
 584 
     | 
    
         
            +
              #
         
     | 
| 
      
 585 
     | 
    
         
            +
              # The Non-distinguished form (`??xxx`) is not part of the grammar, so replace with a blank-node
         
     | 
| 
      
 586 
     | 
    
         
            +
              #
         
     | 
| 
      
 587 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 588 
     | 
    
         
            +
              def to_sparql(**options)
         
     | 
| 
      
 589 
     | 
    
         
            +
                self.distinguished? ? super : "_:_nd#{self.name}"
         
     | 
| 
       538 
590 
     | 
    
         
             
              end
         
     | 
| 
       539 
591 
     | 
    
         
             
            end # RDF::Query::Variable
         
     | 
| 
       540 
592 
     | 
    
         | 
| 
         @@ -576,5 +628,13 @@ class RDF::Query::Solution 
     | 
|
| 
       576 
628 
     | 
    
         
             
              def to_sxp_bin
         
     | 
| 
       577 
629 
     | 
    
         
             
                to_a.to_sxp_bin
         
     | 
| 
       578 
630 
     | 
    
         
             
              end
         
     | 
| 
       579 
     | 
    
         
            -
             
     | 
| 
      
 631 
     | 
    
         
            +
             
     | 
| 
      
 632 
     | 
    
         
            +
              # Transform Solution into an SXP
         
     | 
| 
      
 633 
     | 
    
         
            +
              #
         
     | 
| 
      
 634 
     | 
    
         
            +
              # @param [Hash{Symbol => RDF::URI}] prefixes (nil)
         
     | 
| 
      
 635 
     | 
    
         
            +
              # @param [RDF::URI] base_uri (nil)
         
     | 
| 
      
 636 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 637 
     | 
    
         
            +
              def to_sxp(prefixes: nil, base_uri: nil)
         
     | 
| 
      
 638 
     | 
    
         
            +
                to_sxp_bin.to_sxp(prefixes: prefixes, base_uri: base_uri)
         
     | 
| 
      
 639 
     | 
    
         
            +
              end
         
     | 
| 
       580 
640 
     | 
    
         
             
            end # RDF::Query::Solution
         
     | 
| 
         @@ -3,8 +3,19 @@ module SPARQL; module Algebra 
     | 
|
| 
       3 
3 
     | 
    
         
             
                ##
         
     | 
| 
       4 
4 
     | 
    
         
             
                # The SPARQL logical `abs` operator.
         
     | 
| 
       5 
5 
     | 
    
         
             
                #
         
     | 
| 
       6 
     | 
    
         
            -
                #  
     | 
| 
       7 
     | 
    
         
            -
                # 
     | 
| 
      
 6 
     | 
    
         
            +
                # [121] BuiltInCall ::= ... | 'ABS' '(' Expression ')'
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @example SPARQL Query
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   PREFIX : <http://example.org/>
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   SELECT * WHERE {
         
     | 
| 
      
 11 
     | 
    
         
            +
                #     ?s :num ?num
         
     | 
| 
      
 12 
     | 
    
         
            +
                #     FILTER(ABS(?num) >= 2)
         
     | 
| 
      
 13 
     | 
    
         
            +
                #   }
         
     | 
| 
      
 14 
     | 
    
         
            +
                #
         
     | 
| 
      
 15 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
      
 16 
     | 
    
         
            +
                #   (prefix ((: <http://example.org/>))
         
     | 
| 
      
 17 
     | 
    
         
            +
                #    (filter (>= (abs ?num) 2)
         
     | 
| 
      
 18 
     | 
    
         
            +
                #     (bgp (triple ?s :num ?num))))
         
     | 
| 
       8 
19 
     | 
    
         
             
                #
         
     | 
| 
       9 
20 
     | 
    
         
             
                # @see https://www.w3.org/TR/sparql11-query/#func-abs
         
     | 
| 
       10 
21 
     | 
    
         
             
                # @see https://www.w3.org/TR/xpath-functions/#func-abs
         
     | 
| 
         @@ -26,6 +37,15 @@ module SPARQL; module Algebra 
     | 
|
| 
       26 
37 
     | 
    
         
             
                      else raise TypeError, "expected an RDF::Literal::Numeric, but got #{operand.inspect}"
         
     | 
| 
       27 
38 
     | 
    
         
             
                    end
         
     | 
| 
       28 
39 
     | 
    
         
             
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 42 
     | 
    
         
            +
                  #
         
     | 
| 
      
 43 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this operator.
         
     | 
| 
      
 44 
     | 
    
         
            +
                  #
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 46 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    "ABS(#{operands.first.to_sparql(**options)})"
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
       29 
49 
     | 
    
         
             
                end # Abs
         
     | 
| 
       30 
50 
     | 
    
         
             
              end # Operator
         
     | 
| 
       31 
51 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -6,8 +6,15 @@ module SPARQL; module Algebra 
     | 
|
| 
       6 
6 
     | 
    
         
             
                #
         
     | 
| 
       7 
7 
     | 
    
         
             
                # The ADD operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, and initial data from the destination graph, if any, is kept intact.
         
     | 
| 
       8 
8 
     | 
    
         
             
                #
         
     | 
| 
       9 
     | 
    
         
            -
                #  
     | 
| 
       10 
     | 
    
         
            -
                # 
     | 
| 
      
 9 
     | 
    
         
            +
                # [35]	Add	::=	"ADD" "SILENT"? GraphOrDefault "TO" GraphOrDefault
         
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
      
 11 
     | 
    
         
            +
                # @example SPARQL Update
         
     | 
| 
      
 12 
     | 
    
         
            +
                #   PREFIX : <http://example.org/>
         
     | 
| 
      
 13 
     | 
    
         
            +
                #   ADD DEFAULT TO :g1
         
     | 
| 
      
 14 
     | 
    
         
            +
                #
         
     | 
| 
      
 15 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
      
 16 
     | 
    
         
            +
                #   (prefix ((: <http://example.org/>))
         
     | 
| 
      
 17 
     | 
    
         
            +
                #    (update (add default :g1)))
         
     | 
| 
       11 
18 
     | 
    
         
             
                #
         
     | 
| 
       12 
19 
     | 
    
         
             
                # @see https://www.w3.org/TR/sparql11-update/#add
         
     | 
| 
       13 
20 
     | 
    
         
             
                class Add < Operator
         
     | 
| 
         @@ -51,6 +58,18 @@ module SPARQL; module Algebra 
     | 
|
| 
       51 
58 
     | 
    
         
             
                    end
         
     | 
| 
       52 
59 
     | 
    
         
             
                    queryable
         
     | 
| 
       53 
60 
     | 
    
         
             
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 63 
     | 
    
         
            +
                  #
         
     | 
| 
      
 64 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this operator.
         
     | 
| 
      
 65 
     | 
    
         
            +
                  #
         
     | 
| 
      
 66 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 67 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 68 
     | 
    
         
            +
                    *args, last = operands.dup
         
     | 
| 
      
 69 
     | 
    
         
            +
                    args += [:TO, last]
         
     | 
| 
      
 70 
     | 
    
         
            +
                    
         
     | 
| 
      
 71 
     | 
    
         
            +
                    "ADD " + args.to_sparql(**options)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
       54 
73 
     | 
    
         
             
                end # Add
         
     | 
| 
       55 
74 
     | 
    
         
             
              end # Operator
         
     | 
| 
       56 
75 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -7,8 +7,23 @@ module SPARQL; module Algebra 
     | 
|
| 
       7 
7 
     | 
    
         
             
                #
         
     | 
| 
       8 
8 
     | 
    
         
             
                #     eval(Path(X, alt(P,Q), Y)) = Union(eval(Path(X, P, Y)), eval(Path(X, Q, Y)))
         
     | 
| 
       9 
9 
     | 
    
         
             
                #
         
     | 
| 
       10 
     | 
    
         
            -
                #  
     | 
| 
       11 
     | 
    
         
            -
                # 
     | 
| 
      
 10 
     | 
    
         
            +
                # [89] PathAlternative ::= PathSequence ( '|' PathSequence )*
         
     | 
| 
      
 11 
     | 
    
         
            +
                #
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @example SPARQL Query
         
     | 
| 
      
 13 
     | 
    
         
            +
                #   PREFIX :  <http://www.example.org/>
         
     | 
| 
      
 14 
     | 
    
         
            +
                #   SELECT ?t
         
     | 
| 
      
 15 
     | 
    
         
            +
                #   WHERE {
         
     | 
| 
      
 16 
     | 
    
         
            +
                #     :a :p1|:p2/:p3|:p4 ?t
         
     | 
| 
      
 17 
     | 
    
         
            +
                #   }
         
     | 
| 
      
 18 
     | 
    
         
            +
                #
         
     | 
| 
      
 19 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
      
 20 
     | 
    
         
            +
                #   (prefix ((: <http://www.example.org/>))
         
     | 
| 
      
 21 
     | 
    
         
            +
                #    (project (?t)
         
     | 
| 
      
 22 
     | 
    
         
            +
                #     (path :a
         
     | 
| 
      
 23 
     | 
    
         
            +
                #      (alt
         
     | 
| 
      
 24 
     | 
    
         
            +
                #       (alt :p1 (seq :p2 :p3))
         
     | 
| 
      
 25 
     | 
    
         
            +
                #       :p4)
         
     | 
| 
      
 26 
     | 
    
         
            +
                #      ?t)))
         
     | 
| 
       12 
27 
     | 
    
         
             
                #
         
     | 
| 
       13 
28 
     | 
    
         
             
                # @see https://www.w3.org/TR/sparql11-query/#defn_evalPP_alternative
         
     | 
| 
       14 
29 
     | 
    
         
             
                class Alt < Operator::Binary
         
     | 
| 
         @@ -57,6 +72,15 @@ module SPARQL; module Algebra 
     | 
|
| 
       57 
72 
     | 
    
         
             
                    query = Union.new(qa, qb)
         
     | 
| 
       58 
73 
     | 
    
         
             
                    queryable.query(query, depth: options[:depth].to_i + 1, **options, &block)
         
     | 
| 
       59 
74 
     | 
    
         
             
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 77 
     | 
    
         
            +
                  #
         
     | 
| 
      
 78 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this operator.
         
     | 
| 
      
 79 
     | 
    
         
            +
                  #
         
     | 
| 
      
 80 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 81 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 82 
     | 
    
         
            +
                    "#{operands.first.to_sparql(**options)}|#{operands.last.to_sparql(**options)}"
         
     | 
| 
      
 83 
     | 
    
         
            +
                  end
         
     | 
| 
       60 
84 
     | 
    
         
             
                end # Alt
         
     | 
| 
       61 
85 
     | 
    
         
             
              end # Operator
         
     | 
| 
       62 
86 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -3,9 +3,22 @@ module SPARQL; module Algebra 
     | 
|
| 
       3 
3 
     | 
    
         
             
                ##
         
     | 
| 
       4 
4 
     | 
    
         
             
                # The SPARQL logical `and` operator.
         
     | 
| 
       5 
5 
     | 
    
         
             
                #
         
     | 
| 
       6 
     | 
    
         
            -
                #  
     | 
| 
       7 
     | 
    
         
            -
                # 
     | 
| 
       8 
     | 
    
         
            -
                # 
     | 
| 
      
 6 
     | 
    
         
            +
                # [112] ConditionalAndExpression::= ValueLogical ( '&&' ValueLogical )*
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @example SPARQL Grammar
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   PREFIX  xsd: <http://www.w3.org/2001/XMLSchema#>
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   PREFIX  : <http://example.org/ns#>
         
     | 
| 
      
 11 
     | 
    
         
            +
                #   SELECT  ?a
         
     | 
| 
      
 12 
     | 
    
         
            +
                #   WHERE { ?a :p ?v . 
         
     | 
| 
      
 13 
     | 
    
         
            +
                #     FILTER ("true"^^xsd:boolean && ?v) .
         
     | 
| 
      
 14 
     | 
    
         
            +
                #   }
         
     | 
| 
      
 15 
     | 
    
         
            +
                #
         
     | 
| 
      
 16 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
      
 17 
     | 
    
         
            +
                #   (prefix
         
     | 
| 
      
 18 
     | 
    
         
            +
                #    ((xsd: <http://www.w3.org/2001/XMLSchema#>) (: <http://example.org/ns#>))
         
     | 
| 
      
 19 
     | 
    
         
            +
                #    (project (?a)
         
     | 
| 
      
 20 
     | 
    
         
            +
                #     (filter (&& true ?v)
         
     | 
| 
      
 21 
     | 
    
         
            +
                #      (bgp (triple ?a :p ?v)))))
         
     | 
| 
       9 
22 
     | 
    
         
             
                #
         
     | 
| 
       10 
23 
     | 
    
         
             
                # @see https://www.w3.org/TR/sparql11-query/#func-logical-and
         
     | 
| 
       11 
24 
     | 
    
         
             
                # @see https://www.w3.org/TR/sparql11-query/#evaluation
         
     | 
| 
         @@ -60,6 +73,15 @@ module SPARQL; module Algebra 
     | 
|
| 
       60 
73 
     | 
    
         
             
                    else                              RDF::Literal(left && right)
         
     | 
| 
       61 
74 
     | 
    
         
             
                    end
         
     | 
| 
       62 
75 
     | 
    
         
             
                  end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 78 
     | 
    
         
            +
                  #
         
     | 
| 
      
 79 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this operator.
         
     | 
| 
      
 80 
     | 
    
         
            +
                  #
         
     | 
| 
      
 81 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 82 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    "(#{operands.first.to_sparql(**options)} && #{operands.last.to_sparql(**options)})"
         
     | 
| 
      
 84 
     | 
    
         
            +
                  end
         
     | 
| 
       63 
85 
     | 
    
         
             
                end # And
         
     | 
| 
       64 
86 
     | 
    
         
             
              end # Operator
         
     | 
| 
       65 
87 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -3,7 +3,15 @@ module SPARQL; module Algebra 
     | 
|
| 
       3 
3 
     | 
    
         
             
                ##
         
     | 
| 
       4 
4 
     | 
    
         
             
                # The SPARQL ascending sort operator.
         
     | 
| 
       5 
5 
     | 
    
         
             
                #
         
     | 
| 
       6 
     | 
    
         
            -
                #  
     | 
| 
      
 6 
     | 
    
         
            +
                # [24]  OrderCondition          ::= ( ( 'ASC' | 'DESC' ) BrackettedExpression ) | ( Constraint | Var )
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @example SPARQL Query
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   SELECT ?name
         
     | 
| 
      
 11 
     | 
    
         
            +
                #   WHERE { ?x foaf:name ?name }
         
     | 
| 
      
 12 
     | 
    
         
            +
                #   ORDER BY ASC(?name)
         
     | 
| 
      
 13 
     | 
    
         
            +
                #
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
       7 
15 
     | 
    
         
             
                #   (prefix ((foaf: <http://xmlns.com/foaf/0.1/>))
         
     | 
| 
       8 
16 
     | 
    
         
             
                #     (project (?name)
         
     | 
| 
       9 
17 
     | 
    
         
             
                #       (order ((asc ?name))
         
     | 
| 
         @@ -27,6 +35,17 @@ module SPARQL; module Algebra 
     | 
|
| 
       27 
35 
     | 
    
         
             
                  def evaluate(bindings, **options)
         
     | 
| 
       28 
36 
     | 
    
         
             
                    operand(0).evaluate(bindings, depth: options[:depth].to_i + 1, **options)
         
     | 
| 
       29 
37 
     | 
    
         
             
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 40 
     | 
    
         
            +
                  #
         
     | 
| 
      
 41 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this operator.
         
     | 
| 
      
 42 
     | 
    
         
            +
                  #
         
     | 
| 
      
 43 
     | 
    
         
            +
                  # Provides order to descendant query.
         
     | 
| 
      
 44 
     | 
    
         
            +
                  #
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 46 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    "ASC(#{operands.last.to_sparql(**options)})"
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
       30 
49 
     | 
    
         
             
                end # Asc
         
     | 
| 
       31 
50 
     | 
    
         
             
              end # Operator
         
     | 
| 
       32 
51 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -5,7 +5,13 @@ module SPARQL; module Algebra 
     | 
|
| 
       5 
5 
     | 
    
         
             
                #
         
     | 
| 
       6 
6 
     | 
    
         
             
                # Applications can use the ASK form to test whether or not a query pattern has a solution. No information is returned about the possible query solutions, just whether or not a solution exists.
         
     | 
| 
       7 
7 
     | 
    
         
             
                #
         
     | 
| 
       8 
     | 
    
         
            -
                #  
     | 
| 
      
 8 
     | 
    
         
            +
                # [12]  AskQuery                ::= 'ASK' DatasetClause* WhereClause ValuesClause
         
     | 
| 
      
 9 
     | 
    
         
            +
                #
         
     | 
| 
      
 10 
     | 
    
         
            +
                # @example SPARQL Query
         
     | 
| 
      
 11 
     | 
    
         
            +
                #   PREFIX :    <http://example/>
         
     | 
| 
      
 12 
     | 
    
         
            +
                #   ASK  { :x :p  ?x }
         
     | 
| 
      
 13 
     | 
    
         
            +
                #
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
       9 
15 
     | 
    
         
             
                #   (prefix ((: <http://example/>))
         
     | 
| 
       10 
16 
     | 
    
         
             
                #     (ask
         
     | 
| 
       11 
17 
     | 
    
         
             
                #       (bgp (triple :x :p ?x))))
         
     | 
| 
         @@ -41,6 +47,16 @@ module SPARQL; module Algebra 
     | 
|
| 
       41 
47 
     | 
    
         
             
                  def query_yields_boolean?
         
     | 
| 
       42 
48 
     | 
    
         
             
                    true
         
     | 
| 
       43 
49 
     | 
    
         
             
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 52 
     | 
    
         
            +
                  #
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this term.
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 56 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    "ASK\n" +
         
     | 
| 
      
 58 
     | 
    
         
            +
                    operands.first.to_sparql(top_level: true, project: nil, **options)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
       44 
60 
     | 
    
         
             
                end # Ask
         
     | 
| 
       45 
61 
     | 
    
         
             
              end # Operator
         
     | 
| 
       46 
62 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -3,7 +3,14 @@ module SPARQL; module Algebra 
     | 
|
| 
       3 
3 
     | 
    
         
             
                ##
         
     | 
| 
       4 
4 
     | 
    
         
             
                # The SPARQL `avg` set function.
         
     | 
| 
       5 
5 
     | 
    
         
             
                #
         
     | 
| 
       6 
     | 
    
         
            -
                #  
     | 
| 
      
 6 
     | 
    
         
            +
                # [127] Aggregate::= ... | 'AVG' '(' 'DISTINCT'? Expression ')' 
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @example SPARQL Query
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   PREFIX : <http://www.example.org/>
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   SELECT (AVG(?o) AS ?avg)
         
     | 
| 
      
 11 
     | 
    
         
            +
                #   WHERE { ?s :dec ?o }
         
     | 
| 
      
 12 
     | 
    
         
            +
                #
         
     | 
| 
      
 13 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
       7 
14 
     | 
    
         
             
                #    (prefix ((: <http://www.example.org/>))
         
     | 
| 
       8 
15 
     | 
    
         
             
                #      (project (?avg)
         
     | 
| 
       9 
16 
     | 
    
         
             
                #        (extend ((?avg ??.0))
         
     | 
| 
         @@ -40,6 +47,15 @@ module SPARQL; module Algebra 
     | 
|
| 
       40 
47 
     | 
    
         
             
                      raise TypeError, "Averaging non-numeric types: #{enum.flatten}"
         
     | 
| 
       41 
48 
     | 
    
         
             
                    end
         
     | 
| 
       42 
49 
     | 
    
         
             
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 52 
     | 
    
         
            +
                  #
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this operator.
         
     | 
| 
      
 54 
     | 
    
         
            +
                  #
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 56 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    "AVG(#{operands.to_sparql(**options)})"
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
       43 
59 
     | 
    
         
             
                end # Avg
         
     | 
| 
       44 
60 
     | 
    
         
             
              end # Operator
         
     | 
| 
       45 
61 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -3,7 +3,13 @@ module SPARQL; module Algebra 
     | 
|
| 
       3 
3 
     | 
    
         
             
                ##
         
     | 
| 
       4 
4 
     | 
    
         
             
                # The SPARQL GraphPattern `base` operator.
         
     | 
| 
       5 
5 
     | 
    
         
             
                #
         
     | 
| 
       6 
     | 
    
         
            -
                #  
     | 
| 
      
 6 
     | 
    
         
            +
                # [5]   BaseDecl                ::= 'BASE' IRIREF
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @example SPARQL Grammar
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   BASE <http://example.org/>
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   SELECT * { <a> <b> 123.0 }
         
     | 
| 
      
 11 
     | 
    
         
            +
                #
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
       7 
13 
     | 
    
         
             
                #   (base <http://example.org/>
         
     | 
| 
       8 
14 
     | 
    
         
             
                #     (bgp (triple <a> <b> 123.0)))
         
     | 
| 
       9 
15 
     | 
    
         
             
                #
         
     | 
| 
         @@ -56,6 +62,17 @@ module SPARQL; module Algebra 
     | 
|
| 
       56 
62 
     | 
    
         
             
                  def query_yields_statements?
         
     | 
| 
       57 
63 
     | 
    
         
             
                    operands.last.query_yields_statements?
         
     | 
| 
       58 
64 
     | 
    
         
             
                  end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  ##
         
     | 
| 
      
 67 
     | 
    
         
            +
                  #
         
     | 
| 
      
 68 
     | 
    
         
            +
                  # Returns a partial SPARQL grammar for this term.
         
     | 
| 
      
 69 
     | 
    
         
            +
                  #
         
     | 
| 
      
 70 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 71 
     | 
    
         
            +
                  def to_sparql(**options)
         
     | 
| 
      
 72 
     | 
    
         
            +
                    str = "BASE #{operands.first.to_sparql}\n"
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                    str << operands.last.to_sparql(base_uri: operands.first, **options)
         
     | 
| 
      
 75 
     | 
    
         
            +
                  end
         
     | 
| 
       59 
76 
     | 
    
         
             
                end # Base
         
     | 
| 
       60 
77 
     | 
    
         
             
              end # Operator
         
     | 
| 
       61 
78 
     | 
    
         
             
            end; end # SPARQL::Algebra
         
     | 
| 
         @@ -5,7 +5,11 @@ module SPARQL; module Algebra 
     | 
|
| 
       5 
5 
     | 
    
         
             
                #
         
     | 
| 
       6 
6 
     | 
    
         
             
                # Query with `graph_name` set to false.
         
     | 
| 
       7 
7 
     | 
    
         
             
                #
         
     | 
| 
       8 
     | 
    
         
            -
                # @example
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @example SPARQL Grammar
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   PREFIX : <http://example/>
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   SELECT * { :s :p :o }
         
     | 
| 
      
 11 
     | 
    
         
            +
                #
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @example SSE
         
     | 
| 
       9 
13 
     | 
    
         
             
                #   (prefix ((: <http://example/>))
         
     | 
| 
       10 
14 
     | 
    
         
             
                #     (bgp (triple ?s ?p ?o)))
         
     | 
| 
       11 
15 
     | 
    
         
             
                #
         
     |