You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Jakub Jałowiec <j....@student.uw.edu.pl> on 2021/12/05 14:38:44 UTC

OWL inferences in Apache Jena (for e.g. owl:allValuesFrom)

Hi,
I have an OWL ontology
https://github.com/kubajal/covidepid/blob/main/minimal_test.ttl.
The ontology has the following definitions:

>
>    - Person
>       - CatPerson (subClassOf Person + CatPerson equivalentTo hasPet only
>       Cat)
>    - Animal
>       - Cat (subClassOf Animal)
>    - hasPet: Person -> Animal
>
> and the following instances:

>
>    - person_1: Person and (hasPet only {cat_1})
>    - cat_1: Cat
>    - hasPet(person_1, cat_1)
>
> I am using Apache Jena Fuseki 4.2.0 with the OWLFBRuleReasoner reasoner
(link to the configuration:
https://github.com/kubajal/covidepid/blob/main/minimal_test_config.ttl).

I am executing the following query in Fuseki:

> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> PREFIX myOnt: <
> http://www.semanticweb.org/kubajal/ontologies/2021/11/untitled-ontology-157/
> >

SELECT ?s {
> ?s rdf:type myOnt:CatPerson .
> }


No results are returned whereas I would expect person_1 to be returned (as
it is the case in e.g. Protege using Pellet).
I am using
https://jena.apache.org/documentation/ontology/#more-complex-class-expressions
as documentation which says that the "all values from" construct is
supported  (so e.g. "CatPerson equivalentTo hasPet only Cat" should work).
Am I missing something?

Best regards,
Jakub

Re: OWL inferences in Apache Jena (for e.g. owl:allValuesFrom)

Posted by Steve Vestal <st...@adventiumlabs.com>.
Which reasoner are you using?  Have you tried openllet (Pellet for Jena) 
to see if you get the desired result?

Out of curiosity, what notation (ontology syntax) are you using here?

On 12/5/2021 8:38 AM, Jakub Jałowiec wrote:
> Hi,
> I have an OWL ontology
> https://github.com/kubajal/covidepid/blob/main/minimal_test.ttl.
> The ontology has the following definitions:
>
>>     - Person
>>        - CatPerson (subClassOf Person + CatPerson equivalentTo hasPet only
>>        Cat)
>>     - Animal
>>        - Cat (subClassOf Animal)
>>     - hasPet: Person -> Animal
>>
>> and the following instances:
>>     - person_1: Person and (hasPet only {cat_1})
>>     - cat_1: Cat
>>     - hasPet(person_1, cat_1)
>>
>> I am using Apache Jena Fuseki 4.2.0 with the OWLFBRuleReasoner reasoner
> (link to the configuration:
> https://github.com/kubajal/covidepid/blob/main/minimal_test_config.ttl).
>
> I am executing the following query in Fuseki:
>
>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>> PREFIX myOnt: <
>> http://www.semanticweb.org/kubajal/ontologies/2021/11/untitled-ontology-157/
> SELECT ?s {
>> ?s rdf:type myOnt:CatPerson .
>> }
>
> No results are returned whereas I would expect person_1 to be returned (as
> it is the case in e.g. Protege using Pellet).
> I am using
> https://jena.apache.org/documentation/ontology/#more-complex-class-expressions
> as documentation which says that the "all values from" construct is
> supported  (so e.g. "CatPerson equivalentTo hasPet only Cat" should work).
> Am I missing something?
>
> Best regards,
> Jakub
>

Re: Re: OWL inferences in Apache Jena (for e.g. owl:allValuesFrom)

Posted by Jakub Jałowiec <j....@student.uw.edu.pl>.
Hello,
thanks for all the suggestions.

It seems that the issue here was indeed lack of support of owl:oneOf and
not owl:allValuesFrom as I initially thought. Here is the relevant part of
the OWL file where both constructs are present (for future reference):

<myOnt/person_1> rdf:type owl:NamedIndividual ,
>                           <myOnt/Person> ,
>                           [ rdf:type owl:Restriction ;
>                             owl:onProperty <myOnt/hasPet> ;
>                             *owl:allValuesFrom* [ rdf:type owl:Class ;
>                                     *owl:oneOf* ( <myOnt/cat_1>)
>                                   ]
>                           ] ;
>                  <myOnt/hasPet> <myOnt/cat_1> .


Thanks for pointing that out.

On the other hand I could replace

owl:oneOf ( <myOnt/cat_1>)


with

owl:cardinality "1"^^xsd:nonNegativeInteger"


owl:cardinality with cardinality <= 1 is supported by Jena according to the
docs at https://jena.apache.org/documentation/inference/#owl.
Unfortunately, "select ?p where {?p rdf:type myOnt:CatPerson}" still does
not yield person_1 in Jena in that case. Why? Is it because owl:cardinality
restriction is used here on an individual and not on a class and that is
something which is not supported by Jena? I couldn't find anything on that
in the docs. Though I am also not sure if OWL 1.1 supports owl:cardinality
on individuals.

Fundamentally, my question would be: how do I "close the world" in Jena for
individuals so person_1 gets inferred to be of CatPerson class?

Best regards,
Jakub

PS. In the first post I was using an ad-hoc notation but it led to
unnecessary confusion. Next time I'll just post raw Protege output (e.g. in
Turtle). Regarding Openlet, it would be great to work with OWL2.
Unfortunately I do not have time to look into its integration with Jena. As
I understand it, OWL 1.1 is sufficient enough to express equivalency
between a class and an anonymous class that uses complex expressions
containing owl:oneOf, owl:allValuesFrom and owl:cardinality.

pon., 6 gru 2021 o 07:18 Lorenz Buehmann <bu...@informatik.uni-leipzig.de>
napisał(a):
>
>   @Steve
>
> > Which reasoner are you using?  Have you tried openllet (Pellet for
> > Jena) to see if you get the desired result?
> works only with Jena 3.X
>
> > Which reasoner are you using?  Have you tried openllet (Pellet for
> > Jena) to see if you get the desired result?
> that look like a mix of Manchester OWL syntax and DL syntax. At least
> it's no standard notation
>
>
> @Luis
>
> On 06.12.21 06:25, Luis Enrique Ramos García wrote:
> >
> > The point here, and hope to be corrected by anybody else if I am wrong,
is
> > that you are using sparql, which is rdf based. Then, you can only query
> >
> > asserted, not inferred knowledge.
> In Jena you can run SPARQL queries on a model that is backed by some
> inference mechanism.
> >
> > Some engines like blazegraph, let you add owl reasoning, and then you
can
> > use the transitive feature of owl  (comment only as example).
> >
> > I do not know whether or not fuseki can be configured in such a way.
>
> The TE is already using a reasoner. But expressivity depends on the
> reasoner. For full OWL DL reasoning the only Jena compatible reasoner is
> Pellet, but the original code is only on Jena 2.X and the Openllet fork
> is Jena 3.X -
>
> But, and now we come to the example. The Jena docs say that
>
> > The critical constructs which go beyond OWL/lite and are not supported
> > in the Jena OWL reasoner are complementOf and oneOf.
>
> the lack of support for  "oneOf" class expression (the {cat_1} is such a
> thing) which in fact means the inference is not supported by Jena
> built-in reasoners.
>
> You can try with Jena 3.X + Openllet. Or you fork Openllet and bump to
> Jena 4.X, but I guess this needs some migration of code then.
>
> >
> >
> > Luis Ramos
> >
> >
> > El dom, 5 dic 2021 a las 15:38, Jakub Jałowiec (<
> > j.jalowiec@student.uw.edu.pl>) escribió:
> >
> >> Hi,
> >> I have an OWL ontology
> >> https://github.com/kubajal/covidepid/blob/main/minimal_test.ttl.
> >> The ontology has the following definitions:
> >>
> >>>     - Person
> >>>        - CatPerson (subClassOf Person + CatPerson equivalentTo hasPet
only
> >>>        Cat)
> >>>     - Animal
> >>>        - Cat (subClassOf Animal)
> >>>     - hasPet: Person -> Animal
> >>>
> >>> and the following instances:
> >>>     - person_1: Person and (hasPet only {cat_1})
> >>>     - cat_1: Cat
> >>>     - hasPet(person_1, cat_1)
> >>>
> >>> I am using Apache Jena Fuseki 4.2.0 with the OWLFBRuleReasoner
reasoner
> >> (link to the configuration:
> >> https://github.com/kubajal/covidepid/blob/main/minimal_test_config.ttl
).
> >>
> >> I am executing the following query in Fuseki:
> >>
> >>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> >>> PREFIX myOnt: <
> >>>
> >>
http://www.semanticweb.org/kubajal/ontologies/2021/11/untitled-ontology-157/
> >> SELECT ?s {
> >>> ?s rdf:type myOnt:CatPerson .
> >>> }
> >>
> >> No results are returned whereas I would expect person_1 to be returned
(as
> >> it is the case in e.g. Protege using Pellet).
> >> I am using
> >>
> >>
https://jena.apache.org/documentation/ontology/#more-complex-class-expressions
> >> as documentation which says that the "all values from" construct is
> >> supported  (so e.g. "CatPerson equivalentTo hasPet only Cat" should
work).
> >> Am I missing something?
> >>
> >> Best regards,
> >> Jakub
> >>

Re: Re: OWL inferences in Apache Jena (for e.g. owl:allValuesFrom)

Posted by Lorenz Buehmann <bu...@informatik.uni-leipzig.de>.
  @Steve

> Which reasoner are you using?  Have you tried openllet (Pellet for 
> Jena) to see if you get the desired result?
works only with Jena 3.X

> Which reasoner are you using?  Have you tried openllet (Pellet for 
> Jena) to see if you get the desired result?
that look like a mix of Manchester OWL syntax and DL syntax. At least 
it's no standard notation


@Luis

On 06.12.21 06:25, Luis Enrique Ramos García wrote:
>
> The point here, and hope to be corrected by anybody else if I am wrong, is
> that you are using sparql, which is rdf based. Then, you can only query
>
> asserted, not inferred knowledge.
In Jena you can run SPARQL queries on a model that is backed by some 
inference mechanism.
>
> Some engines like blazegraph, let you add owl reasoning, and then you can
> use the transitive feature of owl  (comment only as example).
>
> I do not know whether or not fuseki can be configured in such a way.

The TE is already using a reasoner. But expressivity depends on the 
reasoner. For full OWL DL reasoning the only Jena compatible reasoner is 
Pellet, but the original code is only on Jena 2.X and the Openllet fork 
is Jena 3.X -

But, and now we come to the example. The Jena docs say that

> The critical constructs which go beyond OWL/lite and are not supported 
> in the Jena OWL reasoner are complementOf and oneOf.

the lack of support for  "oneOf" class expression (the {cat_1} is such a 
thing) which in fact means the inference is not supported by Jena 
built-in reasoners.

You can try with Jena 3.X + Openllet. Or you fork Openllet and bump to 
Jena 4.X, but I guess this needs some migration of code then.

>
>
> Luis Ramos
>
>
> El dom, 5 dic 2021 a las 15:38, Jakub Jałowiec (<
> j.jalowiec@student.uw.edu.pl>) escribió:
>
>> Hi,
>> I have an OWL ontology
>> https://github.com/kubajal/covidepid/blob/main/minimal_test.ttl.
>> The ontology has the following definitions:
>>
>>>     - Person
>>>        - CatPerson (subClassOf Person + CatPerson equivalentTo hasPet only
>>>        Cat)
>>>     - Animal
>>>        - Cat (subClassOf Animal)
>>>     - hasPet: Person -> Animal
>>>
>>> and the following instances:
>>>     - person_1: Person and (hasPet only {cat_1})
>>>     - cat_1: Cat
>>>     - hasPet(person_1, cat_1)
>>>
>>> I am using Apache Jena Fuseki 4.2.0 with the OWLFBRuleReasoner reasoner
>> (link to the configuration:
>> https://github.com/kubajal/covidepid/blob/main/minimal_test_config.ttl).
>>
>> I am executing the following query in Fuseki:
>>
>>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>> PREFIX myOnt: <
>>>
>> http://www.semanticweb.org/kubajal/ontologies/2021/11/untitled-ontology-157/
>> SELECT ?s {
>>> ?s rdf:type myOnt:CatPerson .
>>> }
>>
>> No results are returned whereas I would expect person_1 to be returned (as
>> it is the case in e.g. Protege using Pellet).
>> I am using
>>
>> https://jena.apache.org/documentation/ontology/#more-complex-class-expressions
>> as documentation which says that the "all values from" construct is
>> supported  (so e.g. "CatPerson equivalentTo hasPet only Cat" should work).
>> Am I missing something?
>>
>> Best regards,
>> Jakub
>>

Re: OWL inferences in Apache Jena (for e.g. owl:allValuesFrom)

Posted by Luis Enrique Ramos García <lu...@googlemail.com.INVALID>.
Hi,

If I properly understand your notation, you are try to obtain an instance
as an inferred class.

In this case is CatPerson, a person who only has a pet of kind cat.

And, as I see you defined person_1, and you say he has a cat, then you
expect the system to infer he is a cat person, and return person_1 to you.

The point here, and hope to be corrected by anybody else if I am wrong, is
that you are using sparql, which is rdf based. Then, you can only query

asserted, not inferred knowledge.

Some engines like blazegraph, let you add owl reasoning, and then you can
use the transitive feature of owl  (comment only as example).

I do not know whether or not fuseki can be configured in such a way.


Luis Ramos


El dom, 5 dic 2021 a las 15:38, Jakub Jałowiec (<
j.jalowiec@student.uw.edu.pl>) escribió:

> Hi,
> I have an OWL ontology
> https://github.com/kubajal/covidepid/blob/main/minimal_test.ttl.
> The ontology has the following definitions:
>
> >
> >    - Person
> >       - CatPerson (subClassOf Person + CatPerson equivalentTo hasPet only
> >       Cat)
> >    - Animal
> >       - Cat (subClassOf Animal)
> >    - hasPet: Person -> Animal
> >
> > and the following instances:
>
> >
> >    - person_1: Person and (hasPet only {cat_1})
> >    - cat_1: Cat
> >    - hasPet(person_1, cat_1)
> >
> > I am using Apache Jena Fuseki 4.2.0 with the OWLFBRuleReasoner reasoner
> (link to the configuration:
> https://github.com/kubajal/covidepid/blob/main/minimal_test_config.ttl).
>
> I am executing the following query in Fuseki:
>
> > PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> > PREFIX myOnt: <
> >
> http://www.semanticweb.org/kubajal/ontologies/2021/11/untitled-ontology-157/
> > >
>
> SELECT ?s {
> > ?s rdf:type myOnt:CatPerson .
> > }
>
>
> No results are returned whereas I would expect person_1 to be returned (as
> it is the case in e.g. Protege using Pellet).
> I am using
>
> https://jena.apache.org/documentation/ontology/#more-complex-class-expressions
> as documentation which says that the "all values from" construct is
> supported  (so e.g. "CatPerson equivalentTo hasPet only Cat" should work).
> Am I missing something?
>
> Best regards,
> Jakub
>