"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