I ended up using JenaUtil.getAllSuperClasses() from SPINRDF:
https://github.com/spinrdf/spinrdf/blob/a7fc9a1ca7badecb9a8d858f7a8a33bb106e629f/src/main/java/org/spinrdf/util/JenaUtil.java#L401

On Wed, Oct 25, 2017 at 1:22 PM, Martynas Jusevičius <marty...@atomgraph.com
> wrote:

> Dave,
>
> I think I get it now. As you mention, we do not include subClassOf closure
> during materialization, as the size grows but most of the inferences are
> irrelevant.
>
> So we only have direct relationships in the data but are in fact looking
> for an inferred one, which is not there.
>
> On Wed, Oct 25, 2017 at 12:36 PM, Dave Reynolds <dave.e.reyno...@gmail.com
> > wrote:
>
>> On 25/10/17 11:10, George News wrote:
>>
>>> On 2017-10-25 11:54, Dave Reynolds wrote:
>>>
>>>> Hi Martynas,
>>>>
>>>> On 25/10/17 10:33, Martynas Jusevičius wrote:
>>>>
>>>>> Thanks Dave.
>>>>>
>>>>> We are materializing inferences during ontology initialization to avoid
>>>>> using reasoner subsequently (as it impacts performance).
>>>>>
>>>>
>>>> Makes sense.
>>>>
>>>> So in that case I need to traverse the chain myself, correct?
>>>>>
>>>>
>>>> Not if you've materialized the inferences. If you have constructed the
>>>> superClass closure as part of this materialization then the closure
>>>> should be visible through the OntAPI.
>>>>
>>>> If you haven't included that in your materialization then indeed you
>>>> would need to traverse the chain yourself - either in the API or via
>>>> SPARQL property paths.
>>>>
>>>
>>> What do you mean by materialize the inferences of subClass?
>>>
>>
>> That's not quite the way I phrased it.
>>
>> All I meant was that the reasoners will in effect compute
>>
>> (?a rdfs:subClassOf ?b) (?b rdfs:subClassOf ?c)
>>      -> (?a rdfs:subClassOf ?c)
>>
>> [Though technically the builtin reasoners don't use rules for that.]
>>
>> So if Martynas wants the OntClass.listSuperClasses query to work as he
>> expected then he would need to include that in the materialization.
>>
>> So, as you say, it would include things like:
>>
>> ClassChild rdf:subClassOf ClassParent
>> ClassChildChild rdf:subClassOf ClassParent
>> ClassChildChild rdf:subClassOf ClassChild
>>
>> It is clear
>>> that you include the inferences for the individuals, like:
>>>
>>> individual rdf:type ClassParent
>>> individual rdf:type ClassChild
>>> individual rdf:type ClassChildChild
>>>
>>> But if I also include the materialization for the class definition, at
>>> the end, I'm including the "full" ontology model.
>>>
>>> ClassChild rdf:subClassOf ClassParent
>>> ClassChildChild rdf:subClassOf ClassParent
>>> ClassChildChild rdf:subClassOf ClassChild
>>>
>>> Do you recommend to also include the second step?
>>>
>> To use the standard refrain "it depends what you are specifically trying
>> to do".
>>
>> The benefit is that you can get all superclasses with a simple query. The
>> cost, apart from some size growth, is that finding direct superclasses
>> becomes very painful. Which is why the built in reasoners have the support
>> for "direct" versions which is then exposed in the OntAPI via all the
>> "direct" flags. That distinction can get lost in the materialization.
>>
>> Personally I would not include the subClassOf closure if materializing
>> but would rely on query rewriting to such questions on demand. YMMV
>>
>> Dave
>>
>>
>>> I'm involved in a similar procedure as Martynas.
>>>
>>> Thanks
>>> Jorge
>>>
>>>
>>>
>>> Dave
>>>>
>>>>
>>>> On Wed, Oct 25, 2017 at 9:33 AM, Dave Reynolds
>>>>> <dave.e.reyno...@gmail.com>
>>>>> wrote:
>>>>>
>>>>> On 24/10/17 23:51, Martynas Jusevičius wrote:
>>>>>>
>>>>>> Hi,
>>>>>>>
>>>>>>> I thought I understood how OntClass.listSuperClasses() works, but
>>>>>>> maybe I
>>>>>>> don't.
>>>>>>>
>>>>>>> I have such a class structure in my ontology (superclass is at the
>>>>>>> top):
>>>>>>>
>>>>>>> 3. https://www.w3.org/ns/ldt/document-hierarchy/domain#Item
>>>>>>>        2. http://atomgraph.com/ns/platform/domain#Item
>>>>>>>            1. https://localhost/admin/ns#AgentItem
>>>>>>>
>>>>>>> Yet when I'm debugging, I can see the pair-wise relationships, but
>>>>>>> not the
>>>>>>> chain all the way up from 1 to 3:
>>>>>>>
>>>>>>> 1. getOntology().getOntModel().getOntClass("
>>>>>>> https://localhost/admin/ns#AgentItem
>>>>>>> ").listSuperClasses(false).toList().toString()
>>>>>>>
>>>>>>> [https://localhost/admin/ns#ItemOfAgentContainer,
>>>>>>> http://atomgraph.com/ns/platform/domain#Item]
>>>>>>>
>>>>>>> 2. getOntology().getOntModel().getOntClass("
>>>>>>> http://atomgraph.com/ns/platform/domain#Item
>>>>>>> ").listSuperClasses(false).toList().toString()
>>>>>>>
>>>>>>> [https://www.w3.org/ns/ldt/document-hierarchy/domain#Item]
>>>>>>>
>>>>>>> I can see that within the method hasPropertyValue(
>>>>>>> getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF", cls ) returns false.
>>>>>>>
>>>>>>> Why is that so? Is my usage wrong?
>>>>>>>
>>>>>>> Additional info:
>>>>>>> getOntology().getOntModel().getSpecification().getProfile() ==
>>>>>>> OWLProfile
>>>>>>> getOntology().getOntModel().getSpecification().getReasoner() == null
>>>>>>>
>>>>>>>
>>>>>>> If I recall correctly the OntModel API is designed to retrieve
>>>>>> whatever is
>>>>>> stated within the underlying model. The notion was that there was no
>>>>>> point
>>>>>> in having the OntModel API replicate what reasoning does.
>>>>>>
>>>>>> So to see the subclass closure you need to have a sufficient reasoner
>>>>>> configured.
>>>>>>
>>>>>>
>>>>>> Dave
>>>>>>
>>>>>>
>>>>>
>>>>
>

Reply via email to