A little more info on this, I've added code to directly execute a query
that references the registered function instead of relying on executing
the SPIN rule via SPINInferences.run , and I'm seeing the same behavior.
When I don't use the function, the query executes correctly.  However
when I reference the function I get no result.  And again, after
registering the function, I am able to retrieve it:
 
SPINModuleRegistry.get().registerAll(spinLibModel.memModel);
Function twoDimFunc = 
 
SPINModuleRegistry.get().getFunction("http://www.boeing.com/IVHM/SpinLib
.owl#twoDimArea <http://www.boeing.com/IVHM/SpinLib.owl#twoDimArea> ",
spinLibModel.memModel);
org.topbraid.spin.model.Query twoDimQuery = twoDimFunc.getBody();
String comment = twoDimFunc.getComment();
System.out.println("Comment for TwoDimArea: " + comment);

but when I build and execute the query that uses the function as
follows, I get no result, while not using the function in the query
yields the correct results:
String selQueryString = "SELECT ?area\n" +
   "WHERE {\n" +
      "?this :width ?width .\n" +
      "?this :height ?height .\n" +
      "LET (?area := SpinLib:twoDimArea(?width, ?height)) .\n" +
   "}";
ARQ2SPIN arq2SPIN = new ARQ2SPIN(spinsquareModel.baseModel);
ARQFactory arqFactory = org.topbraid.spin.system.ARQFactory.get();

//This automagically pre-pends prefix declarations from the model being
queried.
Query arqSelQuery = arqFactory.createQuery(spinsquareModel.memModel,
selQueryString);
org.topbraid.spin.model.Select spinQuery = (Select)
arq2SPIN.createQuery(arqSelQuery, null);
QueryWrapper universalQuery = new QueryWrapper(arqSelQuery,
selQueryString, spinQuery, "Area Function");
QueryExecution qe =
arqFactory.createQueryExecution(universalQuery.getQuery(),
spinsquareModel.memModel);
ResultSet results = qe.execSelect();

It's just strange that I can retrieve the function from the
SPINModuleRegistry but it doesn't seem to be able to execute it.  One
thing is that I'm using the SpinLib model in the call to registerAll
since that's where the function resides, but I'm querying against the
spinsquare model, which imports SpinLib.  Is that ok?
 
btw, is there a way to use the ARQFactory to create a QueryExecution
with a QuerySolutionMap?
 
 thanks!
Jeff

________________________________

From: Holger Knublauch [mailto:hol...@topquadrant.com] 
Sent: Monday, March 30, 2009 6:57 PM
To: topbraid-composer-users@googlegroups.com
Subject: [tbc-users] Re: SPIN API is now open source


Actually, looking deeper once more, I saw that my statement below was
based on another problem in my runtime. I now think the current code is
correct, but is it possible that you pass in a Model into the
registerAll function that does not import the SP namespace? It should be
an OntModel that imports the http://spinrdf.org/sp namespace. If not,
then the system will not know that sp:_arg1 etc are variables, and will
expand them into constants. If this does not work, please send me your
code (possibly off-list). 

Holger



On Mar 30, 2009, at 4:31 PM, Holger Knublauch wrote:


        Hi Jeff, 

        this is another manifestation of the same problem with the
default libraries. I debugged this and saw that - in stand-alone SPIN
API use - the query is again expanded into sp:mul and does not recognize
this as the built-in function *.

        While I will look into changing this for the next release, a
simple work-around is to have your function model import the
http://spinrdf.org/spl namespace and then run the registerAll:

        Model baseModel = ModelFactory.createDefaultModel();
        baseModel.read(...);
        OntModel ontModel =
ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, baseModel);
        SPINModuleRegistry.get().registerAll(ontModel);
        
        

        Thanks for the report,
        Holger


        On Mar 30, 2009, at 2:32 PM, Schmitz, Jeffrey A wrote:


                Continuing with the SPIN API, I've created my own
function (twoDimArea, attached) in my own model (SpinLib.owl).  I have
successfully registered the function using:
        
SPINModuleRegistry.get().registerFunctions(spinLibModel);

                
                I know it was registered because I can call:
                Function twoDimFunc =
