For some reason, I'm having trouble executing the "sub-query" sparql
query using the SPIN api.  Even after simplifying the query to remove
the LET and the SPIN function, the query with sub-queries doesn't return
results when it should.

Specifically, when I execute the following query in my code using the
SPIN API, as well as when I execute it from the TBC SPARQL tab, it works
correctly:

SELECT ?value
WHERE {?user a ModelManagement:User .
         ?user ModelManagement:firstName ?value
        }

However, when I execute the following, I think logically equivalent
query, I get no results: 

SELECT ?value
        {
            {SELECT ?user
              WHERE {
             ?user a ModelManagement:User .
              }
            }
            {SELECT ?user ?value
              WHERE {
                 ?user ModelManagement:firstName ?value
              }
           }
        } 

This query does work correctly from the TBC SPARQL tab, and I can also
run this query in my code using just the jena/arq API and it works
correctly.  

I've pasted below the code I use to execute the queries using the SPIN
API, which seems to work for most cases.  I have a feeling there's a
more concise way to do this, but that's a topic for another post...

            //Create the ARQ Query from the SPARQL string.
                arqQuery = QueryFactory.create(sparqlStr,
Syntax.syntaxARQ);

                //Get the ARQ2SPIN utility, specifying model to be
queried.
                ARQ2SPIN a2s = new
ARQ2SPIN(modelManagementInst.memModel);

                //Create a SPIN query from the ARQ Query
                org.topbraid.spin.model.Query spinQuery =
a2s.createQuery(arqQuery,
                                        null);
                        
                //Wrap up both queries in a SPIN wrapper.
                QueryWrapper wrapper = null;
                String ruleText = null;
                if (spinQuery != null) {
                        StringPrintContext p = new StringPrintContext();
                        spinQuery.print(p);
                        if (ruleText == null) {
                                ruleText = p.getString();
                        }
                        arqQuery =
ARQFactory.get().createQuery(modelManagementInst.memModel,
        
p.getStringBuilder().toString());
                        wrapper = new QueryWrapper(arqQuery, ruleText,
spinQuery,
                                                ruleText);
                }

                //Get the arq query from the wrapper
                arqQuery = wrapper.getQuery();
                        
                //Get the query execution
                QueryExecution selQe =
ARQFactory.get().createQueryExecution(
                                        arqQuery,
modelManagementInst.memModel);

                //Execute it
                ResultSet rs = selQe.execSelect();


