HI Holger, I lost my connection to my work account shortly after my last message to you (about the QuerySolutionMap variables). Anyway, I wanted to let you know that the QuerySolutionMap variables wasn't the problem with running your fix in my webapp. It was again a CM problem.
If you care to know the details... with your latest update I moved to just using the spinrdf.jar instead of the source, and that worked fine when run from within Eclipse. However, my build/deploy script was still building from the old source and copying the class files to the webapp environment. After fixing that, everything works great! Anyway, I'm really glad I got this working before my semtech presentation since I talk a little about SPIN and using its SPARQL Function capabilities, and it's really almost an essential capability for our applications. Thanks for all your help! Jeff On May 29, 2:14 pm, Holger Knublauch <[email protected]> wrote: > Jeff, > > I have just added subqueries to SPIN and will send you an email off- > list with an update. > > Holger > > On May 28, 2009, at 1:19 PM, Schmitz, Jeffrey A wrote: > > > > > Ah yes, I vaguely remember reading that now that you mention it, and > > as > > that's exactly what I'm trying to do, I'm sure that's what is > > happening. > > Sorry, too much to keep track of. > > > Any rough idea if/when that will be added? Our implementation REALLY > > needs a way to create and use re-usable SPARQL Filter SPIN functions, > > and from what I can tell right now, the only way to implement them > > is to > > use sub-selects, unless of course the Jena folks were to implement the > > previously suggested "MATCH" assignement capability (I won't hold my > > breath on that one) :-) > > > As an interesting side note, using a subselect with a reference to a > > SPIN function from the TBC SPARQL tab DOES work. e.g. with > > getProjectUser defined as a SPIN Function this works: > > > SELECT ?value > > { > > {SELECT ?user > > WHERE { > > LET(?user := :getProjectUser("DEFAULT_PROJECT", "jeff")) > > } > > } > > {SELECT ?user ?value > > WHERE { > > ?user :firstName ?value > > } > > } > > } > > > Thanks! > > Jeff > > p.s. as a very ironic side note, my ctrl key has stopped working. > > Guess > > it didn't like me disparaging ctrl-space. > > >> -----Original Message----- > >> From: Holger Knublauch [mailto:[email protected]] > >> Sent: Thursday, May 28, 2009 2:32 PM > >> To: [email protected] > >> Subject: [tbc-users] Re: [SPIN] Using FILTER with function arguments > > >> Hi Jeff, > > >> as posted a few weeks ago, SPIN RDF syntax does not support > >> sub- selects yet. Maybe this is what you are experiencing here? > > >> Holger > > >> On May 28, 2009, at 11:14 AM, Schmitz, Jeffrey A wrote: > > >>> 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, > > ... > > read more » --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
