You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Dave Reynolds <da...@gmail.com> on 2011/09/01 11:38:12 UTC

RE: owl restriction question

Hi David,

If you want to represent each diagnosis as a class and not have a
corresponding prototypical instance of the class then your best bet is
to treat the class a "class of people with that diagnosis" rather than a
class of diagnoses. So you would have something like:

:SET1 owl:unionOf (B1 C1) .

:p1 a B1 .
:p2 a C1 .

:PatientSubset1 rdfs:subClassOf :Patient, :SET1 .


If you want to have a :diagnosis property to relate an
individual :Patient to a diagnosis then the each instance of
the :diagnosis relation must be an individual (i.e. and instance of the
diagnosis class). An expression like:

  :p1 :diagnosis :C1 .

is not legal in OWL 1 DL (it puts you into OWL/full which is OK for jena
but doesn't give the entailments you are after). It is legal in OWL 2 DL
thanks to punning but again the punning means you don't get the
entailments you want.

If you *really* want a :diagnosis relation (rather than using the
rdf:type relation between individual patients and the diagnosis class)
and *really* don't want to use individuals like c1 in:

  :c1 a C1 .
  :p1 :diagnosis :c1 .

Then I can think of only two options. One is to do exactly that but use
bNodes to avoid having to predefine the prototypical instances:

   :p1 :diagnosis [a :C1] .

The other is to do your reasoning through custom rules.

Dave



On Tue, 2011-08-30 at 17:24 +0000, David Jordan wrote: 
> In my application, there is an ontology defined with a hierarchy similar to the A, Bs, and Cs found in my original email (see below).
> These happen to be ICD9 diagnosis codes, each represented by a CLASS, not an instance.
> A Patient may have one or more associated diagnosis, so they would be associated with these diagnosis CLASSES.
> 
> Ideally, I can define one or more sets, which contain a list of particular diagnosis CLASSES.
> Assume for discussion, I have one such set called :SET1.
> For the patients, I want to see which patients have a diagnosis that is an element in SET1.
> 
> :PatientSubset1 rdfs:subClassOf :Patient ;
> 	owl:equivalentClass [
> 		a owl:Restriction ;
> 		owl:onProperty :diagnosis ;
> 		owl:someValuesFrom :SET1
> 	] .
> 
> And I also want subclass relationships to apply, such that if SET1 has :B1, and :C1 rdf:subClass :B1
> And  there is the triple
> :p1 rdf:type Patient ;
> 	:diagnosis C1 .
> 
> Then since SET1 contains the class :B1, I would want :p1 to be in the result.
> 
> But I have been told that owl:someValuesFrom only works on instances, not classes.
> But I need to restrict the set of Patients based on a property being a member of a set of classes.
> Maybe there is some way of doing this with set intersection facilities, where the predicate asks whether the intersection of the patient's diagnosis and my particular set of diagnosis is empty or not, but that would not be as efficient as someValuesFrom, which can return true/false once the first match is found.
> 
> To summarize, I need to do this restriction on classes, but also have the classes take into account the subclass relationships.
> Is there a way of doing this in OWL? In a way that will be efficient?
> 
> 
> -----Original Message-----
> From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com] 
> Sent: Monday, August 29, 2011 5:10 PM
> To: jena-users@incubator.apache.org
> Subject: Re: owl restriction question
> 
> On Mon, 2011-08-29 at 17:40 +0000, David Jordan wrote: 
> > I have a question about accessing instances of a restriction class. Below I have a simple ontology, followed by some Jena Java code. My issue is that the class PatientSubset1 is reporting it has no instances. Can you see what I have done wrong?
> 
> There are at least a couple of problems here ...
> 
> > @prefix rdf:	<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> > @prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
> > @prefix owl:	<http://www.w3.org/2002/07/owl#> .
> > @prefix : 	<http://example.org/ex1#> .
> > 
> > :A a owl:Class .
> > 
> > :B1 a owl:Class ;
> > 	rdfs:subClassOf :A .
> > 
> > :B2 a owl:Class ;
> > 	rdfs:subClassOf :A .
> > 
> > :C1 a owl:Class ;
> > 	rdfs:subClassOf :B1 .
> > 
> > :C2 a owl:Class ;
> > 	rdfs:subClassOf :B1 .
> > 
> > :C3 a owl:Class ;
> > 	rdfs:subClassOf :B2 .
> > 
> > :C4 a owl:Class ;
> > 	rdfs:subClassOf :B2 .
> > 
> > :b1 rdf:type :B1 .
> > 
> > :Set1 a owl:Class ;
> > 	owl:distinctMembers (:b1) .
> > 
> > :Patient a owl:Class ;
> > 	rdfs:label "Patient" .
> > 
> > :p1 rdf:type :Patient .
> > :p2 rdf:type :Patient .
> > :p3 rdf:type :Patient .
> > 
> > :p1 :diagnosis :B1 .
> > :p2 :diagnosis :C1 .
> 
> The :diagnosis assertions should point to an instance, e.g. :b1, not the classes. 
> 
> > :PatientSubset1 rdfs:subClassOf :Patient ;
> > 	a [
> > 		a owl:Restriction ;
> > 		owl:onProperty :diagnosis ;
> > 		owl:someValuesFrom (:B1)
> > 	] .
> > 
> > 
> > 		OntModel omodel = ModelFactory.createOntologyModel();
> 
> If you want OWL inference then you need to specify an appropriate configuration such as OntModelSpec.OWL_MEM_MICRO_RULE_INF 
> 
> Dave
> 
> 
> > 		InputStream in = FileManager.get().open(fileName);
> > 		omodel.read(in, baseName, "TURTLE");
> > 		String fulluri = baseName + className;
> > 		OntClass oclass = omodel.getOntClass(fulluri);
> > 		System.out.println("Class is " + oclass.getURI()); System.out.flush();
> > 		ExtendedIterator<? extends OntResource> iter = oclass.listInstances();
> > 		while( iter.hasNext() ){
> > 			OntResource res = iter.next();
> > 			String uri = res.getURI();
> > 			System.out.println(uri);
> > 		}
> > 
> > Any ideas why this is not returning any instances? I would expect the resulting instances to include :p1 and :p2.
> 
> 
> 
> 
> 




