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:[email protected]]
Sent: Thursday, September 01, 2011 5:38 AM
To: [email protected]
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:[email protected]]
> Sent: Monday, August 29, 2011 5:10 PM
> To: [email protected]
> 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.
>
>
>
>
>