Thanks, I already went down the path of defining a "singleton" for each class.
-----Original Message----- From: Dave Reynolds [mailto:[email protected]] Sent: Thursday, September 01, 2011 10:19 AM To: [email protected] 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:[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. > > > > > > > > > > > > > >
