You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Martynas Jusevicius <ma...@graphity.org> on 2012/03/26 17:49:21 UTC

Access to OntModel imports from base Model (SPIN-related)

Hey all,

I'm reading an ontology file into OntModel, and it includes imports
which are processed.
It's all fine when I'm operating on the OntModel level. However I need
to pass a certain Resource to the SPIN API, and the statements about
it are both in the base model and in the imported one. If I'm simply
passing that Resource retrieved from the OntModel, SPIN throws an
exception and won't build a Query out of it. I think it's because it
is operating on the Model level and does not see the imports.

Am I possibly right? In that case, what is to be done in such
situation? Should I just manually add the imported Model before
passing Resource to SPIN?
Thanks.

Martynas
graphity.org

Re: Access to OntModel imports from base Model (SPIN-related)

Posted by Martynas Jusevicius <ma...@graphity.org>.
Hey,

sorry Holger... I double-checked everything and found a missing
namespace prefix, because of which the query resource was referenced
incorrectly. Typical :/

Martynas
graphity.org

On Wed, Mar 28, 2012 at 3:04 AM, Holger Knublauch <ho...@knublauch.com> wrote:
> Hi Martynas,
>
> no sorry I still don't see what could be wrong. I look at the source code of
> the SPIN API and in the end it will call ImplementationBytype.canWrap in the
> SPINFactory.asQuery() method. As this is open source, I suggest you step
> through the code in a debugger to see what's going on. Did you step into
> asQuery already?
>
> Thanks
> Holger
>
>
>
>
> On 3/27/2012 20:58, Martynas Jusevicius wrote:
>>
>> Hey Holger,
>>
>> the setup looks pretty much like this:
>>
>>   # base ontology
>>   @base<http://ontology/base/>  .
>>   <>  a owl:Ontology ; owl:imports<http://ontology/imported>  .
>>   <http://localhost/resource>
>>  x:query<http://ontology/imported/SPINResource>  .
>>
>>   # imported ontology
>>   @base<http://ontology/imported/>  .
>>   <>  a owl:Ontology .
>>   <SPINResource>  a sp:Construct ;
>>     sp:templates ( ... # full query goes here, converted with
>> http://spinservices.org/spinrdfconverter.html
>>
>> The SPIN query is referenced in the base ontology, but is actually
>> described in the imported one.
>>
>> Then I load the base ontology into OntModel using OntDocumentManager
>> (import processing set to true), and do this:
>>
>>   SPINFactory.asQuery(
>>
>> getOntModel().getResource("http://localhost/resource").getPropertyResourceValue(X.query)
>>   );
>>
>> I can see that OntResourceImpl of
>> <http://ontology/imported/SPINResource>  is passed here, but asQuery()
>> returns null.
>> Afterwards my own code is throwing an NPE because of that -- SPIN is
>> not throwing any exception, I was incorrect in my previous email.
>> Does this explain something? Wouldn't the solution be for SPINFactory
>> also to accept OntResources? Just guessing.
>>
>> Martynas
>> graphity.org
>>
>> On Tue, Mar 27, 2012 at 1:21 AM, Holger Knublauch<ho...@knublauch.com>
>>  wrote:
>>>
>>> On 3/27/2012 1:49, Martynas Jusevicius wrote:
>>>>
>>>> Hey all,
>>>>
>>>> I'm reading an ontology file into OntModel, and it includes imports
>>>> which are processed.
>>>> It's all fine when I'm operating on the OntModel level. However I need
>>>> to pass a certain Resource to the SPIN API, and the statements about
>>>> it are both in the base model and in the imported one. If I'm simply
>>>> passing that Resource retrieved from the OntModel, SPIN throws an
>>>> exception and won't build a Query out of it.
>>>
>>>
>>> The exception probably has something to do with certain system variables
>>> from the SPIN/SP namespaces not found, so you may be right that it
>>> expects
>>> the full imports at query parsing time.
>>>
>>> What I do not understand why the import resolution does not pick up those
>>> namespaces (as it should), so if my response doesn't help then I need
>>> more
>>> info (stack trace).
>>>
>>>
>>>>  I think it's because it
>>>> is operating on the Model level and does not see the imports.
>>>>
>>>> Am I possibly right? In that case, what is to be done in such
>>>> situation? Should I just manually add the imported Model before
>>>> passing Resource to SPIN?
>>>
>>>
>>> What I sometimes do in such cases is to create yet another MultiUnion
>>> that
>>> imports your model. E.g. (untested)
>>>
>>> MultiUnion union = new MultiUnion(new Graph[] {
>>>    myQueryModel.getGraph(),
>>>    SP.getModel().getGraph(),
>>>    SPIN.getModel().getGraph()
>>> });
>>> Model newModel = ModelFactory.createModelForGraph(union);
>>>
>>> Then parse the SPIN queries based on newModel.
>>>
>>> HTH
>>> Holger
>>>
>

Re: Access to OntModel imports from base Model (SPIN-related)

Posted by Holger Knublauch <ho...@knublauch.com>.
Hi Martynas,

no sorry I still don't see what could be wrong. I look at the source 
code of the SPIN API and in the end it will call 
ImplementationBytype.canWrap in the SPINFactory.asQuery() method. As 
this is open source, I suggest you step through the code in a debugger 
to see what's going on. Did you step into asQuery already?

Thanks
Holger



On 3/27/2012 20:58, Martynas Jusevicius wrote:
> Hey Holger,
>
> the setup looks pretty much like this:
>
>    # base ontology
>    @base<http://ontology/base/>  .
>    <>  a owl:Ontology ; owl:imports<http://ontology/imported>  .
>    <http://localhost/resource>  x:query<http://ontology/imported/SPINResource>  .
>
>    # imported ontology
>    @base<http://ontology/imported/>  .
>    <>  a owl:Ontology .
>    <SPINResource>  a sp:Construct ;
>      sp:templates ( ... # full query goes here, converted with
> http://spinservices.org/spinrdfconverter.html
>
> The SPIN query is referenced in the base ontology, but is actually
> described in the imported one.
>
> Then I load the base ontology into OntModel using OntDocumentManager
> (import processing set to true), and do this:
>
>    SPINFactory.asQuery(
>      getOntModel().getResource("http://localhost/resource").getPropertyResourceValue(X.query)
>    );
>
> I can see that OntResourceImpl of
> <http://ontology/imported/SPINResource>  is passed here, but asQuery()
> returns null.
> Afterwards my own code is throwing an NPE because of that -- SPIN is
> not throwing any exception, I was incorrect in my previous email.
> Does this explain something? Wouldn't the solution be for SPINFactory
> also to accept OntResources? Just guessing.
>
> Martynas
> graphity.org
>
> On Tue, Mar 27, 2012 at 1:21 AM, Holger Knublauch<ho...@knublauch.com>  wrote:
>> On 3/27/2012 1:49, Martynas Jusevicius wrote:
>>> Hey all,
>>>
>>> I'm reading an ontology file into OntModel, and it includes imports
>>> which are processed.
>>> It's all fine when I'm operating on the OntModel level. However I need
>>> to pass a certain Resource to the SPIN API, and the statements about
>>> it are both in the base model and in the imported one. If I'm simply
>>> passing that Resource retrieved from the OntModel, SPIN throws an
>>> exception and won't build a Query out of it.
>>
>> The exception probably has something to do with certain system variables
>> from the SPIN/SP namespaces not found, so you may be right that it expects
>> the full imports at query parsing time.
>>
>> What I do not understand why the import resolution does not pick up those
>> namespaces (as it should), so if my response doesn't help then I need more
>> info (stack trace).
>>
>>
>>>   I think it's because it
>>> is operating on the Model level and does not see the imports.
>>>
>>> Am I possibly right? In that case, what is to be done in such
>>> situation? Should I just manually add the imported Model before
>>> passing Resource to SPIN?
>>
>> What I sometimes do in such cases is to create yet another MultiUnion that
>> imports your model. E.g. (untested)
>>
>> MultiUnion union = new MultiUnion(new Graph[] {
>>     myQueryModel.getGraph(),
>>     SP.getModel().getGraph(),
>>     SPIN.getModel().getGraph()
>> });
>> Model newModel = ModelFactory.createModelForGraph(union);
>>
>> Then parse the SPIN queries based on newModel.
>>
>> HTH
>> Holger
>>


Re: Access to OntModel imports from base Model (SPIN-related)

Posted by Martynas Jusevicius <ma...@graphity.org>.
Hey Holger,

the setup looks pretty much like this:

  # base ontology
  @base <http://ontology/base/> .
  <> a owl:Ontology ; owl:imports <http://ontology/imported> .
  <http://localhost/resource> x:query <http://ontology/imported/SPINResource> .

  # imported ontology
  @base <http://ontology/imported/> .
  <> a owl:Ontology .
  <SPINResource> a sp:Construct ;
    sp:templates ( ... # full query goes here, converted with
http://spinservices.org/spinrdfconverter.html

The SPIN query is referenced in the base ontology, but is actually
described in the imported one.

Then I load the base ontology into OntModel using OntDocumentManager
(import processing set to true), and do this:

  SPINFactory.asQuery(
    getOntModel().getResource("http://localhost/resource").getPropertyResourceValue(X.query)
  );

I can see that OntResourceImpl of
<http://ontology/imported/SPINResource> is passed here, but asQuery()
returns null.
Afterwards my own code is throwing an NPE because of that -- SPIN is
not throwing any exception, I was incorrect in my previous email.
Does this explain something? Wouldn't the solution be for SPINFactory
also to accept OntResources? Just guessing.

Martynas
graphity.org

On Tue, Mar 27, 2012 at 1:21 AM, Holger Knublauch <ho...@knublauch.com> wrote:
> On 3/27/2012 1:49, Martynas Jusevicius wrote:
>>
>> Hey all,
>>
>> I'm reading an ontology file into OntModel, and it includes imports
>> which are processed.
>> It's all fine when I'm operating on the OntModel level. However I need
>> to pass a certain Resource to the SPIN API, and the statements about
>> it are both in the base model and in the imported one. If I'm simply
>> passing that Resource retrieved from the OntModel, SPIN throws an
>> exception and won't build a Query out of it.
>
>
> The exception probably has something to do with certain system variables
> from the SPIN/SP namespaces not found, so you may be right that it expects
> the full imports at query parsing time.
>
> What I do not understand why the import resolution does not pick up those
> namespaces (as it should), so if my response doesn't help then I need more
> info (stack trace).
>
>
>>  I think it's because it
>> is operating on the Model level and does not see the imports.
>>
>> Am I possibly right? In that case, what is to be done in such
>> situation? Should I just manually add the imported Model before
>> passing Resource to SPIN?
>
>
> What I sometimes do in such cases is to create yet another MultiUnion that
> imports your model. E.g. (untested)
>
> MultiUnion union = new MultiUnion(new Graph[] {
>    myQueryModel.getGraph(),
>    SP.getModel().getGraph(),
>    SPIN.getModel().getGraph()
> });
> Model newModel = ModelFactory.createModelForGraph(union);
>
> Then parse the SPIN queries based on newModel.
>
> HTH
> Holger
>

Re: Access to OntModel imports from base Model (SPIN-related)

Posted by Holger Knublauch <ho...@knublauch.com>.
On 3/27/2012 1:49, Martynas Jusevicius wrote:
> Hey all,
>
> I'm reading an ontology file into OntModel, and it includes imports
> which are processed.
> It's all fine when I'm operating on the OntModel level. However I need
> to pass a certain Resource to the SPIN API, and the statements about
> it are both in the base model and in the imported one. If I'm simply
> passing that Resource retrieved from the OntModel, SPIN throws an
> exception and won't build a Query out of it.

The exception probably has something to do with certain system variables 
from the SPIN/SP namespaces not found, so you may be right that it 
expects the full imports at query parsing time.

What I do not understand why the import resolution does not pick up 
those namespaces (as it should), so if my response doesn't help then I 
need more info (stack trace).

>   I think it's because it
> is operating on the Model level and does not see the imports.
>
> Am I possibly right? In that case, what is to be done in such
> situation? Should I just manually add the imported Model before
> passing Resource to SPIN?

What I sometimes do in such cases is to create yet another MultiUnion 
that imports your model. E.g. (untested)

MultiUnion union = new MultiUnion(new Graph[] {
     myQueryModel.getGraph(),
     SP.getModel().getGraph(),
     SPIN.getModel().getGraph()
});
Model newModel = ModelFactory.createModelForGraph(union);

Then parse the SPIN queries based on newModel.

HTH
Holger