RE: owl restriction question

Posted by David Jordan <Da...@sas.com>.
Thanks, I already went down the path of defining a "singleton" for each class.


-----Original Message-----
From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com] 
Sent: Thursday, September 01, 2011 10:19 AM
To: jena-users@incubator.apache.org
Subject: RE: owl restriction question

Hi David,

Why do you need to enforce that the diagnosis prototypical instances are unique and distinct?

If all your reasoning is done by which class those instances are members of then it actually doesn't matter whether you have one or more instances. Indeed my bNode suggestion creates a new instance for each diagnosis.

The basic answer is that owl:AllDifferent is horribly expensive in Jena, at least with the default rule based reasoners. By the specs it entails a quadratic set of owl:differentFrom assertions between pairs of individuals. So if you have O(10^4) individuals in the AllDifferent then rule closure will try to materialize O(10^8) differentFrom entailments.

It may be that other reasoners like Pellet have more optimized handling of such cases. Certainly reasoning over large medical ontologies was one of the driving forces behind the OWL profiles like EL and QL and the associated specialized reasoners.

Dave


On Thu, 2011-09-01 at 13:08 +0000, David Jordan wrote: 
> Since our last correspondence, I have headed in the direction of having a singleton for each diagnosis class. I'll be looking for a way of declaring the singleton in a manner that enforces it to be the only instance, I have never seen examples for how to do that in OWL. Also, it is my understanding of the non-unique naming assumption that to force the reasoned to "know" that each of these singleton instances is different from one another, I have to use some like the following:
> 
> [a owl:AllDifferent ;
> 	owl:distinctMembers (:a :b1 :b2 :c1 :c2 :c3 :c4)].
> 
> In my real application (which uses ICD9 codes instead of these toy A, Bs, and Cs), there are tens of thousands of classes and thus singletons. Will Jena be able to handle a list of instances that has this large a cardinality? How efficient is the representation for this distinctness? It would be nice to be able to declare on a class (hierarchy) basis that all instances have one and only one unique identifier.
> 
> 
> -----Original Message-----
> From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com]
> Sent: Thursday, September 01, 2011 5:38 AM
> To: jena-users@incubator.apache.org
> Subject: RE: owl restriction question
> 
> Hi David,
> 
> If you want to represent each diagnosis as a class and not have a corresponding prototypical instance of the class then your best bet is to treat the class a "class of people with that diagnosis" rather than a class of diagnoses. So you would have something like:
> 
> :SET1 owl:unionOf (B1 C1) .
> 
> :p1 a B1 .
> :p2 a C1 .
> 
> :PatientSubset1 rdfs:subClassOf :Patient, :SET1 .
> 
> 
> If you want to have a :diagnosis property to relate an individual :Patient to a diagnosis then the each instance of the :diagnosis relation must be an individual (i.e. and instance of the diagnosis class). An expression like:
> 
>   :p1 :diagnosis :C1 .
> 
> is not legal in OWL 1 DL (it puts you into OWL/full which is OK for jena but doesn't give the entailments you are after). It is legal in OWL 2 DL thanks to punning but again the punning means you don't get the entailments you want.
> 
> If you *really* want a :diagnosis relation (rather than using the rdf:type relation between individual patients and the diagnosis class) and *really* don't want to use individuals like c1 in:
> 
>   :c1 a C1 .
>   :p1 :diagnosis :c1 .
> 
> Then I can think of only two options. One is to do exactly that but use bNodes to avoid having to predefine the prototypical instances:
> 
>    :p1 :diagnosis [a :C1] .
> 
> The other is to do your reasoning through custom rules.
> 
> Dave
> 
> 
> 
> On Tue, 2011-08-30 at 17:24 +0000, David Jordan wrote: 
> > In my application, there is an ontology defined with a hierarchy similar to the A, Bs, and Cs found in my original email (see below).
> > These happen to be ICD9 diagnosis codes, each represented by a CLASS, not an instance.
> > A Patient may have one or more associated diagnosis, so they would be associated with these diagnosis CLASSES.
> > 
> > Ideally, I can define one or more sets, which contain a list of particular diagnosis CLASSES.
> > Assume for discussion, I have one such set called :SET1.
> > For the patients, I want to see which patients have a diagnosis that is an element in SET1.
> > 
> > :PatientSubset1 rdfs:subClassOf :Patient ;
> > 	owl:equivalentClass [
> > 		a owl:Restriction ;
> > 		owl:onProperty :diagnosis ;
> > 		owl:someValuesFrom :SET1
> > 	] .
> > 
> > And I also want subclass relationships to apply, such that if SET1 
> > has :B1, and :C1 rdf:subClass :B1 And  there is the triple
> > :p1 rdf:type Patient ;
> > 	:diagnosis C1 .
> > 
> > Then since SET1 contains the class :B1, I would want :p1 to be in the result.
> > 
> > But I have been told that owl:someValuesFrom only works on instances, not classes.
> > But I need to restrict the set of Patients based on a property being a member of a set of classes.
> > Maybe there is some way of doing this with set intersection facilities, where the predicate asks whether the intersection of the patient's diagnosis and my particular set of diagnosis is empty or not, but that would not be as efficient as someValuesFrom, which can return true/false once the first match is found.
> > 
> > To summarize, I need to do this restriction on classes, but also have the classes take into account the subclass relationships.
> > Is there a way of doing this in OWL? In a way that will be efficient?
> > 
> > 
> > -----Original Message-----
> > From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com]
> > Sent: Monday, August 29, 2011 5:10 PM
> > To: jena-users@incubator.apache.org
> > Subject: Re: owl restriction question
> > 
> > On Mon, 2011-08-29 at 17:40 +0000, David Jordan wrote: 
> > > I have a question about accessing instances of a restriction class. Below I have a simple ontology, followed by some Jena Java code. My issue is that the class PatientSubset1 is reporting it has no instances. Can you see what I have done wrong?
> > 
> > There are at least a couple of problems here ...
> > 
> > > @prefix rdf:	<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> > > @prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
> > > @prefix owl:	<http://www.w3.org/2002/07/owl#> .
> > > @prefix : 	<http://example.org/ex1#> .
> > > 
> > > :A a owl:Class .
> > > 
> > > :B1 a owl:Class ;
> > > 	rdfs:subClassOf :A .
> > > 
> > > :B2 a owl:Class ;
> > > 	rdfs:subClassOf :A .
> > > 
> > > :C1 a owl:Class ;
> > > 	rdfs:subClassOf :B1 .
> > > 
> > > :C2 a owl:Class ;
> > > 	rdfs:subClassOf :B1 .
> > > 
> > > :C3 a owl:Class ;
> > > 	rdfs:subClassOf :B2 .
> > > 
> > > :C4 a owl:Class ;
> > > 	rdfs:subClassOf :B2 .
> > > 
> > > :b1 rdf:type :B1 .
> > > 
> > > :Set1 a owl:Class ;
> > > 	owl:distinctMembers (:b1) .
> > > 
> > > :Patient a owl:Class ;
> > > 	rdfs:label "Patient" .
> > > 
> > > :p1 rdf:type :Patient .
> > > :p2 rdf:type :Patient .
> > > :p3 rdf:type :Patient .
> > > 
> > > :p1 :diagnosis :B1 .
> > > :p2 :diagnosis :C1 .
> > 
> > The :diagnosis assertions should point to an instance, e.g. :b1, not the classes. 
> > 
> > > :PatientSubset1 rdfs:subClassOf :Patient ;
> > > 	a [
> > > 		a owl:Restriction ;
> > > 		owl:onProperty :diagnosis ;
> > > 		owl:someValuesFrom (:B1)
> > > 	] .
> > > 
> > > 
> > > 		OntModel omodel = ModelFactory.createOntologyModel();
> > 
> > If you want OWL inference then you need to specify an appropriate 
> > configuration such as OntModelSpec.OWL_MEM_MICRO_RULE_INF
> > 
> > Dave
> > 
> > 
> > > 		InputStream in = FileManager.get().open(fileName);
> > > 		omodel.read(in, baseName, "TURTLE");
> > > 		String fulluri = baseName + className;
> > > 		OntClass oclass = omodel.getOntClass(fulluri);
> > > 		System.out.println("Class is " + oclass.getURI()); System.out.flush();
> > > 		ExtendedIterator<? extends OntResource> iter = oclass.listInstances();
> > > 		while( iter.hasNext() ){
> > > 			OntResource res = iter.next();
> > > 			String uri = res.getURI();
> > > 			System.out.println(uri);
> > > 		}
> > > 
> > > Any ideas why this is not returning any instances? I would expect the resulting instances to include :p1 and :p2.
> > 
> > 
> > 
> > 
> > 
> 
> 
> 
> 