> -----Original Message-----
> From: Schmitz, Jeffrey A 
> Sent: Thursday, May 28, 2009 11:06 AM
> To: [email protected]
> Subject: [tbc-users] Re: [SPIN] Using FILTER with function arguments
> 
> 
> No, that's not working in this case...
> 
> SELECT ?user ?value
> WHERE {
>  LET(?user := :getProjectUser("DEFAULT_PROJECT", "xxx")) 
> FILTER (bound(?user)) ?user :firstName ?value }
> 
> Still returns everything with a firstName property.  
> 
> > -----Original Message-----
> > From: Holger Knublauch [mailto:[email protected]]
> > Sent: Thursday, May 28, 2009 10:22 AM
> > To: [email protected]
> > Subject: [tbc-users] Re: [SPIN] Using FILTER with function arguments
> > 
> > 
> > Jeff,
> > 
> > wouldn't it be sufficient to add a FILTER bound(?var) after the 
> > function call?
> > 
> > Holger
> > 
> > 
> > On May 28, 2009, at 7:06 AM, Schmitz, Jeffrey A wrote:
> > 
> > >
> > > "The function returns no binding and therefore ?user is 
> unbound and 
> > > will be iterating over all possible subjects of the firstName 
> > > triples."
> > >
> > > Hmmm, not what I was expecting.  I guess I would have
> > expected it to
> > > act more like normal SPARQL variable chaining occurrs, 
> e.g. in the 
> > > following
> > > query:
> > >
> > > SELECT ?user ?value
> > > WHERE {?user a :NonExistantClass .
> > >       ?user :firstName ?value}
> > >
> > > ?user is "unbound" after the first line (NonExistantClass doesn't 
> > > really exist), and this query returns no results instead of
> > everything
> > > in the model with a firstName property.  Even if you reverse the
> > > order:
> > >
> > > SELECT ?user ?value
> > > WHERE {?user :firstName ?value .
> > >       ?user a :NonExistantClass .
> > >       }
> > >
> > > You still get no results.  But change it to something like:
> > >
> > > SELECT ?user ?value
> > > WHERE {(LET ?user := :filterOnClass(:NonExistantClass)
> > >        ?user :firstName ?value}
> > >
> > > And you do get everything in the model with a firstName property.
> > >
> > > Be that as it may, using subqueries I think I'm able to get the 
> > > behavior I'm looking for.  A little verbose, but if I understand 
> > > things, I think you'd have to do this anytime you wanted to use a 
> > > re-usable SPIN filtering function:
> > >
> > >
> > > SELECT ?user ?value
> > > {
> > >    {SELECT ?user
> > >      WHERE {
> > >          LET(?user :=
> > > ModelManagement:getProjectUser("DEFAULT_PROJECT",
> > > "xxx"))
> > >      }
> > >    }
> > >    {SELECT ?user ?value
> > >      WHERE {
> > >         ?user ModelManagement:firstName ?value
> > >      }
> > >   }
> > > }
> > >
> > > In the above query, if the user specified in the LET 
> (xxx) doesn't 
> > > exist, nothing is returned.
> > >
> > >
> > >> -----Original Message-----
> > >> From: Holger Knublauch [mailto:[email protected]]
> > >> Sent: Wednesday, May 27, 2009 9:38 PM
> > >> To: [email protected]
> > >> Subject: [tbc-users] Re: [SPIN] Using FILTER with function
> > arguments
> > >>
> > >>
> > >>
> > >> On May 27, 2009, at 12:21 PM, Schmitz, Jeffrey A wrote:
> > >>
> > >>>
> > >>> It's getting curiousor and curiousor...
> > >>>
> > >>> Using the TBC SPARQL tab, when I call a function that filters 
> > >>> according to an argument, e.g.:
> > >>>
> > >>> SELECT ?user
> > >>> WHERE {
> > >>>   ?project ModelManagement:hasUser ?user .
> > >>>   ?user Common:name ?username .
> > >>>   FILTER (?username = ?arg1) .
> > >>> }
> > >>
> > >> If the function returns no binding then it will be 
> comparable to a 
> > >> wildcard in the query below.
> > >>
> > >>>
> > >>>
> > >>> As long as I pass in an argument that has a match:
> > >>>
> > >>> SELECT ?value
> > >>> WHERE {LET(?user := ModelManagement:getProjectUser("john"))
> > >>>              ?user ModelManagement:firstName ?value}
> > >>>
> > >>> the function returns just one result as expected (in this
> > case for
> > >>> some reason the blank result rows aren't returned).  
> > However, if I
> > >>> pass in a value that has NO matches:
> > >>>
> > >>> SELECT ?value
> > >>> WHERE {LET(?user := ModelManagement:getProjectUser("xxx"))
> > >>>              ?user ModelManagement:firstName ?value}
> > >>>
> > >>>
> > >>> It acts like the FILTER statement isn't there, and all
> > >> User's names in
> > >>> the model are returned.  I would have expected no results to be 
> > >>> returned.  Btw, I'm seeing this same behavior in my code
> > too.  Am I
> > >>> thinking about this wrong, or is there perhaps a 
> problem with how 
> > >>> FILTER works within a Function?
> > >>
> > >> No, the behavior is correct (as far as I understand your 
> example). 
> > >> The function returns no binding and therefore ?user is 
> unbound and 
> > >> will be iterating over all possible subjects of the firstName 
> > >> triples.
> > >>
> > >> In your first email, please keep in mind that the
> > execution order of
> > >> ARQ might be different from what you have typed it. In
> > particular, I
> > >> find often that LET statements are executed at the end,
> > and therefore
> > >> lead to more iterations than expected.
> > >>
> > >> Holger
> > >>
> > >>
> > >>>
> > >>
> > >
> > > >
> > 
> > 
> > > 
> > 
> 
> > 
> 

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TopBraid Composer Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/topbraid-composer-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to