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:[email protected]]
Sent: Monday, March 30, 2009 6:57 PM
To: [email protected]
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:[email protected]]
Sent: Thursday, March 26, 2009 7:37 PM
To: [email protected]
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:[email protected]]
Sent: Thursday, March 26, 2009 3:41 PM
To: [email protected]
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:[email protected]]
Sent: Saturday, March 07, 2009 12:38 PM
To:
[email protected]
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 [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
-~----------~----~----~----~------~----~------~--~---