spinLibModel.getFunction("http://www.boeing.com/IVHM/SpinLib.owl#twoDimA
rea");

                
                and then I can retrieve and print out the function's
comment.
                
                Then I went back into the spinsquare.n3 model and
changed the spin:rule on the Rectangle class to be reference my new
function:
                 
                # Computes area := width * height
                CONSTRUCT {?this :area ?area .}
                WHERE {
                   ?this :width ?width .
                   ?this :height ?height .
                   LET (?area := SpinLib:twoDimArea(?width, ?height)) .
                }

                
                 Since the twoDimArea function has been registered, I
would expect the call to run the inferences on the spinsquare model to
still work:
                SPINInferences.run(spinsquareOntModel, infmodel, exp,
null, true, null);

                However, it's not returning any inferences.  Note that
changing the CONSTRUCT query back to use LET(?area := ?width * ?height)
does still work.

                Am I missing a step in registering my new function?  Or
is there some other reason the SPINInferences engine isn't able to
execute the new function?

                Thanks,

                Jeff

                <Outlook.jpg>

                
                 
                 
________________________________

                From: Holger Knublauch [mailto:hol...@topquadrant.com] 
                Sent: Thursday, March 26, 2009 7:37 PM
                To: topbraid-composer-users@googlegroups.com
                Subject: [tbc-users] Re: SPIN API is now open source
                
                
                The line below is shown in the examples that come with
the SPIN API download, but I admit this is not obviously pointed out. I
will either make this fact more prominent, or add such a call by default
to make life easier. 

                Holger


                On Mar 26, 2009, at 2:03 PM, Schmitz, Jeffrey A wrote:


                        Nope, missed that part.  That did it though,
thanks!  Looks like great stuff!
                         
                        Jeff

________________________________

                        From: Holger Knublauch
[mailto:hol...@topquadrant.com] 
                        Sent: Thursday, March 26, 2009 3:41 PM
                        To: topbraid-composer-users@googlegroups.com
                        Subject: [tbc-users] Re: SPIN API is now open
source
                        
                        
                        Hi Jeff,

                        did you call this at init time: 
                        
                        
                        // Initialize system functions and templates
                        SPINModuleRegistry.get().init();
                        
                        
                        This will load the spl namespace and the
functions defined therein, including the system functions such as sp:mul
so that the SPIN engine knows that they are abbreviated (e.g. using *).

                        Holger


                        On Mar 26, 2009, at 1:28 PM, Schmitz, Jeffrey A
wrote:



                                Hello,
                                  I finally got a chance to look through
the new SPIN API, and started
                                with trying to run the SPIN rules on the
spinsquare ontology.  I think
                                I'm pretty close, except it's choking on
the line in the spin:rule
                                construct query that uses the
multiplication symbol, i.e.
                                
                                   LET (?area := (?width * ?height)) .
                                
                                Stepping through the code, I can see
that this gets turned into what I
                                would guess must be a property function
named sp:mul:  
                                
                                  LET (?area := sp:mul(?width, ?height))
                                
                                However, I don't think my execution
environment has access to that
                                function and thus the query doesn't
return anything.  Is there any way I
                                could get this function and make it
available to my execution
                                environment, and is that documented
anywhere?  Or is that not part of
                                the release?
                                
                                Thanks!
                                Jeff
                                
                                -----Original Message-----
                                From: Holger Knublauch
[mailto:hol...@topquadrant.com] 
                                Sent: Saturday, March 07, 2009 12:38 PM
                                To:
topbraid-composer-users@googlegroups.com
                                Subject: [tbc-users] SPIN API is now
open source
                                
                                
                                Dear users,
                                
                                we have had several requests from people
who would like to integrate
                                SPIN functionality (SPARQL-based
constraint checking, inferencing,
                                user-defined functions) into their own
applications. In order to
                                encourage the wider adoption of SPIN in
the community, we have therefore
                                decided to make the key features of our
SPIN implementation open source:
                                
        
http://www.topquadrant.com/topbraid/spin/api/
                                The SPIN API is built on Jena and
provides the following features:
                                
                                * Converters between textual SPARQL
syntax and the SPIN RDF
                                Vocabulary
                                * A SPIN-based constraint checking
engine (via spin:constraint)
                                * A SPIN-based inferencing engine (via
spin:rule and
                                spin:constructor)
                                * Support to execute user-defined SPIN
functions using Jena/ARQ
                                * Support to execute user-defined SPIN
templates
                                
                                The license has been selected to allow
open source projects (from
                                universities etc) to use SPIN without
further complications. For closed
                                source users, we offer a commercial
license that also provides business
                                users assurance and support. With this
policy we hope to encourage
                                researchers to provide their (open
source) implementations back to the
                                community to help the SPIN community
grow.
                                
                                The SPIN API is currently in beta, and
the official 1.0 release is
                                scheduled in conjunction with TopBraid
3.0 in the next few weeks. We
                                appreciate your feedback in the
meantime.
                                
                                Kinds regards,
                                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 topbraid-composer-users@googlegroups.com
To unsubscribe from this group, send email to 
topbraid-composer-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/topbraid-composer-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to