RE: owl restriction question

Posted by Dave Reynolds <da...@gmail.com>.
Hi David,

Why do you need to enforce that the diagnosis prototypical instances are
unique and distinct?

If all your reasoning is done by which class those instances are members
of then it actually doesn't matter whether you have one or more
instances. Indeed my bNode suggestion creates a new instance for each
diagnosis.

The basic answer is that owl:AllDifferent is horribly expensive in Jena,
at least with the default rule based reasoners. By the specs it entails
a quadratic set of owl:differentFrom assertions between pairs of
individuals. So if you have O(10^4) individuals in the AllDifferent then
rule closure will try to materialize O(10^8) differentFrom entailments.

It may be that other reasoners like Pellet have more optimized handling
of such cases. Certainly reasoning over large medical ontologies was one
of the driving forces behind the OWL profiles like EL and QL and the
associated specialized reasoners.

Dave


On Thu, 2011-09-01 at 13:08 +0000, David Jordan wrote: 
> Since our last correspondence, I have headed in the direction of having a singleton for each diagnosis class. I'll be looking for a way of declaring the singleton in a manner that enforces it to be the only instance, I have never seen examples for how to do that in OWL. Also, it is my understanding of the non-unique naming assumption that to force the reasoned to "know" that each of these singleton instances is different from one another, I have to use some like the following:
> 
> [a owl:AllDifferent ;
> 	owl:distinctMembers (:a :b1 :b2 :c1 :c2 :c3 :c4)].
> 
> In my real application (which uses ICD9 codes instead of these toy A, Bs, and Cs), there are tens of thousands of classes and thus singletons. Will Jena be able to handle a list of instances that has this large a cardinality? How efficient is the representation for this distinctness? It would be nice to be able to declare on a class (hierarchy) basis that all instances have one and only one unique identifier.
> 
> 
> -----Original Message-----
> From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com] 
> Sent: Thursday, September 01, 2011 5:38 AM
> To: jena-users@incubator.apache.org
> Subject: RE: owl restriction question
> 
> Hi David,
> 
> If you want to represent each diagnosis as a class and not have a corresponding prototypical instance of the class then your best bet is to treat the class a "class of people with that diagnosis" rather than a class of diagnoses. So you would have something like:
> 
> :SET1 owl:unionOf (B1 C1) .
> 
> :p1 a B1 .
> :p2 a C1 .
> 
> :PatientSubset1 rdfs:subClassOf :Patient, :SET1 .
> 
> 
> If you want to have a :diagnosis property to relate an individual :Patient to a diagnosis then the each instance of the :diagnosis relation must be an individual (i.e. and instance of the diagnosis class). An expression like:
> 
>   :p1 :diagnosis :C1 .
> 
> is not legal in OWL 1 DL (it puts you into OWL/full which is OK for jena but doesn't give the entailments you are after). It is legal in OWL 2 DL thanks to punning but again the punning means you don't get the entailments you want.
> 
> If you *really* want a :diagnosis relation (rather than using the rdf:type relation between individual patients and the diagnosis class) and *really* don't want to use individuals like c1 in:
> 
>   :c1 a C1 .
>   :p1 :diagnosis :c1 .
> 
> Then I can think of only two options. One is to do exactly that but use bNodes to avoid having to predefine the prototypical instances:
> 
>    :p1 :diagnosis [a :C1] .
> 
> The other is to do your reasoning through custom rules.
> 
> Dave
> 
> 
> 
> On Tue, 2011-08-30 at 17:24 +0000, David Jordan wrote: 
> > In my application, there is an ontology defined with a hierarchy similar to the A, Bs, and Cs found in my original email (see below).
> > These happen to be ICD9 diagnosis codes, each represented by a CLASS, not an instance.
> > A Patient may have one or more associated diagnosis, so they would be associated with these diagnosis CLASSES.
> > 
> > Ideally, I can define one or more sets, which contain a list of particular diagnosis CLASSES.
> > Assume for discussion, I have one such set called :SET1.
> > For the patients, I want to see which patients have a diagnosis that is an element in SET1.
> > 
> > :PatientSubset1 rdfs:subClassOf :Patient ;
> > 	owl:equivalentClass [
> > 		a owl:Restriction ;
> > 		owl:onProperty :diagnosis ;
> > 		owl:someValuesFrom :SET1
> > 	] .
> > 
> > And I also want subclass relationships to apply, such that if SET1 has 
> > :B1, and :C1 rdf:subClass :B1 And  there is the triple
> > :p1 rdf:type Patient ;
> > 	:diagnosis C1 .
> > 
> > Then since SET1 contains the class :B1, I would want :p1 to be in the result.
> > 
> > But I have been told that owl:someValuesFrom only works on instances, not classes.
> > But I need to restrict the set of Patients based on a property being a member of a set of classes.
> > Maybe there is some way of doing this with set intersection facilities, where the predicate asks whether the intersection of the patient's diagnosis and my particular set of diagnosis is empty or not, but that would not be as efficient as someValuesFrom, which can return true/false once the first match is found.
> > 
> > To summarize, I need to do this restriction on classes, but also have the classes take into account the subclass relationships.
> > Is there a way of doing this in OWL? In a way that will be efficient?
> > 
> > 
> > -----Original Message-----
> > From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com]
> > Sent: Monday, August 29, 2011 5:10 PM
> > To: jena-users@incubator.apache.org
> > Subject: Re: owl restriction question
> > 
> > On Mon, 2011-08-29 at 17:40 +0000, David Jordan wrote: 
> > > I have a question about accessing instances of a restriction class. Below I have a simple ontology, followed by some Jena Java code. My issue is that the class PatientSubset1 is reporting it has no instances. Can you see what I have done wrong?
> > 
> > There are at least a couple of problems here ...
> > 
> > > @prefix rdf:	<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> > > @prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
> > > @prefix owl:	<http://www.w3.org/2002/07/owl#> .
> > > @prefix : 	<http://example.org/ex1#> .
> > > 
> > > :A a owl:Class .
> > > 
> > > :B1 a owl:Class ;
> > > 	rdfs:subClassOf :A .
> > > 
> > > :B2 a owl:Class ;
> > > 	rdfs:subClassOf :A .
> > > 
> > > :C1 a owl:Class ;
> > > 	rdfs:subClassOf :B1 .
> > > 
> > > :C2 a owl:Class ;
> > > 	rdfs:subClassOf :B1 .
> > > 
> > > :C3 a owl:Class ;
> > > 	rdfs:subClassOf :B2 .
> > > 
> > > :C4 a owl:Class ;
> > > 	rdfs:subClassOf :B2 .
> > > 
> > > :b1 rdf:type :B1 .
> > > 
> > > :Set1 a owl:Class ;
> > > 	owl:distinctMembers (:b1) .
> > > 
> > > :Patient a owl:Class ;
> > > 	rdfs:label "Patient" .
> > > 
> > > :p1 rdf:type :Patient .
> > > :p2 rdf:type :Patient .
> > > :p3 rdf:type :Patient .
> > > 
> > > :p1 :diagnosis :B1 .
> > > :p2 :diagnosis :C1 .
> > 
> > The :diagnosis assertions should point to an instance, e.g. :b1, not the classes. 
> > 
> > > :PatientSubset1 rdfs:subClassOf :Patient ;
> > > 	a [
> > > 		a owl:Restriction ;
> > > 		owl:onProperty :diagnosis ;
> > > 		owl:someValuesFrom (:B1)
> > > 	] .
> > > 
> > > 
> > > 		OntModel omodel = ModelFactory.createOntologyModel();
> > 
> > If you want OWL inference then you need to specify an appropriate 
> > configuration such as OntModelSpec.OWL_MEM_MICRO_RULE_INF
> > 
> > Dave
> > 
> > 
> > > 		InputStream in = FileManager.get().open(fileName);
> > > 		omodel.read(in, baseName, "TURTLE");
> > > 		String fulluri = baseName + className;
> > > 		OntClass oclass = omodel.getOntClass(fulluri);
> > > 		System.out.println("Class is " + oclass.getURI()); System.out.flush();
> > > 		ExtendedIterator<? extends OntResource> iter = oclass.listInstances();
> > > 		while( iter.hasNext() ){
> > > 			OntResource res = iter.next();
> > > 			String uri = res.getURI();
> > > 			System.out.println(uri);
> > > 		}
> > > 
> > > Any ideas why this is not returning any instances? I would expect the resulting instances to include :p1 and :p2.
> > 
> > 
> > 
> > 
> > 
> 
> 
> 
> 




RE: owl restriction question

Posted by David Jordan <Da...@sas.com>.
Since our last correspondence, I have headed in the direction of having a singleton for each diagnosis class. I'll be looking for a way of declaring the singleton in a manner that enforces it to be the only instance, I have never seen examples for how to do that in OWL. Also, it is my understanding of the non-unique naming assumption that to force the reasoned to "know" that each of these singleton instances is different from one another, I have to use some like the following:

[a owl:AllDifferent ;
	owl:distinctMembers (:a :b1 :b2 :c1 :c2 :c3 :c4)].

In my real application (which uses ICD9 codes instead of these toy A, Bs, and Cs), there are tens of thousands of classes and thus singletons. Will Jena be able to handle a list of instances that has this large a cardinality? How efficient is the representation for this distinctness? It would be nice to be able to declare on a class (hierarchy) basis that all instances have one and only one unique identifier.


-----Original Message-----
From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com] 
Sent: Thursday, September 01, 2011 5:38 AM
To: jena-users@incubator.apache.org
Subject: RE: owl restriction question

Hi David,

If you want to represent each diagnosis as a class and not have a corresponding prototypical instance of the class then your best bet is to treat the class a "class of people with that diagnosis" rather than a class of diagnoses. So you would have something like:

:SET1 owl:unionOf (B1 C1) .

:p1 a B1 .
:p2 a C1 .

:PatientSubset1 rdfs:subClassOf :Patient, :SET1 .


If you want to have a :diagnosis property to relate an individual :Patient to a diagnosis then the each instance of the :diagnosis relation must be an individual (i.e. and instance of the diagnosis class). An expression like:

  :p1 :diagnosis :C1 .

is not legal in OWL 1 DL (it puts you into OWL/full which is OK for jena but doesn't give the entailments you are after). It is legal in OWL 2 DL thanks to punning but again the punning means you don't get the entailments you want.

If you *really* want a :diagnosis relation (rather than using the rdf:type relation between individual patients and the diagnosis class) and *really* don't want to use individuals like c1 in:

  :c1 a C1 .
  :p1 :diagnosis :c1 .

Then I can think of only two options. One is to do exactly that but use bNodes to avoid having to predefine the prototypical instances:

   :p1 :diagnosis [a :C1] .

The other is to do your reasoning through custom rules.

Dave



On Tue, 2011-08-30 at 17:24 +0000, David Jordan wrote: 
> In my application, there is an ontology defined with a hierarchy similar to the A, Bs, and Cs found in my original email (see below).
> These happen to be ICD9 diagnosis codes, each represented by a CLASS, not an instance.
> A Patient may have one or more associated diagnosis, so they would be associated with these diagnosis CLASSES.
> 
> Ideally, I can define one or more sets, which contain a list of particular diagnosis CLASSES.
> Assume for discussion, I have one such set called :SET1.
> For the patients, I want to see which patients have a diagnosis that is an element in SET1.
> 
> :PatientSubset1 rdfs:subClassOf :Patient ;
> 	owl:equivalentClass [
> 		a owl:Restriction ;
> 		owl:onProperty :diagnosis ;
> 		owl:someValuesFrom :SET1
> 	] .
> 
> And I also want subclass relationships to apply, such that if SET1 has 
> :B1, and :C1 rdf:subClass :B1 And  there is the triple
> :p1 rdf:type Patient ;
> 	:diagnosis C1 .
> 
> Then since SET1 contains the class :B1, I would want :p1 to be in the result.
> 
> But I have been told that owl:someValuesFrom only works on instances, not classes.
> But I need to restrict the set of Patients based on a property being a member of a set of classes.
> Maybe there is some way of doing this with set intersection facilities, where the predicate asks whether the intersection of the patient's diagnosis and my particular set of diagnosis is empty or not, but that would not be as efficient as someValuesFrom, which can return true/false once the first match is found.
> 
> To summarize, I need to do this restriction on classes, but also have the classes take into account the subclass relationships.
> Is there a way of doing this in OWL? In a way that will be efficient?
> 
> 
> -----Original Message-----
> From: Dave Reynolds [mailto:dave.e.reynolds@gmail.com]
> Sent: Monday, August 29, 2011 5:10 PM
> To: jena-users@incubator.apache.org
> Subject: Re: owl restriction question
> 
> On Mon, 2011-08-29 at 17:40 +0000, David Jordan wrote: 
> > I have a question about accessing instances of a restriction class. Below I have a simple ontology, followed by some Jena Java code. My issue is that the class PatientSubset1 is reporting it has no instances. Can you see what I have done wrong?
> 
> There are at least a couple of problems here ...
> 
> > @prefix rdf:	<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> > @prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
> > @prefix owl:	<http://www.w3.org/2002/07/owl#> .
> > @prefix : 	<http://example.org/ex1#> .
> > 
> > :A a owl:Class .
> > 
> > :B1 a owl:Class ;
> > 	rdfs:subClassOf :A .
> > 
> > :B2 a owl:Class ;
> > 	rdfs:subClassOf :A .
> > 
> > :C1 a owl:Class ;
> > 	rdfs:subClassOf :B1 .
> > 
> > :C2 a owl:Class ;
> > 	rdfs:subClassOf :B1 .
> > 
> > :C3 a owl:Class ;
> > 	rdfs:subClassOf :B2 .
> > 
> > :C4 a owl:Class ;
> > 	rdfs:subClassOf :B2 .
> > 
> > :b1 rdf:type :B1 .
> > 
> > :Set1 a owl:Class ;
> > 	owl:distinctMembers (:b1) .
> > 
> > :Patient a owl:Class ;
> > 	rdfs:label "Patient" .
> > 
> > :p1 rdf:type :Patient .
> > :p2 rdf:type :Patient .
> > :p3 rdf:type :Patient .
> > 
> > :p1 :diagnosis :B1 .
> > :p2 :diagnosis :C1 .
> 
> The :diagnosis assertions should point to an instance, e.g. :b1, not the classes. 
> 
> > :PatientSubset1 rdfs:subClassOf :Patient ;
> > 	a [
> > 		a owl:Restriction ;
> > 		owl:onProperty :diagnosis ;
> > 		owl:someValuesFrom (:B1)
> > 	] .
> > 
> > 
> > 		OntModel omodel = ModelFactory.createOntologyModel();
> 
> If you want OWL inference then you need to specify an appropriate 
> configuration such as OntModelSpec.OWL_MEM_MICRO_RULE_INF
> 
> Dave
> 
> 
> > 		InputStream in = FileManager.get().open(fileName);
> > 		omodel.read(in, baseName, "TURTLE");
> > 		String fulluri = baseName + className;
> > 		OntClass oclass = omodel.getOntClass(fulluri);
> > 		System.out.println("Class is " + oclass.getURI()); System.out.flush();
> > 		ExtendedIterator<? extends OntResource> iter = oclass.listInstances();
> > 		while( iter.hasNext() ){
> > 			OntResource res = iter.next();
> > 			String uri = res.getURI();
> > 			System.out.println(uri);
> > 		}
> > 
> > Any ideas why this is not returning any instances? I would expect the resulting instances to include :p1 and :p2.
> 
> 
> 
> 
>