You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Describe the bug
Bind operator working wrong since 7.0
To Reproduce
Just use a query with BIND inside one of the examples (here I chose the one about using a storage based on N3.js).
'use strict'const{ Parser, Store }=require('n3')const{ HashMapDataset, Graph, PlanBuilder }=require('sparql-engine')// Format a triple pattern according to N3 API:// SPARQL variables must be replaced by `null` valuesfunctionformatTriplePattern(triple){letsubject=nullletpredicate=nullletobject=nullif(!triple.subject.startsWith('?')){subject=triple.subject}if(!triple.predicate.startsWith('?')){predicate=triple.predicate}if(!triple.object.startsWith('?')){object=triple.object}return{ subject, predicate, object }}classN3GraphextendsGraph{constructor(){super()this._store=Store()}insert(triple){returnnewPromise((resolve,reject)=>{try{this._store.addTriple(triple.subject,triple.predicate,triple.object)resolve()}catch(e){reject(e)}})}delete(triple){returnnewPromise((resolve,reject)=>{try{this._store.removeTriple(triple.subject,triple.predicate,triple.object)resolve()}catch(e){reject(e)}})}find(triple){const{ subject, predicate, object }=formatTriplePattern(triple)returnthis._store.getTriples(subject,predicate,object)}estimateCardinality(triple){const{ subject, predicate, object }=formatTriplePattern(triple)returnPromise.resolve(this._store.countTriples(subject,predicate,object))}}constgraph=newN3Graph()constdataset=newHashMapDataset('http://example.org#default',graph)// Load some RDF data into the graphconstparser=newParser()parser.parse(` @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix : <http://example.org#> . :a foaf:name "a" . :b foaf:name "b" .`).forEach(t=>{graph._store.addTriple(t)})constquery=` PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?s ?name WHERE { BIND(<http://example.org#a> as ?s) ?s foaf:name ?name . }`// Creates a plan builder for the RDF datasetconstbuilder=newPlanBuilder(dataset)// Get an iterator to evaluate the queryconstiterator=builder.build(query)// Read resultsiterator.subscribe(bindings=>{console.log('Found solution:',bindings.toObject())},err=>{console.error('error',err)},()=>{console.log('Query evaluation complete!')})
Expected behavior
On 6.0 and below, I get the expected result:
Thank you for using sparql-engine 👍 It is in deed a regression: in v0.7.0, we introduced a query plan optimizer, to, optimize the execution plan regardless of the syntax of the query. However, we didn't account for the very special case your issue highlight: a BIND clause sued to feed data into the res tof the query. The plan optimizer doesn't recognize the dependency between the BIND clause and the triple patterns, and pushes the BIND evaluation after the triple pattern evaluation. This pattern is evaluated first and then the BIND overrides ?s with http://example.org#a, leading to this results.
I will look into this if there's a quick fix, thank you for sharing it!
Describe the bug
Bind operator working wrong since 7.0
To Reproduce
Just use a query with BIND inside one of the examples (here I chose the one about using a storage based on N3.js).
Expected behavior
On 6.0 and below, I get the expected result:
While on 7.0 and above, I get:
The text was updated successfully, but these errors were encountered: